MatLab讲义 2002年9月版
64.1667 poles = -2.0000 -1.0000 -0.5000 ki =
10 5
上面的结果说明了这个问题:
432
10(s+4s+5s+6s+7) -6.6667 -60.0000 64.16667
= + + + 10s + 5
(s+2)(s+1)(s+0.5) s+2 s+1 s+0.5
▲polyfit(x,y,n)函数,用于n次多项式来拟合该函数,n的次数越高,拟合就越好。 例:用三次多项式来拟合指数函数。
x=0:0.1:5;y=exp(x);n=3;p=polyfit(x,y,n); f=polyval(p,x);plot(x,y,‘b‘,x,f,‘r—?)
例:x=1:5;y=[5.5 43.1 128 290.7 498.4]
p=polyfit(x,y,3)
x1=1:0.1:5; y1=polyval(p,x1) plot(x,y,‘o‘,x1,y1);grid on
▲多项式函数
函数名称 功能简介 conv(a,b) 乘法 [q,r]=deconv(a,b) 除法 poly(r) 用根构造多项式 polyder(a) 对多项式或有理多项式求导 polyfit(x,y,n) 多项式数据拟合 polyval(p,x) 计算x点处多项式值 [r,p,k]=residue(a,b) 部分分式展开式 [a,b]=residue(r,p,k) 部分分式组合 roots(a) 求多项式的根
5.2 泛函分析--非线性数值方法函数
MATLAB提供了一些有关积分、常微分方程求解等方面的许多泛函(可对函数进行操作的函数),如找出函数在区间上的极小值、求函数的零值点、计算函数积分等。 优 化 与 求 根 fzero 单变量函数的零点(即方程之根) fmin 单变量函数的最小化 fmins 多变量函数的最小化 数 值 积 分 和 微 分 limit 求极限 quad,quad8 计算积分 dblquad 计算双重积分 diff 计算微分 常 微 分 方 程 求 解 odefile 为ODE求解器定义微分方程问题 ode45,ode23,ode113,ode15求微分方程 s 41
MatLab讲义 2002年9月版 ode23s,ode23t,ode23tb 1.函数在MATLAB中的表示 例:(humps.m)函数
1 1
f(x)= + -6 22
(x-0.3)+0.01 (x-0.9)+0.04
表示:
function y=humps(x)
y=1/((x-0.3).^2+0.01)+1/((x-0.9).^2+0.04)-6
2.数学函数的绘图
fplot函数可绘制出指定函数的图形,它可以指定函数自变量和函数值的范围,还可以在同一张图上绘制出多个图形。
fplot(‘f’,区间)可以指定函数自变量和函数值的范围。 fplot(‘humps’,[-5 5])
fplot(‘humps’,[-5 5 0 25])
fplot(‘[5*sin(x),humps(x)]’,[-1 1]) 3.函数极小值点和零值点
fmin函数用于求出指定单变量函数在特定区间上的极小点,格式为:fmin(函数名,始值,终值) 例:x=fmin(‘humps’,0.3,1);humps(x);
3
例:计算函数f(x)=x-2x-5 在(0,2)区间上的最小值点. funtion y=fun1(x) y=x^3-2*x-5
x=fmin’fun1’,0,2 x=
0.8165
函数在这一点的极小值为: y=fun1(x) y=
-6.0887
fmins函数用于求出多变量函数的极小值点。
格式:x=fmins(‘fun’,x0) %可在x0附近得到函数fun的局部最小点; x=fmins(‘fun’,x0,options) %可采用指定的选项;
x=fmins(‘fun’,x0,option,[],p1,p2,...)%可将参数p1,p2,...传递给函数fun; [x,options]=fmins(...) %可在options(10)中得到采用的计算步骤。
22
例:求函数f(x)=100(x2-x1^2)+(1-x1) 的最小值,起始点在(-1,2.1) function f=banana(x)
f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
[x,out]=fmins(‘banana’,[-1,2.1]) x=
1.0000 1.0000 out(10) ans= 165 最小值
42
MatLab讲义 2002年9月版
f=banana(x) f= 0
fzero函数求指定函数在特定区间上零值点。如果函数不存在零点,则返回NaN。
格式:z=fzero(‘fun’,x) %求指定函数在特定区间上零值点,fun为单变量实函数的文件名。 z=fzero(‘fun’,x,tol) 子 %指定了容许的误差。 z=fzero(‘fun’,x,tol,trace) %显示出每次的迭代情况 z=fzero(‘fun’,x,tol,trace,p1,p2...) %给函数fun提供附加的变量 例:a=fzero(‘humps’,[-1 0]); humps(a) 例:计算sin(x)从x=3开始的零点。 y=fzero(‘sin’,3)
例:在[1,2]之间求解cos(x)=0 y=fzero(‘cos’,[1 2]) y =
1.5708 4.数值积分 ? 极限: limit函数:
格式:limit(表达式,变量) 作用:对变量趋于0时求极限运算。若对变量趋于a时求极限运算,则格式为 limit(表述式,变量,a)。 例:syms x a t h;
limit(sin(x)/x) %returns 1 limit((x-2)/(x^2-4),2) %returns 1/4
limit((1+2*t/x)^(3*x),x,inf) %returns exp(6*t) limit(1/x,x,0,'right') %returns inf limit(1/x,x,0,'left') %returns -inf limit((sin(x+h)-sin(x))/h,h,0) %returns cos(x) v = [(1 + a/x)^x, exp(-x)];
limit(v,x,inf,'left') %returns [exp(a), 0] ? 导数和微分
导数:f(x,y,.....)在某一点(x0,y0....)的增长率,即为此函数在该点的导数。 f’(x)=lin(f(x+△x)-f(x))/△x 当△x->0 可以用limit函数来求。
diff函数:差分和导数逼近。如果diff的表达式或可变参数是数值,MATLAB就计算数组中元素间的差分;如果参数是符号字符串或变量,MATLAB就对其表达式进行微分。
例:数值向量和差分。 x=0:0.1:1;
y=[-.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2]; %试验数据 p=polyfit(x,y,2) %多项式的二阶拟合 pd=polyder(p) %多项式求导 pd=
-19.6217 20.1293
说明:y=-9.8108x^2+20.1293x-0.0317的微分是dy/dx=-19.6217x+20.1293。 例:符号表达式的微分。 f=’log(x)’
f函数的导数为 diff(f)
43
MatLab讲义 2002年9月版
ans=
exp(x)
例:求f(x)=(x+exsinx)1/2的导数
函数表示为:f=’(x+exp(x)*sin(x))^(1/2)’ %符号表达式 diff(f) 结果为:ans =
1/2/(x+exp(x)*sin(x))^(1/2)*(1+exp(x)*sin(x)+exp(x)*cos(x)) 例:diff(f,n)求函数的n阶导数,阶数太高时,可能导致死机。
2x1/2
求 y=e-cos(3x)的4阶导数。
函数表示为:y=’exp(-2*x)*cos(3*(x^(1/2))’ diff(y,4) pretty(ans) ? 多元函数的求导
在diff函数中加入对所求变量的说明即可。 格式:diff(‘f’,’变量’,n)
例:f=’x*sin(exp(y^(1/2)))/z’; diff(f,’y’); pretty(ans); ? 对抽象函数的求导
与其它函数求导的步骤一样,先说明函数的自变量,再说明函数的形式,最后用diff函数求导。 积分:求一条曲线,一个空间曲面及空间曲体在一定坐标系下对应的面积或体积。 主要使用int函数 ? 不定积分
只要写出待积分的函数,用int就可以求出函数的积分。 格式:int(f)或 int(f,变量) 例:有函数f=’sin(x*y+z)’;
int(f) %结果 -cos(x*y+z)/y 对Z求积分
int(f,’z’) %结果 -cos(x*y+z) ? 定积分及广义积分:
在int中加入积分限,就可以求得函数在积分上下限间的积分值, 格式:int(function,var,积分上限,积分下限)
ansa=int(‘cos(x)’,0,pi/6) %变量省略即对x求积 ansb=int(‘x^y’,’y’,0,pi/6) %对变量y求积
当积分限由某一具体数值变为正负无穷大时,定积分便转变为广义积分。
2
例:f(x)=1/x,g(x)=1/(1+x)在1到正无穷大的积分 函数表示为:f=’1/x’;g=’1/(1+x^2)’
intf=int(f,1,inf);intg=int(g,1,inf)
22
例:f(x)=1/(x+2x+3),g(x)=1/(x+2x-3) 在负无穷大到正无穷大的积分。 函数表示为:f=’1/(x^2+2*x+3)’;g=’1/(x^2+2*x-3)’ intf=int(f,-inf,inf) f(x)在整个数轴上可积 intg=int(g,-inf,inf) g(x)在整个数轴上不可积
求定积分的另一函数quad和quad8:用Simpson方法在指定区间内求一个函数的定积分。 语法:quad(‘fun’,a,b) %函数fun在区间[a,b]上的数值积分 quad(‘fun’,a,b,tol) %tol为相对误差
quad(‘fun’,a,b,tol,trace); %以图形方式显示出积分的进度
44
MatLab讲义 2002年9月版
quad(?fun?,a,b,tol,trace,p1,p2,...) %带有参数
quad8(...) %采用高阶方法实现积分的计算 例:a=quad(?sin?,0,pi); a=
2.0000
? dblquad函数:双重数值积分
在一个面上积分是双重积分的本质,只要能明确地将积分面表达出来并恰当转化成int命令中所需要的积分限的形式,双重积分的结果就得到了。也可以用函数dblquad。
注:用函数时必须画出积分的面的外形。 dblquad函数的使用格式:
result = dblquad(?fun‘, inmin, inmax, outmin, outmax, tol) fun = fun(inner, outter)
例:求下列函数的双重积分:
function f=f1(x,y) f=y*sin(x)+x*cos(y) 然后:
s=dblquad(?f1?,pi,2*pi,0,pi) s =
-9.8698
5.3 常微分方程数值解
ode23和ode45
Matlab中用ode23和ode45分别用中等精度和高精度龙格-库塔方法求解常微分方程(组),初值问题的函数。ode23求解一般的常微分方程,采用二、三阶的龙格-库塔法,ode45采用四、五阶的龙格-库塔法。
求解过程为:
(1)将微分方程变换成一阶微分方程组。 (n)1(n-1)y=f(t,y,y,....y)
1(n-1)
若令 y1=y,y2=y,.....yn=y 则得一阶微分方程组:
相应地可确定初值y1=(0),y2=(0),.....yn=(0) 其中y和f均为向量。
(2)将一阶微分方程组编写成f(t,y)的函数M文件。
function dy=funf(t,y)
dy=[y(2);y(3);......f(t,y(1),y(2),....y(n-1)]
(3)用MATLAB中提供的函数求解微分方程。即用如下的格式调用ode23和ode25
[t,y] = ode23(?Mfilename?, [t0 tfinal], y0); [t,y] = ode45(?Mfilename?, [t0, tfinal], y0)
其中,t0:初始时间,tfinal:计算时间的终值,y0为初值
例1:解常微分方程 y??+(y2-1)y?+y=0 1)将方程变成一个方程组 y1= y, y2= y? 得
45