天天看點

用C語言編寫高斯消元法解線性方程組

這裡我解的是10階方程,可在代碼處修改方程階數;将要帶入的資料寫到文本檔案裡,并在代碼處修改對應的路徑

#include <iostream>
#include <fstream>

using namespace std;

#define MAX_NUM 1000
double A[MAX_NUM][MAX_NUM];
double b[MAX_NUM];
double x[MAX_NUM] = { 0 };

// 請順序高斯消去法
// A:系數矩陣, 是一個nxn的矩陣
// x: 要求的解,是一個n維的向量
// b: 右端項,是一個n維的向量
// n: 向量的次元
void gauss(double A[][MAX_NUM], double *x, double *b, int n) 
{
	/*這裡是你的程式*/
	
	int i,j,k;
    double mik;//消元過程所用變量
    double S;//回代過程所用變量
    //消元
    for(k=0; k<n-1; k++)
    {
        if(!A[k][k])
            return;
        for(i=k+1; i<n; i++)
        {
            mik=A[i][k]/A[k][k];
            for(j=k; j<n; j++)
            {
                A[i][j]=A[i][j]-mik*A[k][j];
            }
            b[i]=b[i]-mik*b[k];
        }
        printf("######### k = %d \n",k);
		for (i = 0; i < n; i++) {
			for (j = 0; j < n; j++) {
				cout << A[i][j] << " ";
			}
		cout << endl;
		} 
    }
    
    //回代 
    x[n-1]=b[n-1]/A[n-1][n-1];    
    for(k=n-2; k>=0; k--)
    {
        S=b[k];
        for(j=k+1; j<n; j++)
        {
            S=S-A[k][j]*x[j];
        }
        x[k]=S/A[k][k];
    }
	return;
}

int main()
{
	int n = 10;  //這裡的n與Data.txt中的行數是一緻的。
	ifstream fin;
	int i, j;
	fin.open("D:\\Data.txt");  // 資料存放在D:\\Data.txt中
	//從檔案中讀取資料
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			fin >> A[i][j];
		}
		fin >> b[i];
	}
	fin.close();
	
	//列印系數矩陣A和右端項b
	cout << "A = " << endl;
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			cout << A[i][j] << " ";
		}
		cout << endl;
	}
	cout << "\nb = " << endl;
	for (i = 0; i < n; i++) {
		cout << b[i] << " ";
	}
	cout << endl;
	
	// 調用順序高斯消去法來求解線性方程組Ax=b
	gauss(A, x, b, n);

	// 列印線性方程組的解x
	cout << "\nx = " << endl;
	for (i = 0; i < n; i++) {
		printf("%.10f ",x[i]);
	}
	cout << endl;
	return 0;
}
           

繼續閱讀