Jacobi迭代 c++代碼

最近在看流體的論文,其中提到線性方程組的解的問題,查詢相關內容的時候看到了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的第一句,你試試看結果怎樣?



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章