-
1 文档
-
2 PPT
Matlab为用户提供了有关函数功能和数值分析的函数,帮助用户解决一些函数的极值、积分、微分等问题。
1. 函数的表示
函数除了前面已学习的M文件形式表示外,还可以用内联函数和匿名函数形式表示。由于内联将在未来的版本中删除,下面简介匿名函数(Anonymous Functions)。匿名函数是未存储在程序文件中的函数,但与数据类型为函数句柄变量相关联。匿名函数可以接受输入和返回输出,就像标准的函数一样。但它可以只包含一个可执行语句。例如:
>> sqr = @(x) x.^2;
>> sqr(3)
ans =
9
>> a=1;b=2;c=3;
>> parabola = @(x) a*x.^2 + b*x + c;
>> parabola(2)
ans =
11
2. 函数的绘图
函数的绘图函数包括:ezplot(二维函数绘图)、ezcontour (等高线绘图)ezplot3(三维函数绘图)、ezpolar(极坐标函数绘图)、ezmesh(三维网格绘图)、fplot(绘图函数)等,这些函数用法简单相似,其中fplot绘图细致,并确保在输出的图形中表示出所有的奇异点。ezplot是用于绘制单变量函数图的简便命令。
![]()
>> f = @(x)2*exp(-x).*sin(x);
>> fplot(f,[0 8]) ;
>> ezplot(f,[0 8]);

图4-6应用fplot函数绘图 图4-7 应用ezplot函数绘图
![]()
求函数的最小值、零点是工程上常见问题,Matlab提供了这类函数。
1. 求一元函数最小值
求一元函数在给定区间内的最小值可以用函数fminbnd()来实现。格式如下:
x=fminbnd(fun ,x1,x2)
x=fminbnd(fun ,x1,x2, options)
[x,fval]=fminbnd(……)
说明:在区间[x1 x2]内寻找函数最小值。fun为M文件的函数句柄或匿名函数,x为对应最小值的自变量取值,使用options选项来指定优化器的参数。输出变量fval返回函数最小值。注意:函数fminbnd只能用于连续函数,只给出局部最小值,当最小值在指定区间的边界上时,函数收敛速度很慢。fminbnd只用于实数变量。
[例4-19]求正弦函数在[0 10]区间内的最小值。
>> fminbnd(@sin,0,10) %计算sin(4.7124)验证
ans =
4.7124
结果等于4.7124,即3*pi/2。函数可以使用optimset来设定函数参数。
>> fminbnd(@sin,0,10,optimset('Display','iter'))
Func-count x f(x) Procedure
1 3.81966 -0.627289 initial
2 6.18034 -0.102664 golden
3 2.36068 0.703928 golden
4 4.62594 -0.996266 parabolic
5 4.74595 -0.999437 parabolic
6 4.71433 -0.999998 parabolic
7 4.71238 -1 parabolic
8 4.71242 -1 parabolic
9 4.71235 -1 parabolic
优化已终止:
当前的x 满足使用 1.000000e-04 的 OPTIONS.TolX 的终止条件。
ans =
4.7124
2. 求多元函数最小值
求多元函数最小值可以用函数fminsearch()来实现。使用该函数时必须指定初始x0,并返回它附近的局部最小值。格式如下:
x=fminbnd(fun ,x0, options)
x=fminbnd(fun ,x0, options)
[x,fval]=fminbnd(……)
说明:在初值x0附近寻找函数最小值。fun为M文件的函数句柄或匿名函数,x为对应最小值的自变量取值。使用options选项来指定优化器的参数。输出变量fval返回函数最小值。

![]()

(1)首先定义函数。
function f = myfun(x,a)
f = x(1)^2 + a*x(2)^2;
(2)然后执行如下命令。
>> a = 1.5;
>> x = fminsearch(@(x) myfun(x,a),[0,1])
x =
1.0e-03 *
0.9298 0.0312
或执行如下命令。
>> a = 1.5;
>> f =@(x)( x(1)^2 + a*x(2)^2);
>> x = fminsearch(f,[0,1])
x =
1.0e-03 *
0.9298 0.0312
3.求一元函数的零点
求一元函数的零点可以用函数fzero()来实现。格式如下:
x=fzero (fun ,x0)
x=fzero (fun ,[x0,x1])
x=fzero (fun ,[x0,x1],options)
[x,fval]=fzero (……)
说明:只给出x0,表示在x0附近寻找函数的零点,给出[x0,x1]区间,表示在区间内寻找函数的零点,返回对应零点的自变量值。使用options选项来指定优化器的参数,输出变量fval返回函数值。fzero只能返回一个局部零点。
例如:
>> x=fzero(@cos,2)
x =
1.5708
>> [x,y]=fzero(@cos,-1)
x =
-1.5708
y =
6.1232e-17
以上三个函数都可以使用options选项,options可以使用函数optimset设定。options=optimset('param1',value1,'param2',value2, ……)用参数名及其对应的参数值设定优化器的参数。返回值options是结构体数据。
Matlab提供了quad、quadl、trapz、dblquad函数来计算函数的数值积分。数值积分方法实际上是计算函数曲线下的面积。quad函数应用的是自适应递归辛普森(Simpson)方法求定积分,用于低阶数值积分;quadl函数采用比前者阶数更高的自适应定积分算法,采用了洛巴托(Lobatto)积分计算法则。quadl比quad计算精度高。trapz采用计算若干梯形面积和来计算函数的近似积分。dblquad是求双重积分函数。下面举例说明函数的使用。
函数的微分也是进行科学计算的重要组成部分,Matlab提供了diff函数可以分别实现函数的一阶微分与n阶微分的计算。
在Matlab中还可以应用gradient函数来计算梯度。

>> f=@(x)sin(x)./x
f =
@(x)sin(x)./x
>> q=quad(f,0,pi)
q =
1.8519

>> q=quadl(@(x)2./(1+x.^2),-1,1)
q =
3.1416

>> f=@(x)3.*x.^2-1;
>> x=[2 4]; y=f(x);
>> trapz(x,y)
ans =
58

>>s=dblquad('y*sin(x)+x*cos(y)',pi,2*pi,0,pi)
s =
-9.8696

>> x=0:0.01:3; y=exp(x);
>> x1=x(1:length(x)-1);
>> y1=diff(y)./diff(x);

a=-2:0.2:2;
[x,y]=meshgrid(a);
z=exp(-(x.^2+y.^2+0.5*x.*y));
[px,py]=gradient(z,0.2); %梯度场
quiver(a,a,px,py); %画出梯度场

图4-8 梯度场
程序结果如图4-8所示,图中箭头的方向代表梯度的方向,箭头的大小代表梯度的模。

