MATLABを用いて線形方程式群--ヤコビ反復法、ガウスセデル反復法を解く方法

6890 ワード

文書ディレクトリ

  • 前言
  • 直接法
  • 反復法
  • 小結
  • 前言


    今日私たちが言いたいのは数値微積分です.急いで高等数学の微積分と何が違うか見てみましょう.本文は科学計算とMATLAB言語の特別テーマの6第2小節の学習ノートで、もしみんなが時間があれば、授業を聞いてもいいですが、なければ、私のノートを見てもいいです.

    1直接法


    1.線形方程式群の直接解法ガウス(Gauss)消去法列の主元消去法行列の三角分解法ガウス(Gauss)消去法は古典的な直接法であり、それによって改善された列主元消去法は、現在のコンピュータ上で線形方程式群を解く標準アルゴリズムであり、その特徴は消元によって一般線形方程式群の解問題を三角方程式群の解問題に転化することである.また,行列の三角分解法など多くの直接解アルゴリズムがある.(1)左除算演算子を用いた直接解法MATLABは線形方程式群を解くための左除算演算子""を提供し,カラムメタ消去法を用い,非常に便利である.線形方程式群A x=b Ax=b Ax=b Ax=bについては、左除演算子反スラッシュで解くことができ、b左除Aで線形方程式群の数値解xを得ることができる.A x=b Ax=b Ax=b→x=Ab x=Abackslash b x=AbマトリクスAが奇異または奇異に近い場合、MATLABは警告メッセージを与えることに注意してください.例1左除算演算子を用いて以下の線形方程式群を解く.{ 2 x 1 + x 2 − 5 x 3 + x 4 = 13 x 1 − 5 x 2 + 7 x 4 = − 9 2 x 2 + x 3 − x 4 = 6 x 1 + 6 x 2 − x 3 − 4 x 4 = 0\left\{\begin{aligned} 2x_1+x_2-5x_3+x_4=13\\x_1-5x_2+7x_4=-9\\2x_2+x_3-x_4=6\\x_1+6x_2-x_3-4x_4=0\end{aligned}\right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​2x1​+x2​−5x3​+x4​=13x1​−5x2​+7x4​=−92x2​+x3​−x4​=6x1​+6x2​−x3​−4x4​=0​
    A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
    b=[13,-9,6,0]';
    x=A\b
    

    (2)行列分解を用いて線形方程式群の行列分解を解くことはアルゴリズムを設計する重要な技術であり、1つの与えられた行列をいくつかの特殊なタイプの行列の積に分解し、それによって1つの一般的な行列計算問題をいくつかの求めやすい特殊な行列の計算問題に変換することを指す.行列分解法により線形方程式群を解く利点は,演算速度が速く,記憶空間を節約できることである.LU分解QR分解Cholesky分解1 LU分解の基本思想行列のLU分解は、1つのn次行列を1つの下三角行列と1つの上三角行列の積として表すことである.線形代数では,行列が非特異である限り,LU分解は常に可能であることが実証されている.A = L U → A x = b → L U x = b A=LU →Ax=b→LUx=b A=LU→Ax=b→LUx=b→ { L y = b U x = y\left\{\begin{aligned}Ly=b\\Ux=y\end{aligned}\right. {Ly=bUx=yは三角方程式に対して簡単に解くことができるので、ベクトルyを最初に解いてLy=bにして、Ux=yを解いて、それによって線形方程式群Ax=bを解く目的を達成する.2 MATLABのLU分解関数LU分解関数は列のメタLU分解アルゴリズムによって定義されて、比較的に良いデータ安定性を持つ.lu関数は2種類の呼び出しフォーマットがある:[L,U]=lu(A):A=LUを満たすように、上三角アレイUと変換形式の下三角アレイLを生成する.なお、ここでの行列Aは方形行列でなければならない.[L,U,P]=lu(A):上三角行列Uと下三角行列Lと置換行列Pを生成し、PA=LUを満たす.同様に、行列Aは方形行列でなければならない.第1のフォーマットを使用する場合、行列Lは下三角行列ではないことが多いが、行交換によって下三角行列になることができる.③線形方程式群A x=bAx=bAx=bAx=b→L U x=b LUx=b LUx=b→x=x=U(Lb)x=backslash(Lbackslash b)x=U(Lb)またはA x=bAx=bAx=bAx=b→P A x=Pb PAx=PbPAx=Pb→L U x=P b LUx=PbLUx=PbLUx=PbLUx=Pb→x=x=x=x=U(L∗b)x=backbackslash(L*b)x=x=x=backslash(L*b)x=x=x=x=b U(L∗b)はLU分解により演算速度を大幅に向上させることができる.例2例1の線形方程式群をLU分解で解く.
    A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
    b=[13,-9,6,0]';
    [L,U]=lu(A);
    x=U\(L\b)
    
    x =
      -66.5556
       25.6667
      -18.7778
       26.5556
    

    2反復法


    2.線形方程式グループの反復解法反復法は変数の原値を絶えずその新しい値を出す過程であり、コンピュータで問題を解決する基本的な方法である.{ 10 x 1 − x 2 = 9 − x 1 + 10 x 2 − 2 x 3 = 7 − 2 x 2 + 10 x 3 = 6\left\{\begin{aligned} 10x_1-x_2=9\\-x_1+10x_2-2x_3=7\\-2x_2+10x_3=6\end{aligned}\right. ⎩⎪⎨⎪⎧​10x1​−x2​=9−x1​+10x2​−2x3​=7−2x2​+10x3​=6​    ⟹   \implies ⟹ { x 2 = 10 x 1 − 9 x 1 = 10 x 2 − 2 x 3 − 7 x 3 = ( 6 + 2 x 2 ) 10\left\{\begin{aligned} x_2&=10x_1-9\\x_1&=10x_2-2x_3-7\\x_3&=(6+2x_2)10\end{aligned}\right. ⎩⎪⎨⎪⎧​x2​x1​x3​​=10x1​−9=10x2​−2x3​−7=(6+2x2​)10​    ⟹   \implies ⟹ { x 1 k + 1 = 10 x 2 k − 2 x 3 k − 7 x 2 k + 1 = 10 x 1 k − 9 x 3 k + 1 = 0.6 + 0.2 x 2 k\left\{\begin{aligned} x_1^{k+1}&=10x_2^{k}-2x_3^{k}-7\\x_2^{k+1}&=10x_1^{k}-9\\x_3^{k+1}&=0.6+0.2x_2^{k}\end{aligned}\right. ⎩⎪(D−L−U)x=b D = [ a 11 a 22 ⋱ a n n ] D=\left [\begin{array}{cccc} a_{11} & & &\\& a_{22} & &\\& &\ddots &\\& & & a_{nn}\end{array}\right] D=⎣⎢⎢⎡​a11​​a22​​⋱​ann​​⎦⎥⎥⎤​ L = − [ 0 a 21 0 a 31 a 32 0 ⋮ ⋮ ⋮ ⋱ a n 1 a n 2 ⋯ ⋯ 0 ] L=-\left [\begin{array}{cccc} 0 & && &\\a_{21} & 0 && &\\a_{31} & a_{32} &0& &\\\vdots &\vdots&\vdots &\ddots&\\a_{n1} & a_{n2}&\cdots&\cdots&0\end{array}\right] L=−⎣⎢⎢⎢⎢⎢⎡​0a21​a31​⋮an1​​0a32​⋮an2​​0⋮⋯​⋱⋯​0​⎦⎥⎥⎥⎥⎥⎤​ U = − [ 0 a 12 a 13 ⋯ a 1 n 0 a 23 ⋯ a 2 n ⋱ ⋱ ⋮ ⋱ a n − 1 n 0 ] U=-\left [\begin{array}{cccc} 0 & a_{12} &a_{13}&\cdots & a_{1n}\\& 0 &a_{23}&\cdots &a_{2n}\\& &\ddots&\ddots &\vdots\\& & &\ddots&a_{n-1n}\\&&& &0\end{array}\right] U=−⎣⎢⎢⎢⎢⎢⎡​0​a12​0​a13​a23​⋱​⋯⋯⋱⋱​a1n​a2n​⋮an−1n​0​⎦⎥⎥⎥⎥⎥⎤​
    解式は、x=D−1(L+U)x+D−1 b x=D^{−1}(L+U)x+D^{−1}bx=D−1(L+U)x+D−1(L+U)x+D−1 bに対応する反復式は、x k+1=D−1(L+U)x k+D−1 bx^{k+1}=D^{−1}(L+U)x^{k}+D^{k}+D^{k}+D^{k}+D}+1}b xk+1(L+U)xk+D−1(L+U)xk+D−1 b(B=D−1(L+U),f=D−1 bimplies(B=D^{−1}(L+U),f=D^{−1}b⟹(B=D−1(L+U),f=D-1 b)m:
    function [y,n]=jacobi(A,b,x0,ep)
    D=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)>=ep
        x0=y;
        y=B*x0+f;
        n=n+1;
    end
    

    (2)Gauss‐Serdel反復法D x k+1=(L+U)x k+b→D x k+1=L x k+1+U x k+b→(D−L)x k+1=U x k+1+U x+b→(D−L)x k+1=U x k+b x+1=(D−L)−1 U× 0 + ( U − L ) − 1 b → B = D − L − 1 U , f = D − L − 1 b → x k + 1 = B x k + f Dx^{k+1}=(L+U)x^{k}+b →Dx^{k+1}=Lx^{k+1}+Ux^k+b→ (D-L)x^{k+1}=Ux^{k}+b\\x^{k+1}=(D-L)^{-1}U×0+(U-L)^{-1}b →B=D-L^{-1}U,f=D-L^{-1}b→ x^{k+1}=Bx^{k}+f Dxk+1=(L+U)xk+b→Dxk+1=Lxk+1+Uxk+b→(D−L)xk+1=Uxk+bxk+1=(D−L)−1U×0+(U-L)-1 b→B=D-L-1 U,f=D-L-1 b→xk+1=Bxk+f Gauss-Serdel反復法の関数ファイルgauseidel.m
    function [y,n]=gauseidel(A,b,x0,ep)
    D=diag(diag(A));
    L=-tril(A,-1); 
    U=-triu(A,1);
    B=(D-L)\U;
    f=(D-L)\b;
    y=B*x0+f;
    n=1;
    while norm(y-x0)>=ep
        x0=y;
        y=B*x0+f;
        n=n+1;
    end
    
    
    

    例3ヤコビ反復法とGauss−Seedel反復法をそれぞれ用いて線形方程式群を解いた.反復初期値を0、反復精度を10^(-6)に設定します.[ 4 − 2 − 1 − 2 4 3 − 1 − 3 3 ]\left[\begin{matrix} 4&-2&-1\\-2&4&3\\-1&-3&3\end{matrix}\right] ⎣⎡​4−2−1​−24−3​−133​⎦⎤​ [ x 1 x 2 x 3 ]\left[\begin{matrix} x_1\\x_2\\x_3\end{matrix}\right] ⎣⎡​x1​x2​x3​​⎦⎤​= [ 1 5 0 ]\left[\begin{matrix} 1\\5\\0\end{matrix}\right] ⎣⎡​150​⎦⎤​
    A=[4,-2,-1;-2,4,3;-1,-3,3];
    b=[1,5,0]';
    [x,n]=jacobi(A,b,[0,0,0]',1.0e-6)
    [x,n]=gauseidel(A,b,[0,0,0]',1.0e-6)
    
    x =
        0.9706
        0.8529
        1.1765
    n =
        35
    x =
        0.9706
        0.8529
        1.1765
    n =
        16
    

    例4ヤコビ反復法とGauss−セデル反復法を用いて,収束するかどうかを調べるために,以下の線形方程式群をそれぞれ解いた.[ 1 − 2 2 1 1 1 2 2 1 ]\left[\begin{matrix} 1&-2&2\\1&1&1\\2&2&1\end{matrix}\right] ⎣⎡​112​−212​211​⎦⎤​ [ x 1 x 2 x 3 ]\left[\begin{matrix} x_1\\x_2\\x_3\end{matrix}\right] ⎣⎡​x1​x2​x3​​⎦⎤​= [ 9 7 6 ]\left[\begin{matrix} 9\\7\\6\end{matrix}\right] ⎣⎡​976​⎦⎤​
    A=[1,2,-2;1,1,1;2,2,1];
    b=[9;7;6];
    [x,n]=jacobi(A,b,[0;0;0],1.0e-6)
    [x,n]=gauseidel(A,b,[0;0;0],1.0e-6)
    
    x =
       -27
        26
         8
    n =
         4
    x =
       NaN
       NaN
       NaN
    n =
        1012
    

    小結


    直接法:行列の初等変換を基礎として、方程式群の正確な解を求めることができる.占有するメモリ空間が大きく、プログラムの実現が複雑である.一般に,低次稠密線形方程式群を解くのに適している.反復法:与えられた初期値から正確な解に徐々に近づく過程で、解の過程は記憶空間を占有し、プログラム設計が簡単である.大型疎行列の線形方程式グループを解くのに適している.アルゴリズムの収束性を考慮しなければならない.皆さんは覚えましたか.また、Markdownの公式神器であるK a t e xKatex Katexを共有し、美しい公式を編集するために、公式サポートドキュメントを多く見ることができます.最后に1つのボタンの3连がなくて、しかしみんなを歓迎してほめて、コレクション⭐,転送、質問、アドバイスがあれば、コメントエリアにメッセージを残してください.