版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5.1创建函数例:x=cos(at)+by=|x|+c创建一个comxy函数计算,文件名为comxy.mfunction[x,y]=comxy(a,t,b,c)x=cos(a*t)+by=abs(x)+c大写字母开头5.1.1函数文件第五章函数15.1创建函数例:x=cos(at)+by=|x|+c12function[x,y]=comxy(t,a,b,c)%变量名可不一致
%x=sin(at)+bx=cos(a*t)+b;y=abs(x)+c;n=3;b=linspace(1,1.4,n);fork=1:3[u,v]=comxy(0:pi/4:pi,sqrt(1.8/(1+k)^3),b(k),1/0.85)end调用程序2function[x,y]=comxy(t,a,b,c)23334function[x,y]=comxy(t)%x=sin(at)+bglobalABCx=cos(A*t)+B;y=abs(x)+C;globalABCn=3;C=1/.85;b=linspace(1,1.4,n);fork=1:nA=sqrt(1.8/(1+k)^3);B=b(k);[m,n]=comxy(0:pi/4:pi)end全局变量的用法,大写,空格(不用逗号)4function[x,y]=comxy(t)global45function[x,y]=comxy(t,a,b,c)%x=sin(at)+bx=cos(a*t)+b;y=abs(x)+c;clearalln=3;b=linspace(1,1.4,n);t=0:pi/4:pi;p=zeros(n,length(t));q=zeros(n,length(t));fork=1:3[p(k,:),q(k,:)]=comxy(t,sqrt(1.8/(1+k)^3),b(k),1/.85)end5function[x,y]=comxy(t,a,b,c)565.2.2inlinefox=inline('x.^2.*cos(a*x)-b','x','a','b')b=fox([pi/3pi/3.5],4,1)5.2.3子函数65.2.2inlinefox=inline('x.^2.677785.3用户自定义函数、函数句柄和feval函数句柄是一种引用函数的方法。函数句柄由和函数名构成。feval就是把已知的数据或符号带入到一个定义好的函数句柄中。clcclearallsymst%定义符号变量f=(x,y)x^3+y^2k1=feval(f,2,t)%k2=f(2,t)k3=feval(f,1,2)%k4=f(1,2)85.3用户自定义函数、函数句柄和feval函数句柄是一种895.4以数组变量为输入参数的MATLAB函数5.4.1多项式拟合-polyfit/polyval函数polyfit()采用最小二乘法对给定数据进行多项式拟合,其具体使用方法如下:
c=polyfit(x,y,n),采用n次多项式p来拟合数据x和y。y(x)=c1xn+c2xn-1+…+cnx+cn+1(5.1)求得c后,可以用下列语句求出式5.1y=polyval(c,xnew)95.4以数组变量为输入参数的MATLAB函数5.4.1910101011functionnd=datand=[50,0.13;70,0.092;90,0.072;110,0.057;130,0.046;150,0.037;170,0.028;190,0.020;210,0.015;230,0.010;250,0.007];ncs=data;c=polyfit(ncs(:,1),ncs(:,2),4);r=input('enterr(0<r<0.2)');su=input('entersu(50<su<250)');q=1/(1+polyval(c,su)/sqrt(r));disp(['q='num2str(q)])函数名以字母开头p=[223];a=[1,0;0,2];m=polyval(p,a)例:求m11functionnd=datancs=data;函数名11125.4.2插值-interp1
一维插值就是对函数y=f(x)进行插值,一维插值的原理如下图所示。125.4.2插值-interp1一维插值就是对函数1213
函数interp1()实现一维插值,其具体使用方法如下:
yi=interp1(x,y,xi),x,y是已知数据集且具有相同长度的向量;
yi=interp1(y,xi),默认x为1:n,其中n为向量y的长度;
yi=interp1(x,y,xi,method),method用于指定插值的方法。13函数interp1()实现一维插值,其具1314subplot(1,3,1);plot(x,y,'ro',xi,yi_nearest,'b-');title(‘最邻近插值');subplot(1,3,2);plot(x,y,'ro',xi,yi_linear,'b-');title(‘线性插值');subplot(1,3,3);plot(x,y,'ro',xi,yi_spline,'b-');title(‘三次样条插值');x=0:1.2:10;y=sin(x);xi=0:0.1:10;yi_nearest=interp1(x,y,xi,'nearest');yi_linear=interp1(x,y,xi);yi_spline=interp1(x,y,xi,'spline');figure;holdon;14subplot(1,3,1);x=0:1.2:10;1415非线性方程数值求解函数fzero()求一元函数的零点,其具体使用方法如下:
x=fzero(fun,x0,options,p1,p2,…),在x0点附近寻找函数的零点;
x=fzero(fun,[x0,x1]),在[x0,x1]区间内寻找函数的零点;
x=fzero(fun,x0,options),用options指定寻找零点的优化器参数;
[x,fval]=fzero(...),附加自变量为x时的函数值。15非线性方程数值求解1516例:求f(x)=x-10x+2=0在x0=0.5附近的根。步骤如下:(1)建立函数文件funx.m。
functionfx=funx(x)fx=x-10.^x+2;(2)调用fzero函数求根。
z=fzero('funx',0.5)z=0.3758(2)zero=inline('x-10.^x+2','x')z=fzero(zero,0.5)(3)z=fzero(inline('x-10.^x+2','x'),0.5)16例:求f(x)=x-10x+2=0在x0=0.5附近的根1617对于多值函数,应使用,[x1,x2]形式,并且准确划定范围,然而,如果f(x1),f(x2)符号相同,则会得到一个错误。例:w=fzero(cos,[0.6*pi,2*pi])/piw=fzero(cos,[0,2*pi])/pi17对于多值函数,应使用,[x1,x2]形式,并且准确划定范1718非线性方程组的求解对于非线性方程组F(X)=0,用fsolve函数求其数值解。fsolve函数的调用格式为:
X=fsolve(funnctionname,X0,option,p1,p2,…)其中X为返回的解,funnctionname是用于定义需求解的非线性方程组的函数文件名,X0是求根过程的初值,option为最优化工具箱的选项设定。最优化工具箱提供了20多个选项,用户可以使用optimset命令将它们显示出来。如果想改变其中某个选项,则可以调用optimset()函数来完成。例如,Display选项决定函数调用时中间结果的显示方式,其中‘off’为不显示,‘iter’表示每步都显示,‘final’只显示最终结果。optimset(‘Display’,‘off’)将设定Display选项为‘off’。18非线性方程组的求解1819求下列非线性方程组在(0.5,0.5)附近的数值解。
(1)建立函数文件myfun.m。functionq=myfun(p)x=p(1);y=p(2);q(1)=x-0.6*sin(x)-0.3*cos(y);q(2)=y-0.6*cos(x)+0.3*sin(y);(2)在给定的初值x0=0.5,y0=0.5下,调用fsolve函数求方程的根。x=fsolve('myfun',[0.5,0.5]',optimset('Display','off'))x=0.63540.373419求下列非线性方程组在(0.5,0.5)附近的数值解。1920将求得的解代回原方程,可以检验结果是否正确,命令如下:q=myfun(x)q=1.0e-009*0.23750.2957
可见得到了较高精度的结果。20将求得的解代回原方程,可以检验结果是否正确,命令如下:2021(1)多项式的根函数roots()求多项式的根,其具体使用方法如下:
r=roots(c),返回多项式c的所有根r。(2)由根创建多项式函数poly()实现由根创建多项式,其具体使用方法如下:
p=poly(r),输入r是多项式所有根,返回值为多项式的系数向量;
p=poly(A),输入A是方阵,返回值为A的特征多项式的系数向量。21(1)多项式的根2122在MATLAB7语言里,多项式由一个行向量表示,设为p,它的系数按降序排列,使用roots函数可以求出该多项式的根。其使用格式为roots(p)。>>p=[10312-7]%f(x)=x4+3x2+12x-7p=10312-7>>roots(p)ans=0.7876+2.4351i0.7876-2.4351i-2.08720.5121>>
22在MATLAB7语言里,多项式由一个行向量表示,设为p2223如果已知某个多项式的根,那么,使用poly函数,可以很轻松地产生其对应的多项式。
r=roots([1,-10,35,-50,24])c=poly(r)使用conv函数对多项式进行乘法运算。格式为c=conv(a,b),其中a和b为两个多项式的系数向量,c为相乘所生成的多项式的系数向量。
a=[1234];b=[5678];c=conv(a,b)23如果已知某个多项式的根,那么,使用poly函数,可以很轻23248.1.2数值积分的实现方法1.变步长辛普生法基于变步长辛普生法,MATLAB给出了quad函数来求定积分。该函数的调用格式为:
[I,n]=quad('fname',a,b,tol,trace)其中fname是被积函数名。a和b分别是定积分的下限和上限。tol用来控制积分精度,缺省时取tol=0.001。trace控制是否展现积分过程,若取非0则展现积分过程,取0则不展现,缺省时取trace=0。返回参数I即定积分值,n为被积函数的调用次数。248.1.2数值积分的实现方法2425求定积分。
(1)建立被积函数文件fesin.m。functionf=fesin(x)f=exp(-0.5*x).*sin(x+pi/6);(2)调用数值积分函数quad求定积分。[S,n]=quad(‘fesin’,0,3*pi)%n可省略S=0.9008n=7725求定积分。2526二重定积分的数值求解使用MATLAB提供的dblquad函数可以求二重定积分的数值解。该函数的调用格式为:I=dblquad(f,a,b,c,d,tol,trace)该函数求f(x,y)在[a,b]×[c,d]区域上的二重定积分。参数tol,trace的用法与函数quad完全相同。26二重定积分的数值求解2627计算二重定积分(1)建立一个函数文件fxy.m:functionf=fxy(x,y)globalKi;Ki=Ki+1;%ki用于统计被积函数的调用次数f=exp(-x.^2/2).*sin(x.^2+y);(2)调用dblquad函数求解。globalKi;Ki=0;I=dblquad(fxy,-2,2,-1,1)Ki27计算二重定积分2728常微分方程(Ordinarydifferentialequations,ODE)初值问题---给出初始值边值问题---给出边界条件与初值常微分方程解算有关的指令ode23ode45
ode113ode23tode15sode23sode23tb28常微分方程(Ordinarydifferential2829常用调用格式:[t,y]=ode45(odefun,tspan,y0)
参数说明:odefun表示f(t,y)的函数句柄或inline函数,t是标量,y是标量或向量;tspan如果是二维向量[t0,tf],表示自变量初值t0和tf;如果是高维向量[t0,t1,…,tn],则表示输出结点列向量;y0表示初值向量y0;t表示结点列向量(t0,t1,…,tn)T;y表示数值解矩阵,每一列对应y的一个分量;完整调用格式:[t,y]=ode45(odefun,tspan,y0,options,p1,p2,…)options为计算参数设置(如精度要求等),默认[]表示;p1,p2,…
附加传递参数,odefun表示为f(t,y,p1,p2,…)29常用调用格式:[t,y]=ode45(odefun,ts2930一.解ODE的基本机理:2.把高阶方程转换成一阶微分方程组1.列出微分方程初始条件令(5.2)(5.3)(5.4)30一.解ODE的基本机理:2.把高阶方程转换成一阶微分3031例:著名的VanderPol方程
令降为一阶初始条件31例:著名的VanderPol方程
令降为一阶初始条31323.根据式(5.3)编写计算导数的M函数文件-ODE文件把t,Y作为输入宗量,把作为输出宗量%Mfunctionfilename:dYdt.m
function
Yd=f(t,Y)
Yd=f(t,Y)
的展开式例VanderPol方程
%Mfunctionfilename:dYdt.mfunctionYd=f(t,Y)Yd=zeros(size(Y));Yd(1)=Y(2);Yd(2)=-(Y(1).^2-1)*Y(2)-Y(1);323.根据式(5.3)编写计算导数的M函数文件-ODE文32334.使编写好的ODE函数文件和初值供微分方程解算指令(solver)调用Solver解算指令的使用格式[t,Y]=solver(‘ODE函数文件名’,t0,tN,Y0,tol);ode45输出宗量形式说明:t0:初始时刻;tN:终点时刻Y0:初值;tol:计算精度334.使编写好的ODE函数文件和初值供微分方3334例题1:著名的VanderPol方程
%主程序
(程序名:VanderPol_ex1.m)
t0=0;tN=20;tol=1e-6;Y0=[0.25;0.0];[t,Y]=ode45('f',t0,tN,Y0,tol);subplot(121),plot(t,Y)subplot(122),plot(Y(:,1),Y(:,2))解法:采用ODE命令34例题1:著名的VanderPol方程
%主程序3435VanderPol方程
%子程序
(程序名:dYdt.m
)
functionYdot=dYdt(t,Y)Ydot=[Y(2);-Y(2)*(Y(1)^2-1)-Y(1)];或写为functionYdot=dYdt(t,Y)Ydot=zeros(size(Y));Ydot(1)=Y(2);Ydot(2)=-Y(2)*(Y(1).^2-1)-Y(1)];35VanderPol方程
%子程序(程序名:3536363637常微分方程一阶方程组边值问题MATLAB标准形式:调用格式Sinit=bvpinit(tinit,yinit)
由在粗略结点tinit的预估解yinit生成粗略解网格sinitSol=bvp4c(odefun,bcfun,sinit)odefun是微分方程组函数,bcfun为边值条件函数,sol.x为求解结点,sol.y是y(t)的数值解Sx=deval(sol,ti)
计算由bvp4c得到的解在ti的值37常微分方程一阶方程组边值问题MATLAB标准形式:3738例题:求解边值问题解:首先改写成方程组边界条件为38例题:求解边值问题3839求解用M函数eg6_5fun.m%M函数eg6_5fun.mclear;close;sinit=bvpinit(0:4,[1;0])odefun=inline(‘[y(2);-abs(y(1))]’,’t’,’y’);bcfun=inline(‘[ya(1);yb(1)+2]’,’ya’,’yb’);sol=bvp4c(odefun,bcfun,sinit)t=linspace(0,4,101);y=deval(sol,t);plot(t,y(1,:),sol.x,sol.y(1,:),’o’,sinit.x,…sinit.y(1,:),’s’)legend(‘解曲线’,’解点’,’粗略解’)39求解用M函数eg6_5fun.m3940最优化是求最优解,也就是在某个区间内有条件约束或者无条件约束地找到函数的最大值或者最小值。MATLAB使用数字方法求函数的最小值。使用迭代算法,也就是有些步骤要重复许多次。现在,假设要求函数f在某个区间内的最小值xmin。迭代方法需要一个初始估计值x0。从x0开始找到一个更接近xmin的新值x1,这个值的好坏取决于使用的数学方法。直到找到有足够精度的近似值xi才停止迭代,也就是绝对值|xmin-xi|足够小。这里提到了标准MATLAB系统的两个最优化命令,fmin命令可以求单变量函数的最小值;fmins命令可以求多变量函数的最小值,同时它还要求有一个初始向量。在新版本中,fmin和fmins分别被fminbnd和fminsearch取代。Matlab中没有求函数f的最大值的命令,但可以通过求其相反函数h=-f的最小值间接求得。40最优化是求最优解,也就是在某个区间内有条件约束或者无条件4041函数格式:x=fminbnd(fcn,x1,x2,options)求函数在区间(x1,x2)内取最小值时的x值,采用黄金分割法和二次插值。fcn是目标函数名。如果没有局部最小值,则返回区间内的最小x值。向量options为控制参数,如options(1)=1,显示中间结果;options(2)表示得到的结果x的精度,缺省为10-4,options可省略。x=fmins(fcn,x0,options)求函数fcn的最小值。由用户自己给出一个初始估计向量x0,优化参数options可省略。41函数格式:4142例:在区间[0,2]内求函数f(x)=x3-2x-5的最小值。f=inline('x.^3-2*x-5');x=fminbnd(f,0,2)x=0.8165f(x)ans=-6.088742例:在区间[0,2]内求函数f(x)=x3-2x-542符号数学工具箱是操作和解决符号表达式的符号数学工具箱(函数)集合,有复合、简化、微分、积分以及求解代数方程和微分方程的工具。另外还有一些用于线性代数的工具,求解逆、行列式、正则型式的精确结果,找出符号矩阵的特征值而无由数值计算引入的误差。符号数学工具箱中的工具是建立在功能强大的称作Maple软件的基础上。它最初是由加拿大的滑铁卢(Waterloo)大学开发的。当要求MATLAB进行符号运算时,它就请求Maple去计算并将结果返回到MATLAB命令窗口。因此,在MATLAB中的符号运算是MATLAB处理数字的自然扩展。符号数学工具箱是操作和解决符号表达式的符号数学工具箱(函数)4344定义符号变量参与符号运算的对象可以是符号变量、符号表达式或符号矩阵。符号变量要先定义,后引用。1.sym函数:每次定义一个符号变量。x=sym('x')%创建变量x。x=sym('x','real')%创建实变量x。x=sym('x','unreal')去掉x的实数属性。
a=sym('alpha')%创建变量a,打印为alpha。2.syms函数sysmsarg1arg2…argN。一次可定义多个符号变量,使用起来更方便。注意各变量间用空格隔开。44定义符号变量4445符号表达式符号表达式的书写格式与数值表达式一样,由符号变量、函数、运算符组成,如:symsabcxf=a*x^2+b*x+c也可以用f=sym('a*x^2+b*x+c')把符号表达式ax2+bx+c赋给f,但此时没有定义变量abcx。有两种方法创建符号函数,一是用符号表达式,如上面f=a*x^2+b*x+c定义了符号函数f,从而可以用diff等符号函数对f进行运算。如diff(f)将返回结果2*a*x+b。45符号表达式4546极限函数
limit格式
limit(F,x,a)%计算符号表达式F=F(x)当x→a时的极限值。limit(F,a)%用命令findsym(F)确定F中的自变量,设为变量x,再计算F的极限值,当x→a时。limit(F)%用命令findsym(F)确定F中的自变量,设为变量x,再计算F的极限值,当x→0时。limit(F,x,a,'right')或limit(F,x,a,'left')%计算符号函数F的单侧极限:左极限x→a-或右极限x→a+。例:symsxath;Thenlimit(sin(x)/x)=>1limit(1/x,x,0,'right')=>inflimit((sin(x+h)-sin(x))/h,h,0)=>cos(x)46极限4647导数(包括偏导数)函数
diff格式
diff(S,'v')、diff(S,sym('v'))%对表达式S中指定符号变量v计算S的1阶导数。diff(S)%对表达式S中的符号变量v计算S的1阶导数,其中v=findsym(S)。diff(S,n)%对表达式S中的符号变量v计算S的n阶导数,其中v=findsym(S)。diff(S,'v',n)%对表达式S中指定的符号变量v计算S的n阶导数。例:symsxtdiff(sin(x^2))%结果为
2*cos(x^2)*xdiff(t^6,'t',6)%结果为
returns72047导数(包括偏导数)4748符号函数的积分函数int格式
R=int(S,v)%对符号表达式S中指定的符号变量v计算不定积分。注意的是,表达式R只是函数S的一个原函数,后面没有带任意常数C。R=int(S)%对符号表达式S中的符号变量v计算不定积分,其中v=findsym(S)。R=int(S,v,a,b)%对表达式s中指定的符号变量v计算从a到b的定积分R=int(S,a,b)%对符号表达式s中的符号变量v计算从a到b的定积分,其中v=findsym(S)。例:symsxnint(x^n)%或int(x^n,x)、int(x^n,'x'),结果均为
x^(n+1)/(n+1)int(sin(2*x),0,pi/2)%结果为148符号函数的积分484949495050505151515.1创建函数例:x=cos(at)+by=|x|+c创建一个comxy函数计算,文件名为comxy.mfunction[x,y]=comxy(a,t,b,c)x=cos(a*t)+by=abs(x)+c大写字母开头5.1.1函数文件第五章函数525.1创建函数例:x=cos(at)+by=|x|+c5253function[x,y]=comxy(t,a,b,c)%变量名可不一致
%x=sin(at)+bx=cos(a*t)+b;y=abs(x)+c;n=3;b=linspace(1,1.4,n);fork=1:3[u,v]=comxy(0:pi/4:pi,sqrt(1.8/(1+k)^3),b(k),1/0.85)end调用程序2function[x,y]=comxy(t,a,b,c)535435455function[x,y]=comxy(t)%x=sin(at)+bglobalABCx=cos(A*t)+B;y=abs(x)+C;globalABCn=3;C=1/.85;b=linspace(1,1.4,n);fork=1:nA=sqrt(1.8/(1+k)^3);B=b(k);[m,n]=comxy(0:pi/4:pi)end全局变量的用法,大写,空格(不用逗号)4function[x,y]=comxy(t)global5556function[x,y]=comxy(t,a,b,c)%x=sin(at)+bx=cos(a*t)+b;y=abs(x)+c;clearalln=3;b=linspace(1,1.4,n);t=0:pi/4:pi;p=zeros(n,length(t));q=zeros(n,length(t));fork=1:3[p(k,:),q(k,:)]=comxy(t,sqrt(1.8/(1+k)^3),b(k),1/.85)end5function[x,y]=comxy(t,a,b,c)56575.2.2inlinefox=inline('x.^2.*cos(a*x)-b','x','a','b')b=fox([pi/3pi/3.5],4,1)5.2.3子函数65.2.2inlinefox=inline('x.^2.5758758595.3用户自定义函数、函数句柄和feval函数句柄是一种引用函数的方法。函数句柄由和函数名构成。feval就是把已知的数据或符号带入到一个定义好的函数句柄中。clcclearallsymst%定义符号变量f=(x,y)x^3+y^2k1=feval(f,2,t)%k2=f(2,t)k3=feval(f,1,2)%k4=f(1,2)85.3用户自定义函数、函数句柄和feval函数句柄是一种59605.4以数组变量为输入参数的MATLAB函数5.4.1多项式拟合-polyfit/polyval函数polyfit()采用最小二乘法对给定数据进行多项式拟合,其具体使用方法如下:
c=polyfit(x,y,n),采用n次多项式p来拟合数据x和y。y(x)=c1xn+c2xn-1+…+cnx+cn+1(5.1)求得c后,可以用下列语句求出式5.1y=polyval(c,xnew)95.4以数组变量为输入参数的MATLAB函数5.4.16061106162functionnd=datand=[50,0.13;70,0.092;90,0.072;110,0.057;130,0.046;150,0.037;170,0.028;190,0.020;210,0.015;230,0.010;250,0.007];ncs=data;c=polyfit(ncs(:,1),ncs(:,2),4);r=input('enterr(0<r<0.2)');su=input('entersu(50<su<250)');q=1/(1+polyval(c,su)/sqrt(r));disp(['q='num2str(q)])函数名以字母开头p=[223];a=[1,0;0,2];m=polyval(p,a)例:求m11functionnd=datancs=data;函数名62635.4.2插值-interp1
一维插值就是对函数y=f(x)进行插值,一维插值的原理如下图所示。125.4.2插值-interp1一维插值就是对函数6364
函数interp1()实现一维插值,其具体使用方法如下:
yi=interp1(x,y,xi),x,y是已知数据集且具有相同长度的向量;
yi=interp1(y,xi),默认x为1:n,其中n为向量y的长度;
yi=interp1(x,y,xi,method),method用于指定插值的方法。13函数interp1()实现一维插值,其具6465subplot(1,3,1);plot(x,y,'ro',xi,yi_nearest,'b-');title(‘最邻近插值');subplot(1,3,2);plot(x,y,'ro',xi,yi_linear,'b-');title(‘线性插值');subplot(1,3,3);plot(x,y,'ro',xi,yi_spline,'b-');title(‘三次样条插值');x=0:1.2:10;y=sin(x);xi=0:0.1:10;yi_nearest=interp1(x,y,xi,'nearest');yi_linear=interp1(x,y,xi);yi_spline=interp1(x,y,xi,'spline');figure;holdon;14subplot(1,3,1);x=0:1.2:10;6566非线性方程数值求解函数fzero()求一元函数的零点,其具体使用方法如下:
x=fzero(fun,x0,options,p1,p2,…),在x0点附近寻找函数的零点;
x=fzero(fun,[x0,x1]),在[x0,x1]区间内寻找函数的零点;
x=fzero(fun,x0,options),用options指定寻找零点的优化器参数;
[x,fval]=fzero(...),附加自变量为x时的函数值。15非线性方程数值求解6667例:求f(x)=x-10x+2=0在x0=0.5附近的根。步骤如下:(1)建立函数文件funx.m。
functionfx=funx(x)fx=x-10.^x+2;(2)调用fzero函数求根。
z=fzero('funx',0.5)z=0.3758(2)zero=inline('x-10.^x+2','x')z=fzero(zero,0.5)(3)z=fzero(inline('x-10.^x+2','x'),0.5)16例:求f(x)=x-10x+2=0在x0=0.5附近的根6768对于多值函数,应使用,[x1,x2]形式,并且准确划定范围,然而,如果f(x1),f(x2)符号相同,则会得到一个错误。例:w=fzero(cos,[0.6*pi,2*pi])/piw=fzero(cos,[0,2*pi])/pi17对于多值函数,应使用,[x1,x2]形式,并且准确划定范6869非线性方程组的求解对于非线性方程组F(X)=0,用fsolve函数求其数值解。fsolve函数的调用格式为:
X=fsolve(funnctionname,X0,option,p1,p2,…)其中X为返回的解,funnctionname是用于定义需求解的非线性方程组的函数文件名,X0是求根过程的初值,option为最优化工具箱的选项设定。最优化工具箱提供了20多个选项,用户可以使用optimset命令将它们显示出来。如果想改变其中某个选项,则可以调用optimset()函数来完成。例如,Display选项决定函数调用时中间结果的显示方式,其中‘off’为不显示,‘iter’表示每步都显示,‘final’只显示最终结果。optimset(‘Display’,‘off’)将设定Display选项为‘off’。18非线性方程组的求解6970求下列非线性方程组在(0.5,0.5)附近的数值解。
(1)建立函数文件myfun.m。functionq=myfun(p)x=p(1);y=p(2);q(1)=x-0.6*sin(x)-0.3*cos(y);q(2)=y-0.6*cos(x)+0.3*sin(y);(2)在给定的初值x0=0.5,y0=0.5下,调用fsolve函数求方程的根。x=fsolve('myfun',[0.5,0.5]',optimset('Display','off'))x=0.63540.373419求下列非线性方程组在(0.5,0.5)附近的数值解。7071将求得的解代回原方程,可以检验结果是否正确,命令如下:q=myfun(x)q=1.0e-009*0.23750.2957
可见得到了较高精度的结果。20将求得的解代回原方程,可以检验结果是否正确,命令如下:7172(1)多项式的根函数roots()求多项式的根,其具体使用方法如下:
r=roots(c),返回多项式c的所有根r。(2)由根创建多项式函数poly()实现由根创建多项式,其具体使用方法如下:
p=poly(r),输入r是多项式所有根,返回值为多项式的系数向量;
p=poly(A),输入A是方阵,返回值为A的特征多项式的系数向量。21(1)多项式的根7273在MATLAB7语言里,多项式由一个行向量表示,设为p,它的系数按降序排列,使用roots函数可以求出该多项式的根。其使用格式为roots(p)。>>p=[10312-7]%f(x)=x4+3x2+12x-7p=10312-7>>roots(p)ans=0.7876+2.4351i0.7876-2.4351i-2.08720.5121>>
22在MATLAB7语言里,多项式由一个行向量表示,设为p7374如果已知某个多项式的根,那么,使用poly函数,可以很轻松地产生其对应的多项式。
r=roots([1,-10,35,-50,24])c=poly(r)使用conv函数对多项式进行乘法运算。格式为c=conv(a,b),其中a和b为两个多项式的系数向量,c为相乘所生成的多项式的系数向量。
a=[1234];b=[5678];c=conv(a,b)23如果已知某个多项式的根,那么,使用poly函数,可以很轻74758.1.2数值积分的实现方法1.变步长辛普生法基于变步长辛普生法,MATLAB给出了quad函数来求定积分。该函数的调用格式为:
[I,n]=quad('fname',a,b,tol,trace)其中fname是被积函数名。a和b分别是定积分的下限和上限。tol用来控制积分精度,缺省时取tol=0.001。trace控制是否展现积分过程,若取非0则展现积分过程,取0则不展现,缺省时取trace=0。返回参数I即定积分值,n为被积函数的调用次数。248.1.2数值积分的实现方法7576求定积分。
(1)建立被积函数文件fesin.m。functionf=fesin(x)f=exp(-0.5*x).*sin(x+pi/6);(2)调用数值积分函数quad求定积分。[S,n]=quad(‘fesin’,0,3*pi)%n可省略S=0.9008n=7725求定积分。7677二重定积分的数值求解使用MATLAB提供的dblquad函数可以求二重定积分的数值解。该函数的调用格式为:I=dblquad(f,a,b,c,d,tol,trace)该函数求f(x,y)在[a,b]×[c,d]区域上的二重定积分。参数tol,trace的用法与函数quad完全相同。26二重定积分的数值求解7778计算二重定积分(1)建立一个函数文件fxy.m:functionf=fxy(x,y)globalKi;Ki=Ki+1;%ki用于统计被积函数的调用次数f=exp(-x.^2/2).*sin(x.^2+y);(2)调用dblquad函数求解。globalKi;Ki=0;I=dblquad(fxy,-2,2,-1,1)Ki27计算二重定积分7879常微分方程(Ordinarydifferentialequations,ODE)初值问题---给出初始值边值问题---给出边界条件与初值常微分方程解算有关的指令ode23ode45
ode113ode23tode15sode23sode23tb28常微分方程(Ordinarydifferential7980常用调用格式:[t,y]=ode45(odefun,tspan,y0)
参数说明:odefun表示f(t,y)的函数句柄或inline函数,t是标量,y是标量或向量;tspan如果是二维向量[t0,tf],表示自变量初值t0和tf;如果是高维向量[t0,t1,…,tn],则表示输出结点列向量;y0表示初值向量y0;t表示结点列向量(t0,t1,…,tn)T;y表示数值解矩阵,每一列对应y的一个分量;完整调用格式:[t,y]=ode45(odefun,tspan,y0,options,p1,p2,…)options为计算参数设置(如精度要求等),默认[]表示;p1,p2,…
附加传递参数,odefun表示为f(t,y,p1,p2,…)29常用调用格式:[t,y]=ode45(odefun,ts8081一.解ODE的基本机理:2.把高阶方程转换成一阶微分方程组1.列出微分方程初始条件令(5.2)(5.3)(5.4)30一.解ODE的基本机理:2.把高阶方程转换成一阶微分8182例:著名的VanderPol方程
令降为一阶初始条件31例:著名的VanderPol方程
令降为一阶初始条82833.根据式(5.3)编写计算导数的M函数文件-ODE文件把t,Y作为输入宗量,把作为输出宗量%Mfunctionfilename:dYdt.m
function
Yd=f(t,Y)
Yd=f(t,Y)
的展开式例VanderPol方程
%Mfunctionfilename:dYdt.mfunctionYd=f(t,Y)Yd=zeros(size(Y));Yd(1)=Y(2);Yd(2)=-(Y(1).^2-1)*Y(2)-Y(1);323.根据式(5.3)编写计算导数的M函数文件-ODE文83844.使编写好的ODE函数文件和初值供微分方程解算指令(solver)调用Solver解算指令的使用格式[t,Y]=solver(‘ODE函数文件名’,t0,tN,Y0,tol);ode45输出宗量形式说明:t0:初始时刻;tN:终点时刻Y0:初值;tol:计算精度334.使编写好的ODE函数文件和初值供微分方8485例题1:著名的VanderPol方程
%主程序
(程序名:VanderPol_ex1.m)
t0=0;tN=20;tol=1e-6;Y0=[0.25;0.0];[t,Y]=ode45('f',t0,tN,Y0,tol);subplot(121),plot(t,Y)subplot(122),plot(Y(:,1),Y(:,2))解法:采用ODE命令34例题1:著名的VanderPol方程
%主程序8586VanderPol方程
%子程序
(程序名:dYdt.m
)
functionYdot=dYdt(t,Y)Ydot=[Y(2);-Y(2)*(Y(1)^2-1)-Y(1)];或写为functionYdot=dYdt(t,Y)Ydot=zeros(size(Y));Ydot(1)=Y(2);Ydot(2)=-Y(2)*(Y(1).^2-1)-Y(1)];35VanderPol方程
%子程序(程序名:8687368788常微分方程一阶方程组边值问题MATLAB标准形式:调用格式Sinit=bvpinit(tinit,yinit)
由在粗略结点tinit的预估解yinit生成粗略解网格sinitSol=bvp4c(odefun,bcfun,sinit)odefun是微分方程组函数,bcfun为边值条件函数,sol.x为求解结点,sol.y是y(t)的数值解Sx=deval(sol,ti)
计算由bvp4c得到的解在ti的值37常微分方程一阶方程组边值问题MATLAB标准形式:8889例题:求解边值问题解:首先改写成方程组边界条件为38例题:求解边值问题8990求解用M函数eg6_5fun.m%M函数eg6_5fun.mclear;close;sinit=bvpinit(0:4,[1;0])odefun=inline(‘[y(2);-abs(y(1))]’,’t’,’y’);bcfun=inline(‘[ya(1);yb(1)+2]’,’ya’,’yb’);sol=bvp4c(odefun,bcfun,sinit)t=linspace(0,4,101);y=deval(sol,t);plot(t,y(1,:),sol.x,sol.y(1,:),’o’,sinit.x,…sinit.y(1,:),’s’)legend(‘解曲线’,’解点’,’粗略解’)39求解用M函数eg6_5fun.m9091最优化是求最优解,也就是在某个区间内有条件约束或者无条件约束地找到函数的最大值或者最小值。MATLAB使用数字方法求函数的最小值。使用迭代算法,也就是有些步骤要重复许多次。现在,假设要求函数f在某个区间内的最小值xmin。迭代方法需要一个初始估计值x0。从x0开始找到一个更接近xmin的新值x1,这个值的好坏取决于使用的数学方法。直到找到有足够精度的近似值xi才停止迭代,也就是绝对值|xmin-xi|足够小。这里提到了标准MATLAB系统的两个最优化命令,fmin命令可以求单变量函数的最小值;fmins命令可以求多变量函数的最小值,同时它还要求有一个初始向量。在新版本中,fmin和fmins分别被fminbnd和fminsearch取代。Matlab中没有求函数f的最大值的命令,但可以通过求其相反函数h=-f的最小值间接求得。40最优化是求最优解,也就是在某个区间内有条件约束或者无条件9192函数格式:x=fminbnd(fcn,x1,x2,options)求函数在区间(x1,x2)内取最小值时的x值,采用黄金分割法和二次插值。fcn是目标函数名。如果没有局部最小值,则返回区间内的最小x值。向量options为控制参数,如options(1)=1,显示中间结果;options(2)表示得到的结果x的精度,缺省为10-4,options可省略。x=fmins(fcn,x0,options)求函数fcn的最小值。由用户自己给出一个初始估计向量x0,优化参
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商会内部管理制度汇编
- 新疆农业大学科学技术学院《电气控制与可编程控制器》2024-2025学年第二学期期末试卷
- 机关内部资料管理制度
- 文山学院《幼儿园玩具教具制作》2024-2025学年第二学期期末试卷
- 林业企业内部控制制度
- 某内部控制制度
- 检察院内部培训制度汇编
- 民政单位内部审计制度
- 民警内部选拔制度
- 海事局内部管理制度
- GB/T 26030-2010镍镍合金锻件
- GB/T 20028-2005硫化橡胶或热塑性橡胶应用阿累尼乌斯图推算寿命和最高使用温度
- 丁往道英语写作手册课件
- 七上道法复习课件1
- 怎样讲好微型课教学课件
- 宪法与行政法专题四国家权力的组织与结构课件
- 化工过程数值模拟及Aspen-Plus软件应用
- 电子洁净厂房施工组织方案
- 苏教版一年级科学下册全册教案(常用)
- 自然辩证法-导论
- 铝镁锰合金屋面施工组织设计方案
评论
0/150
提交评论