|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1 k" }7 T6 d& u7 P, k4 A问题8 U/ E1 y, |2 p0 E- ]2 A$ c5 F
自定义一个函数,求给定复数的指数、对数、正弦和余弦,并在命令文件中调用该函数。
& J( z9 [* I6 G E# y自定义一个函数,计算一行向量中各元素的均值和标准差。
/ M3 I, Y m: Q& P6 a8 M求下列方程的根:$ L( V" O' Q9 R, X h9 b/ A8 ?
% y& A# W0 Q/ ]$ \7 s1 ^7 n
/ o. @6 @1 m t- E+ z
! |, a" `) N% q: t2 a T分析与解答:) Z# b7 D- D9 w1 @4 ^/ c
1.实验过程:创建m文件,保存到桌面,重命名位fushu,此时我就创建了一个函数,然后再新建一个m文件作为我们命令文件,实现输入复数并调用函数的功能,然后运行之后,在matlab命令行窗口即可执行
5 E+ X3 ]; B! m: B8 V7 l# D: q: {) T7 w" D) ^' W% z
实验结果:
3 E& v) y9 f) f# e8 _
4 ^9 ]9 e5 }2 P( w$ a u7 F f( W! P6 W) c0 b- ~) d, d
7 T0 k& j0 |4 v. x5 N& t& X2.实验过程:
: H+ o5 ]0 N# d3 {9 w0 j$ l i$ |函数文件:
4 R5 K) o* ?! T8 @, R" Z! O
+ ]; Z0 P& a( Z# H0 d3 F g- function output=way(x)
- n=length(x);
- sum=0;
- for i=1:n
- sum=sum+x(i);
- i=i+1;
- end
- avg=sum/n;
- b=0;
- for i=1:n
- b=b+(x(i)-avg)^2;
- std1=sqrt(b/n);
- end
- fprintf('avg=%f\n',avg);
- fprintf('std=%f\n',std1);
+ j3 R, K& {7 s2 o% Z2 s* H" b7 h 4 t# b8 i7 w: @( ^& _' ~# O
" i* ~+ {' O2 O
命令文件:
: F4 n0 n1 K1 N, Q; K5 [% e
* A) u$ H9 n/ N, L0 o- x=input('x=?');
- way(x);9 W: [( ?, j/ q4 L2 w
1 D( D j7 r. ?( ~* L
" g8 k; x$ ]1 H( q7 Z) F& x命令文件保存后运行,然后在命令行窗口输入一个向量& S& v2 H. J1 C' Q/ F( a
1 K8 [- T2 r' w) f \. o( W* Q
实验结果:
0 o/ A8 H) j/ b9 Q6 a& z6 R4 f4 o# s! \0 S, M, c+ G
- x=?0:5
- avg=2.500000
- std=1.7078253 G3 S2 r8 R/ V) y) t" p7 Z% U
4 g' E3 }2 k( s/ A# R
" Y$ y, a% m5 j7 x: O$ a, p
3.直接在命令行窗口执行即可8 i. O$ j% \6 H
5 f9 ^$ K' L7 o5 g% ?* w4 o( b
4 j" H7 `; Y. ~! ~% h过程及结果
+ \' f7 F( ^4 ?! [1 \( M
7 }; T% i7 o5 ]& [* B/ [# O: g- >> f=@(x)exp(x)+x^2+x^(sqrt(x))-100;
- >> x0=fzero(f,3)
- x0 =
- 4.1635
- >> f(x0)
- ans =
- 2.8422e-14
- * @0 X3 X3 h& [
4 a% f) M8 k, D+ m2 I) y' x( ~8 T2 D1 T+ M/ l |+ @6 P3 V, T2 V
其中fzero(f,a)的意思是在a旁边找一个最接近a的点x使f(x)最接近于零
( x" H* ~ `2 k& ^6 M7 o7 `) h2 X- t: y' q
总结与心得
# x* e& O/ p8 z W7 K, r
; k% s/ N- I) ~" B1 VMatlab自定义函数的方法:
5 ^, t: ^/ o/ g6 \1.函数文件+调用命令文件:需单独定义一个自定义函数的M文件;0 h, M! y5 o; o+ @7 t: X
2.直接通过@符号定义.如:f=@(x,y)(x.^2-sin(y)),调用:f(2,3). o4 Q3 T- x4 ^ _% o' A& u2 i
函数句柄变量f相当于函数的别名,利用它可以间接调用函数
" L) R2 S" l# g9 Y: F# X7 S; \7 V0 f5 \8 N1 D6 f) E. ?
Matlab的函数中变量的传递, N3 T' c3 Q) Q
1. 函数所传递参数的数目具有可调性
" ~3 x( q. i- d6 M0 Y
# L. k; d7 u% {/ f% ~& M) b- 例子:
- function [mag, angle] = polar_value(x, y)
- msg = nargchk(1,2,nargin);
- //nargin 这个函数返回调用这个函数时所需要的实际输入参数的个数
- //实际输入参数的个数必须≥1而且≤2,如果一个函数在被调用时含有过
- //多或过少的参数,函数nargchk 将会产生一个包含标准错误的字符串
- //如果参数的个数在允许的范围之内,那么这个函数将返回一个空字符
- error(msg);
- //如果msg 是一个包含错误信息的字符串,error函数执行,它将会中止当
- //前函数并返回到键盘输入状态,在命令窗中显示出错误信息
- //如果这个信息字符中为空,error 函数将什么也不做,当前函数继续执行
- if nargin < 2
- y = 0;
- end
- if x == 0 & y == 0
- msg = 'Both x and y are zero: angle is meaningless!';
- warning(msg);
- //显示警告信息并继续执行函数,如果参数错误不是致命的,执行还能继续,则这个将会被调用。
- end
- mag = sqrt(x .^2 + y .^2);//极坐标的矢径
- if nargout == 2
- angle = atan2(y,x) * 180/pi;//极角
- end
- S9 g' i. J. |! M2 ~ 0 Y( |7 F2 h1 H; t: ` M
% Y7 B, W4 W6 E
2. maltab 程序与它们函数之间的交互用是按值传递机制。当一个函数调用发生时,matlab将会复制实参生成一个副本,然后把它们传递给函数。它意味着虽然函数修改了输入参数,但它并没有影响到调用者的原值。, L2 J1 q! `/ H. h2 K+ P
+ H. A0 p% {% U9 o& a9 G( z* Z5 b$ UMatlab的匿名函数、子函数和嵌套函数。
# _* J- V5 ?- g. t* y' ^9 |匿名函数定义. R z: C/ _5 S4 q* p* A
fhandle = @(arglist) expr, N) {, ~( j5 H* O
其中,expr是具体的函数表达式,arglist是指定的函数的自变量。
8 |/ J5 p% {% R7 M
3 R" ?% V8 [! [5 H" |子函数是在同一函数文件中,主函数之后的由“function”引导的函数,一个函数文件可以有多个子函数。这些子函数在函数文件中的排列顺序可以随意,前提是都要位于主函数后
7 c, D! n7 S# w/ [: o
( _ X1 R3 J$ v3 a( j9 m嵌套函数,即nested function,顾名思义,是嵌套在函数体内部的函数。嵌套函数以function 声明,结束的时候加上end& Y5 E* }& _( P5 L4 Q2 P
. [4 P, M* v/ ?
& e" l9 q2 V7 v( ~) y* {
|
|