线性方程组的迭代法解法

(一)实验目的与要求

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迭代法的渐进收敛速度最快。

原文地址:http://www.cnblogs.com/zhangfurong/p/16879261.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性