好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

非线性方程求解.ppt

93页
  • 卖家[上传人]:cl****1
  • 文档编号:585987513
  • 上传时间:2024-09-03
  • 文档格式:PPT
  • 文档大小:462.02KB
  • / 93 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 非线性方程(组)求解 引言n在945.36kPa(9.33atm)、300.2K时,容器中充以2mol氮气,试求容器体积已知此状态下氮气的P-V-T关系符合范德华方程,其范德华常数为a=4.17atm•L/mol2, b=0.0371L/moln数学模型:范德华方程变形可得,这是关于V的非线性方程 9/3/20242 本章内容n2.1非线性方程(组)数值求解基本原理n2.2 Matlab函数n2.3 多项式求根函数rootsn2.4 非线性方程求解函数,fzero和fsolven2.5 关系和逻辑运算n2.6 Matlab程序流程控制9/3/20243 非线性方程n与线性方程相比,非线性方程问题无论从理论上还是从计算公式上都要复杂得多 n非线性方程一般形式n方程的解称为方程的根或函数的零点 n对于高次代数方程,当次数>4时,则没有通解公式可用,对于超越方程既不知有几个根,也没有同样的求解方式实际上,对于n≥3代数方程以及超越方程都采用数值方法求近似根 9/3/20244 数值法求根n首选要给出一个初始猜测解,然后通过各种迭代格式使其逐次逼近准确解n初值好坏对迭代收敛性有很大影响,因此初值的选取很重要n对于有专业背景的问题,初值可以按条件选择,对于没有经验的问题,可以用图解法和计算机试算搜索法初估近似解 9/3/20245 2.1.1 逐步扫描法求根的初始近似逐步扫描法求根的初始近似值值n用用数数值值法法求求方方程程的的根根可可分分为为两两步步,,首首先先要要找找出出根根的的某某个个近近似似值值,,又又称称为为“初初始始值值”,,然然后后再再采采用用特特定定算算法法将将初初始始值值逐逐步步接接近近真实值,直到获得满足要求的结果真实值,直到获得满足要求的结果n逐步扫描法9/3/20246 逐步扫描法9/3/20247 2.1.2 求方程根的精确解求方程根的精确解n非线性方程(组)的求解一般采用迭代法进行。

      迭代法迭代法是一种重要的逐次逼近方法这种方法用某个固定公式反复校正根的近似值,使之逐步精确化,最后得到满足精度要求的结果n常见的迭代算法有不动点迭代、二分法、牛顿法、弦截法、威格斯坦法(Wegstein)、抛物线法等 9/3/20248 不动点迭代法不动点迭代法 我们可以通过多种方法将方程式转化为9/3/20249 迭代方程例如方程可以转化为以下不同形式(1)(2)(3)9/3/202410 方程的根n从给定的初值x0,按上式可以得到一个数列:{ x0, x1, x2, …, xk, … }n如果这个数列有极限,则迭代格式是收敛的这时数列{xk}的极限 就是方程的根 9/3/202411 直接迭代法n上述求非线性代数方程式数值解的方法称为直接迭代法(或称为不动点迭代法)这个方法虽然简单,但根本问题在于当k->∞时,xk是否收敛于x*,也就是必须找出收敛的充分条件9/3/202412 不动点n定义定义:函数g(x)的一个不动点(fixed point)是指一个实数P,满足P = g(P)n从图形角度分析,函数y=g(x)的不动点是y=g(x)和y=x的交点 9/3/202413 不动点迭代的图形解释不动点迭代的图形解释 9/3/202414 不动点定理不动点定理 n设有(i) g,g’ ∈C[a,b], (ii) K是一个正常数,(iii) p0∈(a,b), (iv)对所有x ∈[a,b],有g(x)∈[a,b]n如果对于所有x ∈[a,b],有|g’(x)|≤K<1,则迭代pn=g(pn-1)将收敛到惟一的不动点P ∈[a,b]。

      在这种情况下,P称为吸引(attractive)不动点对于所有x ∈[a,b],有|g’(x)| >1,则迭代pn=g(pn-1)将不会收敛到P点在这种情况下,P称为排斥(repelling)不动点,而且迭代显示出局部发散性 9/3/202415 2.1.2.2 二分法二分法9/3/202416 2.1.2.3 牛顿法牛顿法n牛顿法也称为牛顿-拉普森法或者切线法由于这个方法的计算结果颇佳,而计算过程也比较简单,所以被普遍采用n牛顿法的核心内容是通过泰勒级数将非线性方程式转化为线性方程式,然后用迭代法求解 9/3/202417 牛顿公式 n设方程式 的近似根为n则 对 的泰勒级数展开式为9/3/202418 牛顿法示意图YOX9/3/202419 牛顿法注意事项n在单根附近,牛顿公式恒收敛,而且收敛速度很快但是需要注意如果初始值不在根的附近,牛顿公式不一定收敛n在实际使用中,牛顿法最好与逐步扫描法结合起来,先通过逐步扫描法求出根的近似值,然后用牛顿公式求其精确值,以发挥牛顿法收敛速度快的优点 9/3/202420 2.1.2.4 弦截法弦截法n牛顿迭代法收敛速度快,但它要求计算函数导数的值。

      在科学与工程计算中,常会碰到函数导数不易计算或者算式复杂而不便计算的情况 n弦截法的基本思想与牛顿法相似,即将非线性函数线性化后求解两者的差别在于弦截法实现函数线性化的手段采用的是两点间的弦线,而不是某点的切线 9/3/202421 弦截法弦截法示意图YOX9/3/202422 弦截法注意事项n与牛顿法只需给出一个初值不同,弦截法需要给出两个迭代初值如果与逐步扫描法结合起来,则最后搜索的区间的两个端点值常可作为初值n弦截法虽比牛顿法收敛速度稍慢,但在每次迭代中只需计算一次函数值,又不必求函数的导数,且对初值要求不甚苛刻,是工程计算中常用的有效计算方法之一 9/3/202423 2.1.2.5 松弛迭代法松弛迭代法n有些非线性方程用前面的不动点迭代法求解时,迭代过程是发散的这时可以引入松弛因子,利用松弛迭代法通过选择合适的松弛因子,就可以使迭代过程收敛 9/3/202424 松弛法注意事项n由上式可知,当松弛因子ω=1时,松弛迭代法变为不动点迭代法;当松弛因子ω>1时,松弛法使迭代步长加大,可加速迭代,但有可能使原理收敛的迭代变为发散;当0<ω<1时,松弛法使迭代步长减小,这适合于迭代发散或振荡收敛的情况,可使振荡收敛过程加速;当ω<0时,将使迭代反方向进行,可使一些迭代发散过程收敛 9/3/202425 松弛法注意事项n松弛迭代法是否有效的关键因素是松弛因子的值能否正确选定。

      如果值选用适当,能使迭代过程加速,或者使原来不收敛的过程变成收敛;但如果值选用不合适,则效果相反,有时甚至会使原来收敛的过程变得不收敛松弛因子的数值往往要根据经验选定,但选用较小的松弛因子,一般可以保证迭代过程的收敛 9/3/202426 2.1.2.6 威格斯坦法威格斯坦法n威格斯坦法在化工流程模拟中得到了广泛威格斯坦法在化工流程模拟中得到了广泛应用应用 n威格斯坦法是一种迭代加速方法 9/3/202427 Wegstein法的示意图和迭代公式 9/3/202428 Wegstein法注意事项n应注意,如果x1和x2两点选择不当,则连线的斜率等于1,与直线y=x无交点,从而迭代无法进行,这就是Wegstein法应当避免的陷井引入一个量C9/3/202429 Wegstein法注意事项n令q=1-Cn当q=0时,Wegstein法退化为简单的不动点迭代n当00时,迭代能稳定收敛,但收敛较慢n当q<0可以加速收敛,但易导致不稳定n为了加速收敛又避免不稳定,常取-5

      9/3/202430 2.2 Matlab函数函数nMatlab中创建函数有几种方法q最常用的是由function命令创建,可以通过程序、函数或命令窗口来访问q第二种是使用inline命令创建内联函数q第三种创建匿名函数q函数的另一种形式是子函数,在一个函数文件中,如果function关键字出现多次,则在第一个function之后定义的所有函数都称为子函数子函数只能有函数文件的第一个函数和文件内部的其它子函数调用9/3/202431 2.2.1 内联函数(内联函数(inline function))n内联函数的创建内联函数的创建qinline(‘CE’)把串表达式转化为输入变量自动生成的内联函数qinline(‘CE’,arg1,arg2,…)把串表达式转化为arg1,arg2等指定输入变量的内联函数qinline('CE',n)把串表达式转化为x,P1,P2,…,Pn等指定输入变量的内联函数9/3/202432 2.2.1 内联函数(内联函数(inline function))n[说明]q'CE'是字符串;CE表达式不能包含赋值号=q第1种调用格式将自动地对CE进行辨识,把CE中由字母/数字组成的连续字符认做变量,除预定义变量名和常用函数名(如sin)外的有字母/数字组成的连续字符将被认做变量。

      但注意如果连续字符后紧接左圆括号,则不被当作输入变量q第2种方法创建内联函数最稳妥、可靠的方法q第3种方法最简练,但是对输入变量的字符有严格限制输入变量字符只能是x,P1,P2,…,Pn等,注意P必须为大写字母9/3/202433 2.2.1 内联函数(内联函数(inline function))涉及内联函数性质的指令涉及内联函数性质的指令 class(inline_fun)给出内联函数类型char(inline_fun)给出内联函数计算公式argnames(inline_fun)给出内联函数的输入变量vectorize(inline_fun)使内联函数适用数组运算规则9/3/202434 2.2.1 内联函数(内联函数(inline function))例例1::创建一个内联函数,求解下式在x=π/3,π/3.5;a=4,b=1时的值Fx=inline('x.^2.*cos(a*x)-b','x','a','b')Fx = Inline function: Fx(x,a,b) = x.^2.*cos(a*x)-bg=Fx([pi/3 pi/3.5],4,1)g = -1.5483 -1.7259 9/3/202435 2.2.2 匿名函数匿名函数(anonymous function)n匿名函数用于在命令行、函数文件或script文件中创建简单形式的函数,避免另外定义新的函数。

      n匿名函数的定义形式: f=@(arglist)expression9/3/202436 例题例题1::n采用匿名函数计算以下表达式在x=5时的值:q1) f(x)=x2;q2) f(x)=x2,g(x)=3x, h(x)=g(f(x)); q3) α=0.9, f(x)=sin(αx) 9/3/202437 求解n1) f = @(x) x.^2 a = f(5)结果:a = 25n2) f = @(x) x.^2; g = @(x) 3*x; h = @(x) g(f(x)); h(5)结果:ans = 75n3) alpha = 0.9; f = @(x) sin(alpha*x); f(5)结果:ans = -0.9775 9/3/202438 匿名函数n匿名函数用于在命令行、函数文件或script文件中创建简单形式的函数,避免另外定义新的函数nMatlab允许定义多重匿名函数,例如,对于表达式 可以通过以下的匿名函数进行计算 g = @(c) quad(@(x) x.^2+c*x+1,0,1) 此处quad为数值积分函数9/3/202439 2.2.3 子函数子函数n如果在一个函数文件中出现多个function关键字,则在第一个function之后定义的所有函数都称为子函数。

      含有第一个function关键字的表达式叫做主函数主函数是由命令窗口、程序和其它函数调用的唯一函数子函数仅能由主函数和主函数文件中的其它子函数调用 9/3/202440 例题例题2::n牛顿流体在不锈钢管中的流动压降可由下式估算: 其中, 摩擦压降,psi/(100英尺等量管长);M,质量流量,lb/hr;μ,粘度,cP;ρ,密度,lb/ft3,D,管径,inch9/3/202441 例题例题2::n流体密度可由下式描述: ρ,g/ml;对于水,A=0.34710;B=0.2740;Tc=647.13K;n=0.28571n流体粘度由下式描述: μ,cP;对于水,A=-10.2158;B=1.7925E3;C=1.7730E-2;D=-1.2631E-059/3/202442 例题例题2::n计算在1/2英寸不锈管中,以2000lb/hr流量输送水,当水的温度为10、20、30、40、50、60、70、80℃时,压降分别为多少? n编写一个含子函数的函数用于计算不同温度下的压降密度和粘度的计算分别作为子函数 9/3/202443 例题例题2::程序程序::function dP=DeltP2(T)M=2000;D=0.5;Rho=density(T);mu=viscosity(T);dP=(M^1.8)*(mu.^0.2)./(20000*D^4.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;%----------------------------------------------------------------------9/3/202444 例题例题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.45009/3/202445 例题例题2::n此时如果在命令窗口输入ndensity(283)n结果会返回如下错误信息n??? Undefined function or method 'density' for input arguments of type 'double'.n表明density这个函数是不能在命令窗口被直接调用的。

      9/3/202446 2.2.4 变量在函数间的传递变量在函数间的传递n函数中使用的变量名不必和从Matlab命令窗口、程序文件或另一个函数调用此函数时使用的名字一致但是,圆括号的输入变量位置确定了信息的传递顺序-调用语句中的函数第一个参数将值传递到函数接口定义中的第一个参数,依次类推 9/3/202447 例题例题4::n编写函数计算t=[0:pi/4:pi], a=1.4, b=2, c=0.75时x和y的值n首先编写函数ComputeXYfunction [x,y]=ComputeXY(t,a,b,c)x=cos(a*t);y=abs(x)+c;9/3/202448 例题例题4::在命令窗口输入[u,v]=ComputeXY(0:pi/4:pi,1.4,2,0.75)回车可得正确值u = 3.0000 2.4540 1.4122 1.0123 1.6910v = 3.7500 3.2040 2.1622 1.7623 2.44109/3/202449 现在我们采用另一种方法调用函数看结果如何在命令窗口输入t=0:pi/4:pia=1.4b=2c=0.75[u,v]=ComputeXY(a,b,c,t)回车后结果为u = -0.1922v = 0.1922 0.9776 1.7630 2.5484 3.3338可见变量在传递进函数时是按照顺序与函数变量一一对应的,而不是按照变量名对应。

      这与变量的作用域有关9/3/202450 变量按照作用域n变量按照作用域的不同的可以分为局部变量和全局变量n在默认情况下,函数内的变量属于局部变量,它只在函数内有效,而在函数外部不可用n全局变量对于整个程序的所有过程和函数都有效,全局变量可以用global关键字定义,并应同时在主调程序和被调函数中定义n在传递给函数变量数目很大时,创建不同函数访问全局变量是一个好的方法 9/3/202451 全局变量n为说明全局变量的使用,在ComputeXY函数中定义全局变量a, b, c,修改程序如下:qfunction [x,y]=ComputeXY(t)qglobal a b c %注意变量之间用空格而不是逗号或其它标点隔开qx=cos(a*t);qy=abs(x)+c;9/3/202452 全局变量n在命令窗口调用时应采用以下语句qglobal a b cqa=1.4;b=2;c=0.75;q[u,v]=ComputeXY(0:pi/4:pi)则可获得正确结果 9/3/202453 2.2.5*用函数用函数nargin()和和nargout()检检索函数变量数索函数变量数n在自定义函数内使用函数(或命令)nargin和nargout可以确定该函数有多少个输入变量和输出变量被调用,然后用条件语句根据变量数判断选择执行不同的任务 9/3/202454 function c = func(a,b)if (nargin == 1)c = a.^2; %当调用语句只传递一个输入参数给此函数时,执行该语句endif(nargin == 2)c = a + b; %当调用语句传递两个输入参数给此函数时,执行该语句end此函数func()既可以接受1个输入参数,也可以接受两个输入参数 nargin9/3/202455 nargoutn函数nargout的用法与nargin相似。

      这两个函数的运用,大大地提高了自定义函数地功能和灵活性,使自定义函数更具通用性nMATLAB大量的内部函数也正是使用这种方法 9/3/202456 2.2.6 函数句柄函数句柄n创建一个函数句柄,可用于保存函数的所有信息,以便将来对它进行调用n函数句柄可以作为参数传递给其他函数,以调用该函数句柄所属的函数也可以使用feval计算函数值,或采用fplot绘制函数图形n使用函数句柄还可以减少定义函数的文件个数,改善重复操作的性能,保证函数计算的可靠性n执行“help FUNCTION_HANDLE”可了解函数句柄的详细信息 9/3/202457 函数句柄的获取和使用函数句柄的获取和使用nfunhandle = @function_name %function_name为用户指定的函数名nfeval函数的调用格式如下:q[y1, y2, ...] = feval(funhandle, x1, ..., xn)q或[y1, y2, ...] = feval(function, x1, ..., xn)q其中x1, ..., xn为传递给函数的参数值n例如,可以采用以下语句计算例题4中的函数值q[u,v]=feval(@ComputeXY,0:pi/4:pi,1.4,2,0.75)9/3/202458 fplot函数的调用格式nfplot(fun,limits) nfplot(fun,limits,LineSpec)nfplot(fun,limits,tol)n其中fun为函数句柄或匿名函数;limits为坐标轴范围;LineSpec为曲线的控制字符串;tol为相对误差限。

      9/3/202459 例题例题5n采用fplot函数绘制以下函数在[-20 20]区间内的函数图形定义函数function Y = myfun(x)Y = 200*sin(x)./x;输入命令fplot(@myfun,[-20 20]) 9/3/202460 2.3 多项式求根函数多项式求根函数rootsn多项式的表达式约定如下: n对于多项式,用以下行向量表示: 这样就把多项式问题转化为向量问题 nMatlab提供了多种多项式计算函数,如多项式多项式求根函数求根函数roots,求多项式的值,polyval;多项式乘法,conv;多项式除法,deconv;多项式微分,polyder;多项式拟合,polyfit9/3/202461 函数函数rootsnr = roots(c),用于求解多项式的根n其中,行向量c的元素是多项式的系数,按多项式次数降序排列n如果c中含有n+1个元素,则多项式为n次nroots可以获得多项式的所有根n其算法为计算伴随矩阵的特征值 9/3/202462 例题例题6::n求方程 的根>>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 9/3/202463 2.4 非线性方程求解函数nfzeroq一般的单个超越方程,可以采用fzero函数求解。

      它结合使用二分法、割线法和可逆二次内插法 nfsolveq与fzero函数只能求解单个方程的根不同,fsolve函数可求解非线性方程组的解其算法采用的是最小二乘法 9/3/202464 2.4.1 函数函数fzeron[x,fval,exitflag,output] = fzero(fun,x0,options, p1, p2, ...) 此函数的作用求函数fun在x0附件的零值点,x0是标量qfval函数在解x处的值qexitflag 程序结束情况: >0,程序收敛于解;<0,程序没有收敛;=0,计算达到了最大次数qoutput 是一个结构体,提供程序运行的信息;output.iterations,迭代次数;output.functions,函数fun的计算次数;output.algorithm,使用的算法qoptions 选项,可用optimset函数设定选项的新值qfun可以是函数句柄或匿名函数9/3/202465 例题例题7::n计算以下方程的根q1) 求sinx在3附近的零点; q2) 求cosx在[1,2]范围内的零点;q3) q4) n本例较简单,可直接在命令窗口输入命令求解:q1) fzero(@sin,3)q2) fzero(@cos,[1,2])q3) fzero(@(x) x^3-2*sin(x),1)q4) fzero(@(x) x^3-2*x-5,1); roots([1 0 -2 -5])9/3/202466 说明说明1) 第2小题中,如果所给区间两端方程不异号,则程序出错2) 除了采用匿名函数外,当然可以采用句柄函数定义函数,例如第三小题可以采用如下程序: function Cha2demo1 x=fzero(@fun,1) function y=fun(x) y=x^3-2*sin(x);3) 初值的选择对于解有影响,不同的初值可能获得不同的解q可以根据感兴趣的解的区间确定初值范围q可以作出函数在一定范围内的曲线,直观的确定解的大致范围4) fzero不能获得多项式的多重根,尤其是复数根。

      而roots函数求解,则可获得所有根9/3/202467 例题例题8n求 的零点,以t为自变量,取值范围为-10

      其算法采用的是最小二乘法调用格式:调用格式:n[x,fval,exitflag,output,jacobian] = fsolve(fun,x0,options, p1, p2, ...) q输入输出变量的意义同fzero函数q输出变量中的jacobian为函数fun在x处的Jacobian矩阵定义待求解方程时,必须首先将方程组变换成F(X)=0的形式! 9/3/202472 例题例题10:: function Chap2demo6x0=[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)+2^x(2)-x(3)^3+1;y(3)=x(1)+x(2)+x(3)-5;解得结果如下:x=0.5991 2.3959 2.0050 例题例题1111 自己阅读9/3/202473 2.5 关系和逻辑运算关系和逻辑运算2.5.1 关系运算关系运算n关系运算的结果是二值逻辑量,它只能取1(T)或0(F) n两个同维矩阵间的关系运算规定为它们对应运算间的关系运算,运算结果仍是一个布尔矩阵n“数”跟“矩阵”进行关系运算,规定为数与矩阵的每个元素进行关系运算,运算结果是一个与矩阵维数相同的布尔矩阵n关关系系操操作作符符:==(等于),~=(不等于),>(大于),<(小于),>=(大于等于),<=(小于等于)n关系运算函数关系运算函数:isempty,isequal,find,isscalar,isvector,isnan,isinf,isfinite9/3/202474 例题例题12::已知a1= ,a2=5。

      求a3=a1>=a2的运算结果>> a1=[1 2 3;4 5 6;7 8 9]; a2=5; a3=a1>=a2a3 = 0 0 0 0 1 1 1 1 1 9/3/202475 2.5.2 逻辑运算逻辑运算2.5.2 逻辑运算逻辑运算n两个逻辑量之间可以进行“与”、“或”和“非”三种基本逻辑运算及由它们组合而成的其它运算nMatlab中的逻辑操作符包括:&(逻辑与),|(逻辑或),~(逻辑非),xor(异或),&&(先决与)和||(先决否)n逻辑运算的结果仍然是逻辑量0(假)或1(真)n维数相同的矩阵进行逻辑运算时,定义为它们对应运算逻辑量间的逻辑运算结果nMatlab允许数与矩阵间进行逻辑运算,规则与关系运算相同,是数与矩阵各个运算间的逻辑运算9/3/202476 逻辑运算真值表 逻辑量及其运算真值(逻辑量)A1100B1010~A0011~B0101A&B1000A|B1110xor(A,B)0110A&&B1000A||B11109/3/202477 例题例题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 0a3 = 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 19/3/202478 2.5.3 运算符的优先级运算符的优先级nMatlab表达式中可能包含多种运算符:数学运算符、关系运算符和逻辑运算符n各运算符执行的先后是根据优先级别执行的n不管运算符的位置如何,具有高优先级的运算符先执行n具有相同优先级别的运算符则按先左后右的次序执行9/3/202479 运算符的优先级优先级运算符1()2.''.^^3+(uplus)-(uminus)~4.*.\./*\/5+-6:7<>==>=<=~=8&9|10&&11||注:级别1优先级最高,11级别最低9/3/202480 2.6 Matlab程序流程控制程序流程控制n组成计算机程序的一系列指令语句可以分成两类:运算语句运算语句和控制顺序语句控制顺序语句nMatlab编程的主要任务是安排调整好控制顺序语句,使运算语句的运行顺序合理,运算简捷省时nMATLAB的程序流程控制主要有if选择语句、switch多重分支、for循环、while循环和try…catch等五种控制结构 9/3/202481 2.6.1 if选择语句选择语句if语句的一般格式:if condition1 statements1 %如果condition1的值为True,则执行该语句组elseif condition2 statements2 %如果condition2的值为True,则执行该语句组else statements3 %如果condition1和condition2的都为False,则执行该语句组end9/3/202482 说明1.condition1和condition2均为逻辑表达式;2.elseif子句是可选的,数量也不受限制。

      如果缺省所有的elseif子句,则if语句变为如下格式: if condition statements else statements end3.如果else子句也省略,则if语句变为如下格式: if condition statements end9/3/202483 error函数n当不满足指定条件时,可使用终止某个程序或函数的运行nerror函数通常用于确保程序获得有效的分支数值n当程序执行到error函数时,会在命令窗口显示函数所包含的信息,之后终止程序或函数的执行,并将程序控制权返回到命令窗口命令行nerror函数可用于程序或函数任何位置,并不限于if,for,switch和while结构9/3/202484 例题例题14:: 编写一个程序,当输入数字大于0时计算其平方根,当小于0时计算则终止运算并返回错误信息解:解:x = input('x=')if x>=0y=sqrt(x)elseerror('Negative input not allowed')end9/3/202485 2.6.2 switch多重分支结构多重分支结构 switch…case…otherwise语句的能力与if…else…end语句类似,但对多重选择的情况switch语句使代码更加易读。

      switch的一般格式:的一般格式:switch test_expr %测试表达式test_expr可以是标量或字符串case value statements %当test_expr值是value时,执行该语句组case {value1,value2,…} statements %当test_expr值是value1或value2或……时,执行该语句组otherwise statementsend9/3/202486 例题例题15::编程判断并显示输入自变量x的具体数值时,函数是奇数、偶数(0视为偶数,不分正负),还是其它解:解:程序如下%switchclear,x=input('x=')y=x^4-19*x^3+x+32;switch mod(y,2) case 1 disp('It is odd') case 0 disp('It is even') otherwise disp('It is others')end9/3/202487 2.6.3 for循环结构循环结构nfor循环结构用于循环次数已知的情况,其一般格式如下: for 循环变量 = 表达式1(初值):表达式2(步长):表达式3(终值) statements (语句组) endnfor…end循环的执行过程是:先计算初值和终值,并把初值赋给循环变量;再判断循环变量的值是否超过了终值。

      若超过,则退出循环,执行end后面的语句,否则执行循环体的语句组,之后将循环变量加上一个步长,然后重复执行循环体内容,直至循环变量超过终值而退出循环为止9/3/202488 例题例题16::n编程计算1至1000的加和值解:解:编程如下clearj=0;for i=1:1000 j=j+i;endji运行后结果为j = 500500i = 1000n可见循环变量的最终值为表达式的终值9/3/202489 2.6.4 while循环结构循环结构while cndition(表达式) statements(执行语句组)end当MATLAB执行这个while…end循环时会首先测试condition(条件表达式)如果condition为False(零),则直接跳出循环,执行end后面的语句如果condition为True(非零),则执行语句组statements,然后退回到while语句再测试条件例题例题17::求满足的最小整数m解:解:由于终止条件未知,采用while-end循环cleara=0;n=1;while a<=1e4 a=a+n^2;n=n+1;endm=n-1,a9/3/202490 2.6.5 try…catch语句语句ntry…catch是用于对异常进行处理的语句。

      把有可能引起异常的语句放在try控制块中,这样当try控制块中的statement语句引起异常时,catch控制块就可以捕获它,并针对不同的错误类型,进行不同的处理它与C++中的try…catch语句作用一样9/3/202491 2.6.6 编程中的控制语句编程中的控制语句n2.6.6.1 continue语句语句 continue语句通常置于for循环或while循环内,根据条件执行continue语句当执行continue时,即跳出循环体中尚未执行的语句,接着进行下一次是否进行循环的判断n2.6.6.2 break和和pause语句语句 break语句通常也置于for循环或while循环内,根据条件执行break语句,以直接退出最内层的for循环或while循环而用pause语句将使程序暂停以等待用户按键,当用户按下任意键时程序才继续往下执行9/3/202492 2.6.6.3 return语句语句n在某个函数内部执行return语句时,可立即退出该函数,并返回到调用它的函数,继续运行当函数过程已完成每个任务并可直接返回时,return是非常有用的nreturn通常放置于函数内的一个控制结构(如if语句)内。

      执行该函数时,如果符合控制结构的某个条件,则调用return语句终止当前运行,并返回到调用它的函数或环境n该语句的作用与其他高级语言(如FORTRAN)的return语句的作用相同9/3/202493 。

      点击阅读更多内容
      相关文档
      安徽省安全员《A证(企业负责人)》冲刺试卷三.docx 2026年房地产经纪人《房地产经纪业务操作》预测试卷三.docx 安徽省安全员《A证(企业负责人)》模拟试卷一.docx 2026年房地产经纪人《房地产交易制度政策》模拟试卷四.docx 安徽省安全员《B证(项目负责人)》冲刺试卷二.docx 2026年房地产经纪人《房地产经纪专业基础》预测试卷四.docx 2026年房地产经纪人《房地产经纪业务操作》考前点题卷一.docx 2023年通信工程师《通信专业实务(传输与接入-无线)》试题真题及答案.docx 安徽省安全员《A证(企业负责人)》试题精选.docx 2026年房地产经纪人《房地产经纪专业基础》预测试卷二.docx 2026年房地产经纪人《房地产经纪业务操作》考前点题卷二.docx 2026年房地产经纪人《房地产经纪职业导论》冲刺试卷三.docx 2026年房地产经纪人《房地产交易制度政策》冲刺试卷三.docx 2026年房地产经纪人《房地产经纪专业基础》考前点题卷二.docx 2026年房地产经纪人《房地产经纪职业导论》冲刺试卷五.docx 2026年房地产经纪人《房地产经纪职业导论》冲刺试卷四.docx 2026年房地产经纪人《房地产交易制度政策》冲刺试卷一.docx 2026年房地产经纪人《房地产交易制度政策》冲刺试卷四.docx 安徽省安全员《B证(项目负责人)》冲刺试卷三.docx 2026年房地产经纪人《房地产经纪业务操作》模拟试卷二.docx
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.