线性方程组的迭代法解法
(一)实验目的与要求
1.通过编程计算实践,理解体会古典迭代法的思想。
2.通过编程计算实践,熟练各种算法的计算流程。
3.通过各种方法对同一题目的求解,体会各种方法的精度差异。
4.通过编程计算实践,深入领会和掌握迭代算法的改进思路,提高对算法
改进技巧的本质的认识以及算法流程的实际控制技术。
(二)实验内容或原理
1.分别用Jacobi/Gauss-Seidel/SOR迭代法解上述线性方程组。
2.画出上述三种简单迭代算法算法流程图。
3.分析各种方法的差异率:分析收敛速度和总计算量之间的关系。
(三)实验主要仪器设备及材料
PC微机,Mcrosoft Windows 操作系统,Microsoft Office Powerpoint 2003。C语言等计算机编程语言。
(四)实验报告要求
填写实验报告,包括姓名、学号、专业班级和实验名称等项。完成以下各项具体要求后,交给老师。
Jacobi迭代法
l 程序:
function x=jacobi(A,b,x0,ep,N)
n=length(b);
if nargin>5,Warning('传递的参数个数错误');end
if nargin<5,N=500;end
if nargin<4,ep=1e-6;end
if nargin<3,x0=zeros(n,1);end
x=zeros(n,1);k=0;
while k<N
for i=1:n
x(i)=(b(i)-A(i,[1:i-1,i+1:n])*x0([1:i-1,i+1:n]))/A(i,i);
end
if norm(x-x0,inf)<ep,break;end
x0=x;k=k+1;
end
if k==N,Warning('已达到迭代次数上限');end
D=diag(diag(A)) %对角矩阵
L=-tril(A,-1) %负下三角矩阵
U=-triu(A,1) %负上三角矩阵
B1=inv(D)*(L+U) %迭代矩阵B
rate_1=-log(abs(eigs(B1,1))); %渐进收敛速度
disp(['迭代次数k=',num2str(k)])
disp(['收敛速度rate=',num2str(rate_1)])
l 运行结果:
B1 =
0 0.2500 0 0
0.2500 0 0.2500 0
0 0.2500 0 0.2500
0 0 0.2500 0
迭代次数k=17
收敛速度rate=0.90508
x =
1.3264
-0.5345
2.0355
1.3464
Gauss-Seidel迭代法
l 程序:
function x=nags(A,b,x0,e,N)
n=length(b);
if nargin<5,N=500;end
if nargin<4,e=1e-4;end
if nargin<3,x0=zeros(n,1);end
x=x0;x0=x+2*e;
k=0;Al=tril(A);iAl=inv(Al); %%Al为A的下三角矩阵
while norm(x0-x,inf)>e&k<N,
k=k+1;
x0=x;x=-iAl*(A-Al)*x0+iAl*b;
x'
end
if k==N,Warning('已达迭代次数上限');end
D=diag(diag(A))
L=-tril(A,-1)
U=-triu(A,1)
B2=inv(D-L)*U
rate_2=-log(abs(eigs(B2,1))) %渐进收敛速度
disp(['迭代次数k=',num2str(k)])
disp(['收敛速度rate=',num2str(rate_2)])
l 运行结果:
B2 =
0 0.2500 0 0
0 0.0625 0.2500 0
0 0.0156 0.0625 0.2500
0 0.0039 0.0156 0.0625
rate_2 =
1.8102
迭代次数k=8
收敛速度rate=1.8102
x =
1.3264
-0.5345
2.0355
1.3464
SOR迭代法
l 程序:
function x=nasor(A,b,omega,x0,e,N)
n=length(b);
if nargin<6,N=500;end
if nargin<5,e=1e-4;end
if nargin<4,x0=zeros(n,1);end
if nargin<3,omega=1.05;end
x=x0;x0=x+2*e;
k=0;L=tril(A,-1);U=triu(A,1);
while norm(x0-x,inf)>e&k<N,
k=k+1,x0=x;
for i=1:n
x1(i)=(b(i)-L(i,1:i-1)*x(1:i-1,1)-U(i,i+1:n)*x0(i+1:n,1))/A(i,i);
x(i)=(1-omega)*x0(i)+omega*x1(i);
end
x'
end
if k==N,Warning('已达迭代次数上限');end
D=diag(diag(A))
L=-tril(A,-1)
U=-triu(A,1)
B3=inv((D-omega*L))*((1-omega)*D+omega*U)
rate_3=-log(abs(eigs(B3,1))) %渐进收敛速度
disp(['迭代次数k=',num2str(k)])
disp(['收敛速度rate=',num2str(rate_3)])
l 运行结果:
B3 =
-0.0500 0.2625 0 0
-0.0131 0.0189 0.2625 0
-0.0034 0.0050 0.0189 0.2625
-0.0009 0.0013 0.0050 0.0189
rate_3 =
2.9957
迭代次数k=6
收敛速度rate=2.9957
x =
1.3264
-0.5345
2.0355
1.3464
收敛速度
由运行结果可知,jacobi迭代法的渐进收敛速度最快。
标签:迭代,线性方程组,nargin,rate,0.2500,迭代法,x0,解法 From: https://www.cnblogs.com/zhangfurong/p/16879261.html