首页 第7章 MATLAB解方程与函数极值

第7章 MATLAB解方程与函数极值

举报
开通vip

第7章 MATLAB解方程与函数极值 第7章 MATLAB解方程与函数极值 7.1 线性方程组求解 7.2 非线性方程数值求解 7.3 常微分方程初值问题的数值解法 7.4 函数极值 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 7.1 线性方程组求解 7.1.1 直接解法 1...

第7章  MATLAB解方程与函数极值
第7章 MATLAB解方程与函数极值 7.1 线性方程组求解 7.2 非线性方程数值求解 7.3 常微分方程初值问题的数值解法 7.4 函数极值 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 7.1 线性方程组求解 7.1.1 直接解法 1.利用左除运算符的直接解法 对于线性方程组Ax=b,可以利用左除运算符“\”求解: x=A\b m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 例7-1 用直接解法求解下列线性方程组。 命令如下: A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4]; b=[13,-9,6,0]'; x=A\b m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 2.利用矩阵的分解求解线性方程组 矩阵分解是指根据一定的原理用某种算法将一个矩阵分解成 若干个矩阵的乘积。常见的矩阵分解有LU分解、QR分解、 Cholesky分解,以及Schur分解、Hessenberg分解、奇异 分解等。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / (1) LU分解 矩阵的LU分解就是将一个矩阵表示为一个交换下三角矩阵 和一个上三角矩阵的乘积形式。线性代数中已经证明,只 要方阵A是非奇异的,LU分解总是可以进行的。 MATLAB提供的lu函数用于对矩阵进行LU分解,其调用格 式为: [L,U]=lu(X):产生一个上三角阵U和一个变换形式的下三角 阵L(行交换),使之满足X=LU。注意,这里的矩阵X必须 是方阵。 [L,U,P]=lu(X):产生一个上三角阵U和一个下三角阵L以及 一个置换矩阵P,使之满足PX=LU。当然矩阵X同样必须 是方阵。 实现LU分解后,线性方程组Ax=b的解x=U\(L\b)或 x=U\(L\Pb),这样可以大大提高运算速度。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 例7-2 用LU分解求解例7-1中的线性方程组。 命令如下: A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4]; b=[13,-9,6,0]'; [L,U]=lu(A); x=U\(L\b) 或采用LU分解的第2种格式,命令如下: [L,U ,P]=lu(A); x=U\(L\P*b) m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / (2) QR分解 对矩阵X进行QR分解,就是把X分解为一个正交矩阵Q和一 个上三角矩阵R的乘积形式。QR分解只能对方阵进行。 MATLAB的函数qr可用于对矩阵进行QR分解,其调用格 式为: [Q,R]=qr(X):产生一个一个正交矩阵Q和一个上三角矩阵R, 使之满足X=QR。 [Q,R,E]=qr(X):产生一个一个正交矩阵Q、一个上三角矩阵 R以及一个置换矩阵E,使之满足XE=QR。 实现QR分解后,线性方程组Ax=b的解x=R\(Q\b)或 x=E(R\(Q\b))。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 例7-3 用QR分解求解例7-1中的线性方程组。 命令如下: A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4]; b=[13,-9,6,0]'; [Q,R]=qr(A); x=R\(Q\b) 或采用QR分解的第2种格式,命令如下: [Q,R,E]=qr(A); x=E*(R\(Q\b)) m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / (3) Cholesky分解 如果矩阵X是对称正定的,则Cholesky分解将矩阵X分解成 一个下三角矩阵和上三角矩阵的乘积。设上三角矩阵为R, 则下三角矩阵为其转置,即X=R'R。MATLAB函数 chol(X)用于对矩阵X进行Cholesky分解,其调用格式为: R=chol(X):产生一个上三角阵R,使R'R=X。若X为非对称 正定,则输出一个出错信息。 [R,p]=chol(X):这个命令格式将不输出出错信息。当X为对 称正定的,则p=0,R与上述格式得到的结果相同;否则p 为一个正整数。如果X为满秩矩阵,则R为一个阶数为 q=p-1的上三角阵,且满足R'R=X(1:q,1:q)。 实现Cholesky分解后,线性方程组Ax=b变成R‘Rx=b,所以 x=R\(R’\b)。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 例7-4 用Cholesky分解求解例7-1中的线性方程组。 命令如下: A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4]; b=[13,-9,6,0]'; R=chol(A) ??? Error using ==> chol Matrix must be positive definite 命令执行时,出现错误信息,说明A为非正定矩阵。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 7.1.2 迭代解法 迭代解法非常适合求解大型系数矩阵的方程组。在数值分析 中,迭代解法主要包括 Jacobi迭代法、Gauss-Serdel迭代 法、超松弛迭代法和两步迭代法。 1.Jacobi迭代法 对于线性方程组Ax=b,如果A为非奇异方阵,即 aii≠0(i=1,2,…,n),则可将A分解为A=D-L-U,其中D为对 角阵,其元素为A的对角元素,L与U为A的下三角阵和上 三角阵,于是Ax=b化为: x=D-1(L+U)x+D-1b 与之对应的迭代公式为: x(k+1)=D-1(L+U)x(k)+D-1b 这就是Jacobi迭代公式。如果序列{x(k+1)}收敛于x,则x必 是方程Ax=b的解。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / Jacobi迭代法的MATLAB函数文件Jacobi.m如下: function [y,n]=jacobi(A,b,x0,eps) if nargin==3 eps=1.0e-6; elseif nargin<3 error return end D=diag(diag(A)); %求A的对角矩阵 L=-tril(A,-1); %求A的下三角阵 U=-triu(A,1); %求A的上三角阵 B=D\(L+U); f=D\b; y=B*x0+f; n=1; %迭代次数 while norm(y-x0)>=eps x0=y; y=B*x0+f; n=n+1; end m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 例7-5 用Jacobi迭代法求解下列线性方程组。设迭代初值为0, 迭代精度为10-6。 在命令中调用函数文件Jacobi.m,命令如下: A=[10,-1,0;-1,10,-2;0,-2,10]; b=[9,7,6]'; [x,n]=jacobi(A,b,[0,0,0]',1.0e-6) m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 2.Gauss-Serdel迭代法 在Jacobi迭代过程中,计算时,已经得到,不必再用,即原 来的迭代公式Dx(k+1)=(L+U)x(k)+b可以改进为 Dx(k+1)=Lx(k+1)+Ux(k)+b,于是得到: x(k+1)=(D-L)-1Ux(k)+(D-L)-1b 该式即为Gauss-Serdel迭代公式。和Jacobi迭代相比, Gauss-Serdel迭代用新分量代替旧分量,精度会高些。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / Gauss-Serdel迭代法的MATLAB函数文件gauseidel.m如下: function [y,n]=gauseidel(A,b,x0,eps) if nargin==3 eps=1.0e-6; elseif nargin<3 error return end D=diag(diag(A)); %求A的对角矩阵 L=-tril(A,-1); %求A的下三角阵 U=-triu(A,1); %求A的上三角阵 G=(D-L)\U; f=(D-L)\b; y=G*x0+f; n=1; %迭代次数 while norm(y-x0)>=eps x0=y; y=G*x0+f; n=n+1; end m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 例7-6 用Gauss-Serdel迭代法求解下列线性方程组。设迭代 初值为0,迭代精度为10-6。 在命令中调用函数文件gauseidel.m,命令如下: A=[10,-1,0;-1,10,-2;0,-2,10]; b=[9,7,6]'; [x,n]=gauseidel(A,b,[0,0,0]',1.0e-6) m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 例7-7 分别用Jacobi迭代和Gauss-Serdel迭代法求解下列线性 方程组,看是否收敛。 命令如下: a=[1,2,-2;1,1,1;2,2,1]; b=[9;7;6]; [x,n]=jacobi(a,b,[0;0;0]) [x,n]=gauseidel(a,b,[0;0;0]) m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 7.2 非线性方程数值求解 7.2.1 单变量非线性方程求解 在MATLAB中提供了一个fzero函数,可以用来求 单变量非线性方程的根。该函数的调用格式为: z=fzero('fname',x0,tol,trace) 其中fname是待求根的函数文件名,x0为搜索的起 点。一个函数可能有多个根,但fzero函数只给出 离x0最近的那个根。tol控制结果的相对精度,缺 省时取tol=eps,trace指定迭代信息是否在运算中 显示,为1时显示,为0时不显示,缺省时取 trace=0。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 例7-8 求f(x)=x-10x+2=0在x0=0.5附近的根。 步骤如下: (1) 建立函数文件funx.m。 function fx=funx(x) fx=x-10.^x+2; (2) 调用fzero函数求根。 z=fzero('funx',0.5) z = 0.3758 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 7.2.2 非线性方程组的求解 对于非线性方程组F(X)=0,用fsolve函数求其数值解。 fsolve函数的调用格式为: X=fsolve('fun',X0,option) 其中X为返回的解,fun是用于定义需求解的非线性方程组的 函数文件名,X0是求根过程的初值,option为最优化工具 箱的选项设定。最优化工具箱提供了20多个选项,用户可 以使用optimset命令将它们显示出来。如果想改变其中某 个选项,则可以调用optimset()函数来完成。例如, Display选项决定函数调用时中间结果的显示方式,其中 ‘off’为不显示,‘iter’表示每步都显示,‘final’只显示 最终结果。optimset(‘Display’,‘off’)将设定Display选项为 ‘off’。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 例7-9 求下列非线性方程组在(0.5,0.5) 附近的数值解。 (1) 建立函数文件myfun.m。 function q=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.6354 0.3734 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 将求得的解代回原方程,可以检验结果是否正确,命令如下: q=myfun(x) q = 1.0e-009 * 0.2375 0.2957 可见得到了较高精度的结果。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 7.3 常微分方程初值问题的数值解法 7.3.1 龙格-库塔法简介 7.3.2 龙格-库塔法的实现 基于龙格-库塔法,MATLAB提供了求常微分方程数值 解的函数,一般调用格式为: [t,y]=ode23('fname',tspan,y0) [t,y]=ode45('fname',tspan,y0) 其中fname是定义f(t,y)的函数文件名,该函数文件必须返回 一个列向量。tspan形式为[t0,tf],表示求解区间。y0是初始 状态列向量。t和y分别给出时间向量和相应的状态向量。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 例7-10 设有初值问题,试求其数值解,并与精确解相比较 (精确解为y(t)=)。 (1) 建立函数文件funt.m。 function yp=funt(t,y) yp=(y^2-t-2)/4/(t+1); (2) 求解微分方程。 t0=0;tf=10; y0=2; [t,y]=ode23('funt',[t0,tf],y0); %求数值解 y1=sqrt(t+1)+1; %求精确解 t' y' y1' y为数值解,y1为精确值,显然两者近似。m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 例7-11 求解著名的Van der Pol方程。 例7-12 有Lorenz模型的状态方程,试绘制系统相平面图。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 7.4 函数极值 MATLAB提供了基于单纯形算法求解函数极值的函数 fmin和fmins,它们分别用于单变量函数和多变量函数的 最小值,其调用格式为: x=fmin('fname',x1,x2) x=fmins('fname',x0) 这两个函数的调用格式相似。其中fmin函数用于求单变量函 数的最小值点。fname是被最小化的目标函数名,x1和x2 限定自变量的取值范围。fmins函数用于求多变量函数的 最小值点,x0是求解的初始值向量。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / MATLAB没有专门提供求函数最大值的函数,但只要注意 到-f(x)在区间(a,b)上的最小值就是f(x)在(a,b)的最大值, 所以fmin(f,x1,x2)返回函数f(x)在区间(x1,x2)上的最大值。 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 例7-13 求f(x)=x3-2x-5在[0,5]内的最小值点。 (1) 建立函数文件mymin.m。 function fx=mymin(x) fx=x.^3-2*x-5; (2) 调用fmin函数求最小值点。 x=fmin('mymin',0,5) x= 0.8165 m a t l a b ? ? ? ? :h t t p :/ /5 1c cs j .t a o b a o .c o m / m a t l a b ? ? ? ? :h t t p :/ /c h e n g ch e n g t e ch .t a o b a o .c o m / 幻灯片编号 1 幻灯片编号 2 幻灯片编号 3 幻灯片编号 4 幻灯片编号 5 幻灯片编号 6 幻灯片编号 7 幻灯片编号 8 幻灯片编号 9 幻灯片编号 10 幻灯片编号 11 幻灯片编号 12 幻灯片编号 13 幻灯片编号 14 幻灯片编号 15 幻灯片编号 16 幻灯片编号 17 幻灯片编号 18 幻灯片编号 19 幻灯片编号 20 幻灯片编号 21 幻灯片编号 22 幻灯片编号 23 幻灯片编号 24 幻灯片编号 25 幻灯片编号 26 幻灯片编号 27 幻灯片编号 28
本文档为【第7章 MATLAB解方程与函数极值】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_740086
暂无简介~
格式:pdf
大小:240KB
软件:PDF阅读器
页数:28
分类:工学
上传时间:2012-09-21
浏览量:35