matlab求解代数方程组
- 格式:doc
- 大小:800.00 KB
- 文档页数:15
1 第三讲 Matlab求解代数方程组 理论介绍:直接法+迭代法,简单介绍相关知识和应用条件及注意事项 软件求解:各种求解程序 讨论如下表示含有n个未知数、由n个方程构成的线性方程组:
11112211211222221122nnnnnnnnnnaxaxaxbaxaxaxbaxaxaxb (1) 一、直接法 1.高斯消元法: 高斯消元法的基本原理:
在(1)中设110,a将第一行乘以111,kaa加到第(2,3,,),kkn得:
(1)(1)(1)(1)11112211(2)(1)(2)22112(2)(2)(2)22nnnnnnnnnaxaxaxbaxaxbaxaxb (2) 其中(1)(1)1111,.kkaabb再设(2)220,a将(2)式的第二行乘以(2)2(2)22,(3,,)kakna加到第k行,如此进行下去最终得到:
(1)(1)(1)(1)11112211(2)(1)(2)22112(1)(1)(1)1,111,1()()nn
nn
nnnnnnnnnnnnnnnnaxaxaxbaxaxbaxaxbaxb
(3)
从(3)式最后一个方程解出nx,代入它上面的一个方程解出1nx,并如此进行下去,即可依次将121,,,,nnxxxx全部解出,这样在()0(1,2,,)kkkakn的假设下,由上而下的消元由下而上的回代,构成了方程组的高斯消元法. 高斯消元法的矩阵表示: 若记11(),(,,),(,,)TTijnnnnAaxxxbbb,则(1)式可表为.Axb于是高斯 2
消元法的过程可用矩阵表示为: 121121.nnMMMAxMMMb 其中:
(1)21(1)111
(1)1(1)11111n
aaMaa
(2)32(2)222
(2)2(2)221111n
aaMaa
高斯消元法的Matlab程序: %顺序gauss消去法,gauss函数 function[A,u]=gauss(a,n) for k=1:n-1 %消去过程 for i=k+1:n for j=k+1:n+1 %如果a(k,k)=0,则不能削去 if abs(a(k,k))>1e-6 %计算第k步的增广矩阵 a(i,j)=a(i,j)-a(i,k)/a(k,k)*a(k,j); else %a(k,k)=0,顺序gauss消去失败 disp(‘顺序gauss消去失败‘); pause; exit; end end end end 3
%回代过程 x(n)=a(n,n+1)/a(n,n); for i=n-1:-1:1 s=0; for j=i+1:n s=s+a(i,j)*x(j); end x(i)=(a(i,n+1)-s)/a(i,i); end %返回gauss消去后的增广矩阵 A=triu(a); %返回方程组的解 u=x; 练习和分析与思考: 用高斯消元法解方程组:
1234512451234512451245
2471523814476192536xxxxxxxxxxxxxxxxxxxxxx
2.列主元素消元法
在高斯消元法中进行到第k步时,不论()kika是否为0,都按列选择()||(,,)kikaikn中最大的一个,称为列主元,将列主元所在行与第k行交换再
按高斯消元法进行下去称为列主元素消元法。 列主元素消元法的matlab程序 %列主元guass消去函数 function[A,u]=gauss(a,n) %消去过程 for k=1:n-1 %选主元 4
c=0; for q=k:n if abs(a(q,k))>c c=a(q,k); l=q; end end %如果主元为0,则矩阵A不可逆 if abs(c)<1e-10 disp(‘error’); pause; exit end %如果l不等于k,则交换第l行和第k行 if l~=k for q=k:n+1 temp=a(k,q); a(k,q)=a(l,q); a(l,q)=temp; end end %计算第k步的元素值 for i=k+1:n for j=k+1:n a(i,j)=a(i,j)-a(i,k)/a(k,k)*a(k,j); end end end %回代过程 x(n)=a(n,n+1)/a(n,n); 5
for i=n-1:-1:1 s=0; for j=i+1:n s=a+a(i,j)*x(j); end x(i)=(a(i,n+1)-s)/a(i,i); end %返回列主元gauss消去后的增广矩阵 A=triu(a); %返回方程组的解 u=x; 练习和分析与思考: 用列主元消去法重新求解gauss消元法求解的上述问题。 二、迭代法 1.迭代法的总体思想 (1)迭代公式的构造: 对线性方程组Axb,可以构造迭代公式(1)(),kkXBXf给出(0),X由迭代公式的(),kX如果()kX收敛于*,X则*X就是原方程组的解。 (2)矩阵的分解: 设线性方程组Axb,其中A非奇异,则可以把A矩阵分解:ADLU,
1122[,,,]nnDdiagaaa,
121312123231321,12300000000nn
nnnnnaaaaaaLaaUaaaa
于是Axb化为11(),xDLUxDb与之对应的迭代公式为: (1)1()1().kkxDLUxDb
2.雅可比(Jacobian)迭代法公式: 6
11(),BDLUfDb
用A矩阵的元素表示为: ()1,(1),(1,2,,)nkiijjjjikiiibaxxina
Jacobian迭代法的Matlab程序 function [y,n]=jacobi(A,b,x0,eps) %误差 if nargin==3 eps=1.0e-6; elseif nargin<3 error return end %求A的对角矩阵,下三角阵,上三角阵 D=diag(A);diag(diag(A))? L=-tril(A,-1); U=-triu(A,1); 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 7
练习和分析与思考: 利用Jacobian迭代法求解方程组:
1323412324
312263155248xxxxxxxxxx
3.高斯-塞德尔(Gauss-Seidel)迭代法公式:
将Jacobi迭代公式(1)()()kkDxLUxb改进为(1)(1)()kkkDxLxUxb,于是得到(1)1()1()()kkxDLUxDLb. 11(),()BDLUfDLb
用A矩阵的元素表示为: 1()()11(1),(1,2,,)inkkiijjijjjikiiibaxaxina
Gauss-Seidel迭代法的Matlab程序 function [y,n]=gauseidel(A,b,x0,eps) %误差 if nargin==3 eps=1.0e-6; elseif nargin<3 error return end %求A的对角矩阵,下三角阵,上三角阵 D=diag(A);diag(diag(A))? L=-tril(A,-1); U=-triu(A,1); G=(D-L)\U; f=(D-L)\b; y=G*x0+f;