雅克比疊代法

雅克比疊代法

雅克比疊代法就是眾多疊代法中比較早且較簡單的一種,其命名也是為紀念普魯士著名數學家雅可比。雅克比疊代法的計算公式簡單,每疊代一次只需計算一次矩陣和向量的乘法,且計算過程中原始矩陣A始終不變,比較容易並行計算。

概念,疊代過程,收斂性,優缺點,程式實現示例,

概念

考慮線性方程組Ax = b時,一般當A為低階稠密矩陣時,用主元消去法解此方程組是有效方法。但是,對於由工程技術中產生的大型稀疏矩陣方程組(A的階數很高,但零元素較多,例如求某些偏微分方程數值解所產生的線性方程組),利用疊代法求解此方程組就是合適的,在計算機記憶體和運算兩方面,疊代法通常都可利用A中有大量零元素的特點。雅克比疊代法就是眾多疊代法中比較早且較簡單的一種,其命名也是為紀念普魯士著名數學家雅可比

疊代過程

首先將方程組中的係數矩陣A分解成三部分,即:A = L+D+U,如圖1所示,其中D為對角陣,L為下三角矩陣U為上三角矩陣。
之後確定疊代格式,X^(k+1) = B*X^(k) +f ,(這裡^表示的是上標,括弧內數字即疊代次數),如圖2所示,其中B稱為疊代矩陣,雅克比疊代法中一般記為J。(k = 0,1,......)
再選取初始疊代向量X^(0),開始逐次疊代。

收斂性

Ax= b,其中A=D+L+U非奇異矩陣,且對角陣D也非奇異,則當疊代矩陣J的譜半徑ρ(J)<1時,雅克比疊代法收斂。

優缺點

雅克比疊代法的優點明顯,計算公式簡單,每疊代一次只需計算一次矩陣和向量的乘法,且計算過程中原始矩陣A始終不變,比較容易並行計算。然而這種疊代方式收斂速度較慢,而且占據的存儲空間較大,所以工程中一般不直接用雅克比疊代法,而用其改進方法。

程式實現示例

#include<stdio.h>
#include<math.h>
#include <stdlib.h>
main(){
float e=0.001,z,m,a[3][3]={5,2,1,-1,4,2,2,-3,10},b[3]={-12,20,3},x[3]={0,0,0},y[3];
int n=3,j,i,k=1;
while(1) {
for(i=0;i<3;i++) {
for(j=0;j<3;j++)
m=m+a[i][j]*x[j];
m=m-x[i]*a[i][i];
y[i]=(b[i]-m)/a[i][i];
m=0;
}
i=0;
while(i<3) {
z=fabs(x[i]-y[i]);
if(z>e)
break;
i++;
}
if(i!=3) {
for(i=0;i<3;i++)
x[i]=y[i];
k++;
}
else if(i==3)
break;
}
printf("%f\n%f\n%f\n",y[0],y[1],y[2]);
}
/*********求解方程:    8 * x1 - 3 * x2 + 2 * x3 = 20    4 * x1 - 11 * x2 - x3 = 33    6 * x1 + 3 * x2 + 12 * x3 = 36    精確解:    x1 = 3, x2 = 2, x3 = 1--->疊代公式:    x1^(k+1) = (3 * x2^(k) - 2 * x3^(k) + 20) / 8;    x2^(k+1) = (-4 * x1^(k) + 1 * x3^(k) + 33) / 11;    x2^(k+1) = (-6 * x1^(k) - 3 * x2^(k) + 36) / 12;*/#include<stdio.h>#include <stdlib.h>struct X {    float x1;    float x2;    float x3;};X jcobi(X& v){    X r;    r.x1 = (3 * v.x2 - 2 * v.x3 + 20) / 8;    r.x2 = (-4 * v.x1 + v.x3 + 33) / 11;    r.x3 = (-6 * v.x1 - 3 * v.x2 + 36) / 12;    return r;}void main() {   X v = {0,0,0};    int iteration = 20;    while (iteration-- > 0) {   v = jcobi(v);    }    printf("%f\n%f\n%f\n", v.x1, v.x2, v.x3);}

相關詞條

熱門詞條

聯絡我們