|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1 j7 q+ F7 R3 e0 ^( X5 ^& b' q
问题& H3 s- X& z' ^8 m7 t/ H
自定义一个函数,求给定复数的指数、对数、正弦和余弦,并在命令文件中调用该函数。" Z3 C6 q8 Y) d7 i
自定义一个函数,计算一行向量中各元素的均值和标准差。
: R* L; ]3 v$ d1 i5 a求下列方程的根:
3 ?* B6 P! I" W8 ^1 Y" |
: K; U2 C L) Y8 V' U. _
- v4 `" [2 W; K3 @' F
7 h3 M+ Z; F7 B2 h分析与解答:
0 }' ^8 |' y0 h& H9 n4 d; L# I, K1.实验过程:创建m文件,保存到桌面,重命名位fushu,此时我就创建了一个函数,然后再新建一个m文件作为我们命令文件,实现输入复数并调用函数的功能,然后运行之后,在matlab命令行窗口即可执行
' {- {+ `8 G% M4 H2 e
" ?' q7 X( o$ ]! D- K0 N+ M实验结果:- n: F0 ?7 Y" Q9 v& Q1 B3 b
6 e* c6 M3 z4 s" p, ]6 _* k
# M8 j: t' i" ?* |* ~: l! k2 n/ x3 y$ a3 l
2.实验过程:1 z9 L% Y5 h- I+ ^- ^0 Z
函数文件:
8 c E; |, d: Q* V* X$ Z9 `9 y3 t7 l# k. ?2 ]0 y
- 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);4 r5 I9 t0 g3 S1 F7 c s# b g
0 N" ~/ m* C' M
5 m8 J( R! q9 o, F) K
命令文件:
" B% N6 w; Y$ l/ G$ m3 U5 V' ]
* A/ J- P2 a) j; V- x=input('x=?');
- way(x);
" e5 }5 Q0 J6 C+ v
% Q( B! p) s. G1 b& q3 a2 G+ ?2 d/ B" O/ k. x% O9 ^! N
命令文件保存后运行,然后在命令行窗口输入一个向量
! |7 d1 r2 V( j/ \- @9 L6 o" O0 W$ R. z. |0 S# t0 U
实验结果:
; u, o: }" i( |9 @5 R. M1 ~& G+ t; m' P' V7 A j! }
- x=?0:5
- avg=2.500000
- std=1.707825
$ C. V u w; y6 y" L 4 L- \ s- E! N! W! M3 N
0 j8 x2 j' W3 f. x9 X3.直接在命令行窗口执行即可$ V: j: L8 y' z+ G. q* h& K
* h, n" Q9 L+ X2 E
/ w% P0 V. M1 d3 x过程及结果& `; }1 n" }- y; u8 l5 p4 t# A/ e
+ B) ^+ N) D+ R5 F
- >> f=@(x)exp(x)+x^2+x^(sqrt(x))-100;
- >> x0=fzero(f,3)
- x0 =
- 4.1635
- >> f(x0)
- ans =
- 2.8422e-14
- 3 V6 D* c0 c: d
6 O. W9 v+ w8 O- }0 k5 `
4 b! M: w8 X7 H
其中fzero(f,a)的意思是在a旁边找一个最接近a的点x使f(x)最接近于零- K6 p6 j: N7 I5 W7 x% {4 }
. v$ s2 o7 P+ A0 B+ {) X: k
总结与心得' }" N! @% B+ T4 q8 i
" j. R7 F5 L) i' E9 p# ?) m$ bMatlab自定义函数的方法:
* x4 W7 k5 G! q" `8 n8 O1.函数文件+调用命令文件:需单独定义一个自定义函数的M文件;; b2 q, B; U: a- M0 P" M0 v
2.直接通过@符号定义.如:f=@(x,y)(x.^2-sin(y)),调用:f(2,3)
- m1 b' N. G9 h1 F% P函数句柄变量f相当于函数的别名,利用它可以间接调用函数1 u) X* @6 B/ E
4 z2 P2 Q% Y y( N! F; c# M
Matlab的函数中变量的传递
8 i) T+ e; k, V1. 函数所传递参数的数目具有可调性% P1 u* Y5 A, |- A5 f) L% Y
u1 [! `: U1 Y" d2 u- 例子:
- 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( U ^+ q/ Q% n% V9 [
N9 O; J/ |" O4 Z
$ B) t( y" Q! q, r+ {% R
2. maltab 程序与它们函数之间的交互用是按值传递机制。当一个函数调用发生时,matlab将会复制实参生成一个副本,然后把它们传递给函数。它意味着虽然函数修改了输入参数,但它并没有影响到调用者的原值。
. O( _/ X. K1 {- f/ S* b$ u8 o, G9 |+ r
6 b$ l2 @$ l2 LMatlab的匿名函数、子函数和嵌套函数。
, g' S" v; V" s/ q' }匿名函数定义0 `) `* ?* `5 y
fhandle = @(arglist) expr& {+ m1 H' c' H5 D9 ~, O
其中,expr是具体的函数表达式,arglist是指定的函数的自变量。% j1 V' P6 y* \9 h3 k
6 `* G4 ^& J5 B+ V+ N6 m$ P9 s
子函数是在同一函数文件中,主函数之后的由“function”引导的函数,一个函数文件可以有多个子函数。这些子函数在函数文件中的排列顺序可以随意,前提是都要位于主函数后
: U& I+ e- j) h5 ?- T! r9 P) H: _% V$ ]9 Z5 c* K
嵌套函数,即nested function,顾名思义,是嵌套在函数体内部的函数。嵌套函数以function 声明,结束的时候加上end
+ @+ Q- P+ d7 V x" q! z* d
- x! @5 ^$ m4 ^" Q! G
% X8 s+ j' X* K* u: O- b |
|