最近在看流體的論文,其中提到線性方程組的解的問題,查詢相關內容的時候看到了Jacobi迭代的方法,因爲之前就總是聽到大名鼎鼎的雅可比行列式,這回自己試着寫了寫代碼,其實非常簡單,也是通過這次寫代碼,我發現其實數學公式的算法代碼並不難,難的是怎麼用數學的思維寫代碼!
先上代碼:
著名本實驗是參考網上的一個實驗,因爲第一次寫,所以想驗證自己的結果對不對,代碼絕對原創。
#include <math.h>
#include <stdio.h>
using namespace std;
void jacobi(double A[3][3],double b[3],double x[3],double e)
{
int i,j;
double X[3],sub,ep,p,m=0;
bool flag;
do{
flag = false;
for( i=0;i<3;i++)
X[i]=x[i];
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(j!=i)
m += A[i][j]*X[j];
}
x[i]=(b[i]-m)/A[i][i];
m=0;
}
for(int i=0;i<3;i++)
{
sub = fabs(x[i]-X[i]);
if(sub>e)
{
flag = true;
}
}
if(flag==false)
{
break;
}
}while(true);
}
void main()
{
double A [3][3]={{4,1,1},{1,4,1},{1,1,4}};
double b[3] = {7,10,7};
double x[3] = {0,0,0};
double e=1e-4;
int i;
jacobi(A,b,x,e);
for( i=0;i<3;i++)
{
cout<<x[i]<<endl;
}
}
結果:
雅可比迭代的原理其實非常簡單,下面簡單介紹一下:
怎麼樣,是不是很簡單,實際最終要的就是這一句;另外大家千萬要注意使用變量前一定要初始化,不然可能出現不同的狀況,例如代碼中m變量不初始化,把它放在第一個for的第一句,你試試看結果怎樣?