zoukankan      html  css  js  c++  java
  • MATLAB线性方程组的迭代求解法

    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
    作者:凯鲁嘎吉
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    文件I/O(二)
    linux学习之文件I/O篇(一)
    静态库和共享库
    vim-ide
    CentOS6 vsftpd 安装及优化方法
    Redmine2.5+CentOS6+Apache2
    分享一个TP5实现Create()方法的心得
    Windows证书的生成导出以及使用证书验证文件是否被修改
    如何设置程序UAC控制
    关于C#的可变长参数
  • 原文地址:https://www.cnblogs.com/kailugaji/p/6932399.html
Copyright © 2011-2022 走看看