matlab解方程与最优化问题求解

上传人:shaoy****1971 文档编号:111941766 上传时间:2019-11-04 格式:PPT 页数:86 大小:817.05KB
返回 下载 相关 举报
matlab解方程与最优化问题求解_第1页
第1页 / 共86页
matlab解方程与最优化问题求解_第2页
第2页 / 共86页
matlab解方程与最优化问题求解_第3页
第3页 / 共86页
matlab解方程与最优化问题求解_第4页
第4页 / 共86页
matlab解方程与最优化问题求解_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《matlab解方程与最优化问题求解》由会员分享,可在线阅读,更多相关《matlab解方程与最优化问题求解(86页珍藏版)》请在金锄头文库上搜索。

1、MATLAB程序设计教程(第二版 ) 刘卫国 主编 中国水利水电出版社 第6章 MATLAB解方程与最优化问题求解 u MATLAB线性方程组求解 u MATLAB非线性方程数值求解 u MATLAB常微分方程初值问题的数值解法 u MATLAB最优化问题求解 背景 经济与工程中的许多问题最后都可以转化为求解线 性方程组 许多数值计算问题(如样条函数、常微分方程数值 解、差分方程等)的研究也往往归结为此类问题 线性方程组的数值法 直接法经过有限次算法运算求出精确解,最常 用的是:高斯消元法、矩阵LU分解 迭代法从初值出发,用递推的方法,给出近似 解序列。常用的方法:雅可比迭代法、高斯-赛德 尔

2、迭代法。 列昂杰夫的“投入-产出”模型:列昂惕夫 用线性代数研究经济数学模型,1949年曾 用计算机计算出了由美国统计局的25万条 经济数据所组成的42个未知数42个方程的 方程组。 投入产出分析的方法基础包括:线性方程 组和矩阵运算(静态模型)、微分方程和 差分方程(动态模型)、电子计算机。 第三章 矩阵代 数 设有n个经济部门,xi为部门i的总产出,cij为部 门j单位产品对部门i产品的消耗,di为外部对部 门i的需求,fj为部门j新创造的价值。 分配平衡方程组 消耗平衡方程组 i =1,2,n 第三章 矩阵代 数 令 C =(cij),X = (x1, , xn),D = (d1, ,

3、dn),F= (f1, , fn), 则 X=CX+D 令 A = EC,E为单位矩阵,则 AX = D C称为直接消耗矩阵 A称为列昂杰夫(Leontief)矩阵。 *7 第三章 矩阵代 数 Y = 1,1,1 B Y表示各部门的总投入,称为投入向量。 新创造价值向量 F=X Y B=C B表示各部门间 的投入产出关 系,称为投入 产出矩阵。 其中 常数项 所谓一般线性方程组是指具有形式: 由m个方程n个未知量的线性方程构成的方程组 矩阵形式: 6.1 线性方程组求解 6.1.1 直接解法 1利用左除运算符的直接解法 对于线性方程组可以利用左除运算符“”求解: x=Ab; (1) 若A为nn

4、方阵,自动利用高斯消元法求解,若b 是n1的列向量,则解x为n1的列向量,若b是nm的矩 阵,可得到m个以A为系数矩阵的线性方程组的数值解x (nm的矩阵),即x(:,j)=Ab(:,j),j=1,2,m. (2) 当A不是方阵时, Ax=b称为欠定方程组或超定方程 组,MATLAB会在最小二乘意义下解 例6-1 用直接解法求解下列线性方程组。 命令如下: A=2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4; b=13,-9,6,0;%右边常数项应该是列向量 x=Ab 2利用矩阵的分解求解线性方程组 矩阵分解是指根据一定的原理用某种算法将 一个矩阵分解成若干个矩阵的乘

5、积。常见 的矩阵分解有LU分解、QR分解、 Cholesky分解,以及Schur分解、 Hessenberg分解、奇异分解等。 优点:运算速度快,节省存储空间 (1) LU分解 矩阵的LU分解就是将一个矩阵表示为一个交换 下三角矩阵和一个上三角矩阵的乘积形式。线 性代数中已经证明,只要方阵A是非奇异的, LU分解总是可以进行的。 MATLAB提供的lu函数用于对矩阵进行LU分解,其调用格式 为: (1)L,U=lu(X):产生一个上三角阵U和一个变换形式的下 三角阵L(行交换),使之满足X=LU。注意,这里的矩阵X必 须是方阵。 此时矩阵L往往不是下三角阵,但通过行交换后使之成为 一个下三角阵

6、 (2)L,U,P=lu(X):产生一个上三角阵U和一个下三角阵L以 及一个置换矩阵P,使之满足PX=LU。当然矩阵X同样必须 是方阵。 实现LU分解后,线性方程组Ax=b的解x=U(Lb)或 x=U(LPb),这样可以大大提高运算速度。 矩阵LU分解,设 命令如下: A=1,-1,1;5,-4,3;2,1,1; L,U=lu(A) %第(1)种格式 LU=L*U %检验分解是否正确 L,U ,P=lu(A) LU=L*U %检验分解是否正确 LU=inv(P)*L*U %检验分解是否正确 例6-2 用LU分解求解例6-1中的线性方程组。 命令如下: A=2,1,-5,1;1,-5,0,7;0

7、,2,1,-1;1,6,-1,-4; b=13,-9,6,0; L,U=lu(A); x=U(Lb) %或采用LU分解的第2种格式,命令如下: L,U ,P=lu(A); x=U(LP*b) (2) QR分解 对矩阵X进行QR分解,就是把X分解为一个正交矩 阵Q和一个上三角矩阵R的乘积形式。QR分解只 能对方阵进行。MATLAB的函数qr可用于对矩阵 进行QR分解,其调用格式为: (1) Q,R=qr(X):产生一个一个正交矩阵Q和一个上 三角矩阵R,使之满足X=QR。 (2) Q,R,E=qr(X):产生一个一个正交矩阵Q、一个 上三角矩阵R以及一个置换矩阵E,使之满足 XE=QR。 实现Q

8、R分解后,线性方程组Ax=b的解x=R(Qb)或 x=E(R(Qb)。 矩阵QR分解,设 命令如下: A=1,-1,1;5,-4,3;2,7,10; Q,R=qr(A) %第(1)种格式 QR=Q*R%检验分解是否正确 Q,R,E=qr(A) QR=Q*R %检验分解是否正确 QR=Q*R /E%检验分解是否正确 例6-3 用QR分解求解例6-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(Qb) %或采用QR分解的第2种格式,命令如下: Q,R,E=qr(A); x=E*(

9、R(Qb) (3) Cholesky分解 如果矩阵X是对称正定的,则Cholesky分解将矩阵X 分解成一个下三角矩阵和上三角矩阵的乘积。设上 三角矩阵为R,则下三角矩阵为其转置,即X=RR 。 MATLAB函数chol(X)用于对矩阵X进行Cholesky分 解,其调用格式为: (1)R=chol(X):产生一个上三角阵R,使RR=X。 若X为非对称正定,则输出一个出错信息。 (2)R,p=chol(X):这个命令格式将不输出出错信 息。当X为对称正定的,则p=0,R与上述格式得到 的结果相同;否则p为一个正整数。如果X为满秩 矩阵,则R为一个阶数为q=p-1的上三角阵,且满 足RR=X(1

10、:q,1:q)。 实现Cholesky分解后,线性方程组Ax=b变成RRx=b ,所以x=R(Rb)。 矩阵Cholesky分解,设 命令如下: A=2,1,1;1,2,1;1,-1,3; R=chol(A) %第(1)种格式 R*R %检验分解是否正确 R,p=chol(A) p=0,则A是正定矩阵,对一个非正定矩阵进行 Cholesky分解,将得出错误信息,因而该方 法可用来判断矩阵是否是正定矩阵 例6-4 用Cholesky分解求解例6-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(

11、A) ? Error using = chol Matrix must be positive definite 命令执行时,出现错误信息,说明A为非正定矩阵。 6.1.2 迭代解法 迭代解法非常适合求解大型系数矩阵的方程组。在 数值分析中,迭代解法主要包括 Jacobi迭代法、 Gauss-Serdel迭代法、超松弛迭代法和两步迭代 法。 1Jacobi迭代法 对于线性方程组Ax=b,如果A为非奇异方阵,即 aii0(i=1,2,n),则可将A分解为A=D-L-U,其 中D为对角阵,其元素为A的对角元素,L与U为 A的下三角阵和上三角阵,于是Ax=b化为: x=D-1(L+U)x+D-1b

12、与之对应的迭代公式为: x(k+1)=D-1(L+U)x(k)+D-1b 这就是Jacobi迭代公式。如果序列x(k+1)收敛于x ,则x必是方程Ax=b的解。 Jacobi迭代法的MATLAB函数文件Jacobi.m如下: function y,n=jacobi(A,b,x0,eps) if nargin=3 eps=1.0e-6; elseif nargin=eps x0=y; y=B*x0+f; n=n+1; end 例6-5 用Jacobi迭代法求解下列线性方程组。设迭 代初值为0,迭代精度为10-6。 在命令中调用函数文件Jacobi.m,命令如下: A=10,-1,0;-1,10,

13、-2;0,-2,10; b=9,7,6; x,n=jacobi(A,b,0,0,0,1.0e-6) 2Gauss-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迭代用新分量代替旧分量,精 度会高些。 Gauss-Serdel迭代法的MATLAB函数文件gauseidel.m如下: functi

14、on y,n=gauseidel(A,b,x0,eps) if nargin=3 eps=1.0e-6; elseif nargin=eps x0=y; y=G*x0+f; n=n+1; end 例6-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) 例6-7 分别用Jacobi迭代和Gauss-Serdel迭代法 求解下列线性方程组,看是否收敛。 命令如下

15、: 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) 6.2 非线性方程数值求解 6.2.1 单变量非线性方程求解 在MATLAB中提供了一个fzero函数,可以用来求单变 量非线性方程的根。该函数的调用格式为: z=fzero(fname,x0,tol,trace) 其中fname是待求根的函数文件名,x0为搜索的起点。一 个函数可能有多个根,但fzero函数只给出离x0最近的那 个根。tol控制结果的相对精度,缺省时取tol=eps,trace 指定迭代信息是否在运算中显示,为1时显示,为0时不 显示,缺省时取trace=0。 例6-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 6.2.2 非线性方程组的求解 对于非线性方程组F(X)=0,用fsolve函数求其数值解。 fsolve函数的调用格式为: X=fsolve(fun,X0,option) 其中X为返回的解,fun是用于定义需求解的非线性方程组 的函数文件名,X0是求根过程的初值,o

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号