MATLAB線性方程組的迭代求解法
作者:凱魯嘎吉 - 博客園
http://www.cnblogs.com/kailugaji/
一、實驗目的
1. 借助矩陣按模最大特征值,判斷解方程組的Jacobi迭代法所得迭代序列的斂散性。
2. 會在Jacobi迭代法所得迭代序列收斂時,用修改后的Gauss-Seidel迭代法。
3. 會逐次超松馳迭代法。
二、實驗原理
三、實驗程序
四、實驗內容
用上面前二種方法求解4元線性方程組的近似解,所選方程組盡可能可以用多種方法求得收斂解。
注:要注意判斷迭代法收斂性,方法之一就是用程序求矩陣的按模最大特征值。
五、解答
1.(程序)
(1)Jacobi迭代法源程序:
function x=jacobi(a,b,x0,n,tol,m) x=zeros(n,1); for k=0:m for i=1:n s=0; for j=1:n if j~=i s=s+a(i,j)*x0(j,1); end end x(i,1)=(b(i,1)-s)/a(i,i); if norm(x-x0,inf)<tol break; end x0(i,1)=x(i,1); end end
(2)Gauss-Seidel迭代法源程序:
function x=gauss_seidel(a,b,x0,n,tol,m) x=zeros(n,1); for k=0:m for i=1:n s=0;s2=0; for j=1:i-1 s2=s2+a(i,j)*x(j,1); end for j=i+1:n s=s+a(i,j)*x0(j,1); end x(i,1)=(b(i,1)-s-s2)/a(i,i); if norm(x-x0,inf)<tol break; end x0(i,1)=x(i,1); end end
2.(運算結果)
(1)求解線性方程組
>> a=[8 -3 2;4 11 -1;6 3 12];b=[20 33 36]';x0=[0 0 0]'; >> x=jacobi(a,b,x0,3,1e-6,50) x = 3.0000 2.0000 1.0000
(2)Gauss-Seidel迭代法
>> a=[8 -3 2;4 11 -1;6 3 12];b=[20 33 36]';x0=[0 0 0]'; >> x=gauss_seidel(a,b,x0,3,1e-6,50) x = 3.0000 2.0000 1.0000
3.(拓展(方法改進、體會等))
逐次超松馳迭代法源程序:
function x=SOR(a,b,x0,n,w,tol,m) x=zeros(n,1); for k=0:m for i=1:n s=0;s2=0; for j=1:i-1 s2=s2+a(i,j)*x(j,1); end for j=i+1:n s=s+a(i,j)*x0(j,1); end x(i,1)=(1-w)*x0(i,1)+w*(b(i,1)-s-s2)/a(i,i); if norm(x-x0,inf)<tol break; end x0(i,1)=x(i,1); end end
運算結果:
>> a=[-4 1 1 1;1 -4 1 1;1 1 -4 1;1 1 1 -4];b=[1 1 1 1]';x0=[0 0 0 0]'; >> x=SOR(a,b,x0,4,1,1e-6,20) x = -1.0000 -1.0000 -1.0000 -1.0000