非线性方程组求解.ppt_第1页
非线性方程组求解.ppt_第2页
非线性方程组求解.ppt_第3页
非线性方程组求解.ppt_第4页
非线性方程组求解.ppt_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

非线性方程(组)求解,2019年6月27日星期四,2,引言,在945.36kPa(9.33atm)、300.2K时,容器中充以2mol氮气,试求容器体积。已知此状态下氮气的P-V-T关系符合范德华方程,其范德华常数为a4.17atmL/mol2, b0.0371L/mol 数学模型:范德华方程变形可得,这是关于V的非线性方程,2019年6月27日星期四,3,本章内容,2.1非线性方程(组)数值求解基本原理 2.2 Matlab函数 2.3 多项式求根函数roots 2.4 非线性方程求解函数,fzero和fsolve 2.5 关系和逻辑运算 2.6 Matlab程序流程控制,2019年6月27日星期四,4,非线性方程,与线性方程相比,非线性方程问题无论从理论上还是从计算公式上都要复杂得多 非线性方程一般形式 方程的解称为方程的根或函数的零点 对于高次代数方程,当次数4时,则没有通解公式可用,对于超越方程既不知有几个根,也没有同样的求解方式。实际上,对于n3代数方程以及超越方程都采用数值方法求近似根,2019年6月27日星期四,5,数值法求根,首选要给出一个初始猜测解,然后通过各种迭代格式使其逐次逼近准确解 初值好坏对迭代收敛性有很大影响,因此初值的选取很重要 对于有专业背景的问题,初值可以按条件选择,对于没有经验的问题,可以用图解法和计算机试算搜索法初估近似解,2019年6月27日星期四,6,2.1.1 逐步扫描法求根的初始近似值,用数值法求方程的根可分为两步,首先要找出根的某个近似值,又称为“初始值”,然后再采用特定算法将初始值逐步接近真实值,直到获得满足要求的结果 逐步扫描法,2019年6月27日星期四,7,逐步扫描法,2019年6月27日星期四,8,2.1.2 求方程根的精确解,非线性方程(组)的求解一般采用迭代法进行。迭代法是一种重要的逐次逼近方法。这种方法用某个固定公式反复校正根的近似值,使之逐步精确化,最后得到满足精度要求的结果 常见的迭代算法有不动点迭代、二分法、牛顿法、弦截法、威格斯坦法(Wegstein)、抛物线法等,2019年6月27日星期四,9,不动点迭代法,我们可以通过多种方法将方程式,转化为,2019年6月27日星期四,10,迭代方程,例如方程,可以转化为以下不同形式,(1),(2),(3),2019年6月27日星期四,11,方程的根,从给定的初值x0,按上式可以得到一个数列: x0, x1, x2, , xk, 如果这个数列有极限,则迭代格式是收敛的。这时数列xk的极限 就是方程的根,2019年6月27日星期四,12,直接迭代法,上述求非线性代数方程式数值解的方法称为直接迭代法(或称为不动点迭代法)。这个方法虽然简单,但根本问题在于当k-时,xk是否收敛于x*,也就是必须找出收敛的充分条件,2019年6月27日星期四,13,不动点,定义:函数g(x)的一个不动点(fixed point)是指一个实数P,满足P = g(P) 从图形角度分析,函数y=g(x)的不动点是y=g(x)和y=x的交点,2019年6月27日星期四,14,不动点迭代的图形解释,2019年6月27日星期四,15,不动点定理,设有(i) g,g Ca,b, (ii) K是一个正常数,(iii) p0(a,b), (iv)对所有x a,b,有g(x)a,b 如果对于所有x a,b,有|g(x)|K1,则迭代pn=g(pn-1)将不会收敛到P点。在这种情况下,P称为排斥(repelling)不动点,而且迭代显示出局部发散性,2019年6月27日星期四,16,2.1.2.2 二分法,2019年6月27日星期四,17,2.1.2.3 牛顿法,牛顿法也称为牛顿-拉普森法或者切线法。由于这个方法的计算结果颇佳,而计算过程也比较简单,所以被普遍采用 牛顿法的核心内容是通过泰勒级数将非线性方程式转化为线性方程式,然后用迭代法求解,2019年6月27日星期四,18,牛顿公式,设方程式 的近似根为 则 对 的泰勒级数展开式为,2019年6月27日星期四,19,牛顿法示意图,2019年6月27日星期四,20,牛顿法注意事项,在单根附近,牛顿公式恒收敛,而且收敛速度很快。但是需要注意如果初始值不在根的附近,牛顿公式不一定收敛 在实际使用中,牛顿法最好与逐步扫描法结合起来,先通过逐步扫描法求出根的近似值,然后用牛顿公式求其精确值,以发挥牛顿法收敛速度快的优点,2019年6月27日星期四,21,2.1.2.4 弦截法,牛顿迭代法收敛速度快,但它要求计算函数导数的值。在科学与工程计算中,常会碰到函数导数不易计算或者算式复杂而不便计算的情况 弦截法的基本思想与牛顿法相似,即将非线性函数线性化后求解。两者的差别在于弦截法实现函数线性化的手段采用的是两点间的弦线,而不是某点的切线,2019年6月27日星期四,22,弦截法示意图,2019年6月27日星期四,23,弦截法注意事项,与牛顿法只需给出一个初值不同,弦截法需要给出两个迭代初值。如果与逐步扫描法结合起来,则最后搜索的区间的两个端点值常可作为初值 弦截法虽比牛顿法收敛速度稍慢,但在每次迭代中只需计算一次函数值,又不必求函数的导数,且对初值要求不甚苛刻,是工程计算中常用的有效计算方法之一,2019年6月27日星期四,24,2.1.2.5 松弛迭代法,有些非线性方程用前面的不动点迭代法求解时,迭代过程是发散的。这时可以引入松弛因子,利用松弛迭代法。通过选择合适的松弛因子,就可以使迭代过程收敛,2019年6月27日星期四,25,松弛法注意事项,由上式可知,当松弛因子=1时,松弛迭代法变为不动点迭代法;当松弛因子1时,松弛法使迭代步长加大,可加速迭代,但有可能使原理收敛的迭代变为发散;当01时,松弛法使迭代步长减小,这适合于迭代发散或振荡收敛的情况,可使振荡收敛过程加速;当0时,将使迭代反方向进行,可使一些迭代发散过程收敛,2019年6月27日星期四,26,松弛法注意事项,松弛迭代法是否有效的关键因素是松弛因子的值能否正确选定。如果值选用适当,能使迭代过程加速,或者使原来不收敛的过程变成收敛;但如果值选用不合适,则效果相反,有时甚至会使原来收敛的过程变得不收敛。松弛因子的数值往往要根据经验选定,但选用较小的松弛因子,一般可以保证迭代过程的收敛,2019年6月27日星期四,27,2.1.2.6 威格斯坦法,威格斯坦法在化工流程模拟中得到了广泛应用 威格斯坦法是一种迭代加速方法,2019年6月27日星期四,28,Wegstein法的示意图和迭代公式,2019年6月27日星期四,29,Wegstein法注意事项,应注意,如果x1和x2两点选择不当,则连线的斜率等于1,与直线y=x无交点,从而迭代无法进行,这就是Wegstein法应当避免的陷井。引入一个量C,2019年6月27日星期四,30,Wegstein法注意事项,令q1-C 当q0时,Wegstein法退化为简单的不动点迭代 当00时,迭代能稳定收敛,但收敛较慢 当q0可以加速收敛,但易导致不稳定 为了加速收敛又避免不稳定,常取-5q0,这是称为有界的Wegstein法 注:当S=1时,取S=0进行计算。,2019年6月27日星期四,31,2.2 Matlab函数,Matlab中创建函数有几种方法 最常用的是由function命令创建,可以通过程序、函数或命令窗口来访问 第二种是使用inline命令创建内联函数 第三种创建匿名函数 函数的另一种形式是子函数,在一个函数文件中,如果function关键字出现多次,则在第一个function之后定义的所有函数都称为子函数。子函数只能有函数文件的第一个函数和文件内部的其它子函数调用,2019年6月27日星期四,32,2.2.1 内联函数(inline function),内联函数的创建 inline(CE)把串表达式转化为输入变量自动生成的内联函数 inline(CE,arg1,arg2,)把串表达式转化为arg1,arg2等指定输入变量的内联函数 inline(CE,n)把串表达式转化为x,P1,P2,Pn等指定输入变量的内联函数,2019年6月27日星期四,33,2.2.1 内联函数(inline function),说明 CE是字符串;CE表达式不能包含赋值号 第1种调用格式将自动地对CE进行辨识,把CE中由字母/数字组成的连续字符认做变量,除预定义变量名和常用函数名(如sin)外的有字母/数字组成的连续字符将被认做变量。但注意如果连续字符后紧接左圆括号,则不被当作输入变量。 第2种方法创建内联函数最稳妥、可靠的方法。 第3种方法最简练,但是对输入变量的字符有严格限制。输入变量字符只能是x,P1,P2,Pn等,注意P必须为大写字母。,2019年6月27日星期四,34,2.2.1 内联函数(inline function),涉及内联函数性质的指令 class(inline_fun)给出内联函数类型 char(inline_fun)给出内联函数计算公式argnames(inline_fun)给出内联函数的输入变量vectorize(inline_fun)使内联函数适用数组运算规则,2019年6月27日星期四,35,2.2.1 内联函数(inline function),例1:创建一个内联函数,求解下式在x/3,/3.5;a4,b1时的值。 Fx=inline(x.2.*cos(a*x)-b,x,a,b) Fx = Inline function: Fx(x,a,b) = x.2.*cos(a*x)-b g=Fx(pi/3 pi/3.5,4,1) g = -1.5483 -1.7259,2019年6月27日星期四,36,2.2.2 匿名函数 (anonymous function),匿名函数用于在命令行、函数文件或script文件中创建简单形式的函数,避免另外定义新的函数。 匿名函数的定义形式: f=(arglist)expression,2019年6月27日星期四,37,例题1:,采用匿名函数计算以下表达式在x5时的值: 1) f(x)x2; 2) f(x)x2,g(x)=3x, h(x)=g(f(x); 3) =0.9, f(x)=sin(x),2019年6月27日星期四,38,求解,1) f = (x) x.2 a = f(5) 结果:a = 25 2) f = (x) x.2; g = (x) 3*x; h = (x) g(f(x); h(5) 结果:ans = 75 3) alpha = 0.9; f = (x) sin(alpha*x); f(5) 结果:ans = -0.9775,2019年6月27日星期四,39,匿名函数,匿名函数用于在命令行、函数文件或script文件中创建简单形式的函数,避免另外定义新的函数 Matlab允许定义多重匿名函数,例如,对于表达式 可以通过以下的匿名函数进行计算 g = (c) quad(x) x.2+c*x+1,0,1) 此处quad为数值积分函数,2019年6月27日星期四,40,2.2.3 子函数,如果在一个函数文件中出现多个function关键字,则在第一个function之后定义的所有函数都称为子函数。含有第一个function关键字的表达式叫做主函数。主函数是由命令窗口、程序和其它函数调用的唯一函数。子函数仅能由主函数和主函数文件中的其它子函数调用,2019年6月27日星期四,41,例题2:,牛顿流体在不锈钢管中的流动压降可由下式估算: 其中, 摩擦压降,psi/(100英尺等量管长);M,质量流量,lb/hr;,粘度,cP;,密度,lb/ft3,D,管径,inch。,2019年6月27日星期四,42,例题2:,流体密度可由下式描述: ,g/ml;对于水,A0.34710;B0.2740;Tc647.13K;n0.28571。 流体粘度由下式描述: ,cP;对于水,A=-10.2158;B=1.7925E3;C1.7730E-2;D=-1.2631E-05。,2019年6月27日星期四,43,例题2:,计算在1/2英寸不锈管中,以2000lb/hr流量输送水,当水的温度为10、20、30、40、50、60、70、80时,压降分别为多少? 编写一个含子函数的函数用于计算不同温度下的压降。密度和粘度的计算分别作为子函数,2019年6月27日星期四,44,例题2:,程序: function dP=DeltP2(T) M=2000;D=0.5; Rho=density(T); mu=viscosity(T); dP=(M1.8)*(mu.0.2)./(20000*D4.8.*Rho); %- function P=density(T) density.A=0.3471;density.B=0.274;density.Tc=647.13;density.n=0.28571; P=(density.A.*density.B.(-(1-T./density.Tc).density.n)/0.2323; %-,2019年6月27日星期四,45,例题2:,function V=viscosity(T) mu.A=-10.2158;mu.B=1.7925e3;mu.C=1.773e-2;mu.D=-1.2631e-5; V=10.(mu.A+mu.B./T+mu.C.*T+mu.D.*T.2); 在命令窗口里输入 deltP=DeltP2(283:10:353),回车得到结果 deltP = 287.8191 275.7873 265.7385 257.3301 250.2922 244.4096 239.5091 235.4500,2019年6月27日星期四,46,例题2:,此时如果在命令窗口输入 density(283) 结果会返回如下错误信息 ? Undefined function or method density for input arguments of type double. 表明density这个函数是不能在命令窗口被直接调用的。,2019年6月27日星期四,47,2.2.4 变量在函数间的传递,函数中使用的变量名不必和从Matlab命令窗口、程序文件或另一个函数调用此函数时使用的名字一致。但是,圆括号的输入变量位置确定了信息的传递顺序调用语句中的函数第一个参数将值传递到函数接口定义中的第一个参数,依次类推,2019年6月27日星期四,48,例题4:,编写函数计算t=0:pi/4:pi, a=1.4, b=2, c=0.75时x和y的值 首先编写函数ComputeXY function x,y=ComputeXY(t,a,b,c) x=cos(a*t); y=abs(x)+c;,2019年6月27日星期四,49,例题4:,在命令窗口输入 u,v=ComputeXY(0:pi/4:pi,1.4,2,0.75) 回车可得正确值 u = 3.0000 2.4540 1.4122 1.0123 1.6910 v = 3.7500 3.2040 2.1622 1.7623 2.4410,2019年6月27日星期四,50,现在我们采用另一种方法调用函数看结果如何。 在命令窗口输入 t=0:pi/4:pi a=1.4 b=2 c=0.75 u,v=ComputeXY(a,b,c,t) 回车后结果为 u = -0.1922 v = 0.1922 0.9776 1.7630 2.5484 3.3338 可见变量在传递进函数时是按照顺序与函数变量一一对应的,而不是按照变量名对应。这与变量的作用域有关,2019年6月27日星期四,51,变量按照作用域,变量按照作用域的不同的可以分为局部变量和全局变量 在默认情况下,函数内的变量属于局部变量,它只在函数内有效,而在函数外部不可用 全局变量对于整个程序的所有过程和函数都有效,全局变量可以用global关键字定义,并应同时在主调程序和被调函数中定义 在传递给函数变量数目很大时,创建不同函数访问全局变量是一个好的方法,2019年6月27日星期四,52,全局变量,为说明全局变量的使用,在ComputeXY函数中定义全局变量a, b, c,修改程序如下: function x,y=ComputeXY(t) global a b c %注意变量之间用空格而不是逗号或其它标点隔开 x=cos(a*t); y=abs(x)+c;,2019年6月27日星期四,53,全局变量,在命令窗口调用时应采用以下语句 global a b c a=1.4;b=2;c=0.75; u,v=ComputeXY(0:pi/4:pi) 则可获得正确结果,2019年6月27日星期四,54,2.2.5*用函数nargin()和nargout()检索函数变量数,在自定义函数内使用函数(或命令)nargin和nargout可以确定该函数有多少个输入变量和输出变量被调用,然后用条件语句根据变量数判断选择执行不同的任务,2019年6月27日星期四,55,function c = func(a,b) if (nargin = 1) c = a.2; %当调用语句只传递一个输入参数给此函数时,执行该语句 end if(nargin = 2) c = a + b; %当调用语句传递两个输入参数给此函数时,执行该语句 end 此函数func()既可以接受1个输入参数,也可以接受两个输入参数,nargin,2019年6月27日星期四,56,nargout,函数nargout的用法与nargin相似。这两个函数的运用,大大地提高了自定义函数地功能和灵活性,使自定义函数更具通用性 MATLAB大量的内部函数也正是使用这种方法,2019年6月27日星期四,57,2.2.6 函数句柄,创建一个函数句柄,可用于保存函数的所有信息,以便将来对它进行调用 函数句柄可以作为参数传递给其他函数,以调用该函数句柄所属的函数。也可以使用feval计算函数值,或采用fplot绘制函数图形 使用函数句柄还可以减少定义函数的文件个数,改善重复操作的性能,保证函数计算的可靠性 执行“help FUNCTION_HANDLE”可了解函数句柄的详细信息,2019年6月27日星期四,58,函数句柄的获取和使用,funhandle = function_name %function_name为用户指定的函数名 feval函数的调用格式如下: y1, y2, . = feval(funhandle, x1, ., xn) 或y1, y2, . = feval(function, x1, ., xn) 其中x1, ., xn为传递给函数的参数值 例如,可以采用以下语句计算例题4中的函数值 u,v=feval(ComputeXY,0:pi/4:pi,1.4,2,0.75),2019年6月27日星期四,59,fplot函数的调用格式,fplot(fun,limits) fplot(fun,limits,LineSpec) fplot(fun,limits,tol) 其中fun为函数句柄或匿名函数;limits为坐标轴范围;LineSpec为曲线的控制字符串;tol为相对误差限。,2019年6月27日星期四,60,例题5,采用fplot函数绘制以下函数在-20 20区间内的函数图形。,定义函数 function Y = myfun(x) Y = 200*sin(x)./x; 输入命令fplot(myfun,-20 20),2019年6月27日星期四,61,2.3 多项式求根函数roots,多项式的表达式约定如下: 对于多项式,用以下行向量表示: 这样就把多项式问题转化为向量问题 Matlab提供了多种多项式计算函数,如多项式求根函数roots,求多项式的值,polyval;多项式乘法,conv;多项式除法,deconv;多项式微分,polyder;多项式拟合,polyfit,2019年6月27日星期四,62,函数roots,r = roots(c),用于求解多项式的根 其中,行向量c的元素是多项式的系数,按多项式次数降序排列 如果c中含有n+1个元素,则多项式为n次 roots可以获得多项式的所有根 其算法为计算伴随矩阵的特征值,2019年6月27日星期四,63,例题6:,求方程 的根,c = 1 -1 0 -1; r = roots(c),r = 1.4656 -0.2328 + 0.7926i -0.2328 - 0.7926i,polyval(c, r(1) ans = -2.5535e-015,2019年6月27日星期四,64,2.4 非线性方程求解函数,fzero 一般的单个超越方程,可以采用fzero函数求解。它结合使用二分法、割线法和可逆二次内插法 fsolve 与fzero函数只能求解单个方程的根不同,fsolve函数可求解非线性方程组的解。其算法采用的是最小二乘法,2019年6月27日星期四,65,2.4.1 函数fzero,x,fval,exitflag,output = fzero(fun,x0,options, p1, p2, .) 此函数的作用求函数fun在x0附件的零值点,x0是标量 fval 函数在解x处的值 exitflag 程序结束情况: 0,程序收敛于解;0,程序没有收敛;0,计算达到了最大次数 output 是一个结构体,提供程序运行的信息;output.iterations,迭代次数;output.functions,函数fun的计算次数;output.algorithm,使用的算法 options 选项,可用optimset函数设定选项的新值 fun可以是函数句柄或匿名函数。,2019年6月27日星期四,66,例题7:,计算以下方程的根 1) 求sinx在3附近的零点; 2) 求cosx在1,2范围内的零点; 3) 4) 本例较简单,可直接在命令窗口输入命令求解: 1) fzero(sin,3) 2) fzero(cos,1,2) 3) fzero(x) x3-2*sin(x),1) 4) fzero(x) x3-2*x-5,1); roots(1 0 -2 -5),2019年6月27日星期四,67,说明,1) 第2小题中,如果所给区间两端方程不异号,则程序出错 2) 除了采用匿名函数外,当然可以采用句柄函数定义函数,例如第三小题可以采用如下程序: function Cha2demo1 x=fzero(fun,1) function y=fun(x) y=x3-2*sin(x); 3) 初值的选择对于解有影响,不同的初值可能获得不同的解 可以根据感兴趣的解的区间确定初值范围 可以作出函数在一定范围内的曲线,直观的确定解的大致范围 4) fzero不能获得多项式的多重根,尤其是复数根。而roots函数求解,则可获得所有根,2019年6月27日星期四,68,例题8,求 的零点,以t为自变量,取值范围为-10t10,a,b为参数,本例取值分别为0.1,0.5,2019年6月27日星期四,70,例题9:,在945.36kPa(9.33atm)、300.2K时,容器中充以2mol氮气,试求容器体积。已知此状态下氮气的P-V-T关系符合范德华方程,其范德华常数为a4.17atmL/mol2,b0.0371L/mol。 数学模型:范德华方程变形可得 这是关于V的非线性方程,可以由fzero求解,2019年6月27日星期四,71,function PVT P = 9.33; % atm T = 300.2; % K n = 2; % mol a = 4.17; b = 0.0371; R = 0.08206; V0 = n*R*T/P % 5.2807 V,fval = fzero(PVTeq,V0,P,T,n,a,b,R) % - function f = PVTeq(V,P,T,n,a,b,R) f = (P + a*n2/V2) * (V-n*b) - n*R*T;,roots:5.0028、0.2429和0.1092,2019年6月27日星期四,72,2.4.2 函数fsolve,与fzero函数只能求解单个方程的根不同,fsolve函数可求解非线性方程组的解。其算法采用的是最小二乘法。 调用格式: x,fval,exitflag,output,jacobian = fsolve(fun,x0,options, p1, p2, .) 输入输出变量的意义同fzero函数 输出变量中的jacobian为函数fun在x处的Jacobian矩阵,定义待求解方程时,必须首先将方程组变换成F(X)=0的形式!,2019年6月27日星期四,73,例题10:,function Chap2demo6 x0=1 1 1; x=fsolve(fun,x0) function y=fun(x) y(1)=sin(x(1)+x(2)2+log(x(3)-7; y(2)=3*x(1)+2x(2)-x(3)3+1; y(3)=x(1)+x(2)+x(3)-5; 解得结果如下:x0.5991 2.3959 2.0050,例题11 自己阅读,2019年6月27日星期四,74,2.5 关系和逻辑运算,2.5.1 关系运算 关系运算的结果是二值逻辑量,它只能取1(T)或0(F) 两个同维矩阵间的关系运算规定为它们对应运算间的关系运算,运算结果仍是一个布尔矩阵 “数”跟“矩阵”进行关系运算,规定为数与矩阵的每个元素进行关系运算,运算结果是一个与矩阵维数相同的布尔矩阵 关系操作符:=(等于),=(不等于),(大于),=(大于等于),=(小于等于) 关系运算函数:isempty,isequal,find,isscalar,isvector,isnan,isinf,isfinite,2019年6月27日星期四,75,例题12:,已知a1= ,a25。求a3=a1=a2的运算结果 a1=1 2 3;4 5 6;7 8 9; a2=5; a3=a1=a2 a3 = 0 0 0 0 1 1 1 1 1,2019年6月27日星期四,76,2.5.2 逻辑运算,2.5.2 逻辑运算 两个逻辑量之间可以进行“与”、“或”和“非”三种基本逻辑运算及由它们组合而成的其它运算 Matlab中的逻辑操作符包括:&(逻辑与),|(逻辑或),(逻辑非),xor(异或),&(先决与)和|(先决否) 逻辑运算的结果仍然是逻辑量0(假)或1(真) 维数相同的矩阵进行逻辑运算时,定义为它们对应运算逻辑量间的逻辑运算结果 Matlab允许数与矩阵间进行逻辑运算,规则与关系运算相同,是数与矩阵各个运算间的逻辑运算,2019年6月27日星期四,77,逻辑运算真值表,2019年6月27日星期四,78,例题13:,求数值矩阵的逻辑“非”,a1和0的“异或” 解:键入 a1=1 0 -5 0;3 -2 0 6;0 0 5 7; 9 2 1 9; a2=a1, a3=xor(a1,0) 回车得到结果 a2 = 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0,a3 = 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 1,2019年6月27日星期四,79,2.5.3 运算符的优先级,Matlab表达式中可能包含多种运算符:数学运算符、关系运算符和逻辑运算符 各运算符执行的先后是根据优先级别执行的 不管运算符的位置如何,具有高优先级的运算符先执行 具有相同优先级别的运算符则按先左后右的次序执行,2019年6月27日星期四,80,运算符的优先级,注:级别1优先级最高,11级别最低,2019年6月27日星期四,81,2.6 Matlab程序流程控制,组成计算机程序的一系列指令语句可以分成两类:运算语句和控制顺序语句 Matlab编程的主要任务是安排调整好控制顺序语句,使运算语句的运行顺序合理,运算简捷省时 MATLAB的程序流程控制主要有if选择语句、switch多重分支、for循环、while循环和trycatch等五种控制结构,2019年6月27日星期四,82,2.6.1 if选择语句,if语句的一般格式: if condition1 statements1 %如果condition1的值为True,则执行该语句组 elseif condition2 statements2 %如果condition2的值为True,则执行该语句组 else statements3 %如果condition1和condition2的都为False,则执行该语句组 end,2019年6月27日星期四,83,说明,condition1和condition2均为逻辑表达式; elseif子句是可选的,数量也不受限制。如果缺省所有的elseif子句,则if语句变为如下格式: if condition statements else statements end 如果else子句也省略,则if语句变为如下格式: if condition statements end,2019年6月27日星期四,84,error函数,当不满足指定条件时,可使用终止某个程序或函数的运行 error函数通常用于确保程序获得有效的分支数值 当程序执行到error函数时,会在命令窗口显示函数所包含的信息,之后终止程序或函数的执行,并将程序控制权返回到命令窗口命令行 error函数可用于程序或函数任何位置,并不限于if,for,switch和while结构,2019年6月27日星期四,85,例题14:,编写一个程序,当输入数字大于0时计算其平方根,当小于0时计算则终止运算并返回错误信息 解: x = input(x=) if x=0 y=sqrt(x) else error(Negative input not allowed) end,2019年6月27日星期四,86,2.6.2 switch多重分支结构,switchcaseotherwise语句的能力与ifelseend语句类似,但对多重选择的情况switch语句使代码更加易读。 switch的一般格式: switch test_expr %测试表达式test_expr可以是标量或字符串 case value statements 当test_expr值是value时,执行该语句组 case value1,value2, statements 当test_expr值是value1或value2或时,执行该语句组 otherwise statements end,2019年6月27日星期四,87,例题15:,编程判断并显示输入自变量x的具体数值时,函数是奇数、偶数(0视为偶数,不分正负),还是其它 解:程序如下 %switch clear,x=input(x=) y=x4-19*x3+x+32; switch mod(y,2) ca

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论