雅克比迭代算法(Jacobi Iterative Methods) -- [ mpi , c++]


雅克比迭代,一般用來對線性方程組,進行求解。形如:
\(a_{11}*x_{1} + a_{12}*x_{2} + a_{13}*x_{3} = b_{1}\)  
\(a_{21}*x_{1} + a_{22}*x_{2} + a_{23}*x_{3} = b_{2}\)  
\(a_{31}*x_{1} + a_{32}*x_{2} + a_{33}*x_{3} = b_{3}\)  
我們需要求解出\(x_{1}\) ,\(x_{2}\) ,\(x_{3}\),我們對這組方程進行變換:
\(x_{1}=\frac{1}{a_{11}}(b_{1} -a_{12}*x_{2} -a_{13}*x_{3})\)
  \(x_{2}=\frac{1}{a_{21}}(b_{2} -a_{21}*x_{1} -a_{23}*x_{3})\)
\(x_{3}=\frac{1}{a_{31}}(b_{3} -a_{31}*x_{1}-a_{32}*x_{2})\)

我們不妨假設 \(x_{0}^{0}=(X_{1}^{0},X_{2}^{0},X_{3}^{0})\) ,當我們代入上述公式的時候,我們就會得到一組新的 \(x_{0}^{1}=(X_{1}^{1},X_{2}^{1},X_{3}^{1})\) ,此刻我們稱之為一次迭代.
然后我們將得到的X1,X2,X3再次代入公式,我們將會得到第二次迭代, 當我們重復這種迭代的時候,我們會得到第K次迭代:
\(x^{k}=(X_{1}^{k},X_{2}^{k},X_{3}^{k})\) , \(k = 1,2,3...n\)
我們將其歸納成一般式子:

eg: 對於方程組:

求解:
我們先將其變形:

然后,我們假設:
並將其代入得到:

我們將得到的X1,x2,x3再次代入方程中,反復迭代,將會得到如下:

最終我們將會得到一個收斂值,該組值,就是我們得到的解(會非常的逼近真實解)

那么這種方法,也可以用來求解矩陣:
對於方程: Ax =b ; 我們設定 A矩陣為: ,b矩陣為: , x矩陣為:
到這里,每個人都有自己的解法,直接的解法是將 x = \(A^{-1}\)b,但是A的逆矩陣\(A^{-1}\),計算較為復雜,我們這里需要一點小的tricks ,我們將A矩陣拆分成為一個對角矩陣D,下三角矩陣L,上三角矩陣U,即

這樣的話,公式 Ax = b 就變成了 ( D - L -U )
x = b ,然后我們就可以得到:
Dx = b + (L+U)x ,當我們得到這個公式的時候,求解D的逆矩陣就容易了很多,我們得到D的逆矩陣為:

然后,我們將D移到右邊變成:

這個公式,和我們上面描述的雅克比迭代是不是長得很像,然后我們可以將其一般化為:

我們知道A是一個已知的常量矩陣,因而D,L,U都是已知矩陣,那么我們可以簡化為:
\(T = D^{-1}*( L +U)\) , \(c = D^{-1}*b\) ;

根據這一個思想,我們可以得到一個偽代碼:

實現代碼為:

參考資料為:
https://www3.nd.edu/~zxu2/acms40390F12/Lec-7.3.pdf


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM