1. 程式人生 > >用高斯下降法解多元一次方程組(C++實現)

用高斯下降法解多元一次方程組(C++實現)

    昨天演算法上機出了一道求多元一次方程組的題目,大神們早早就提交了,而我弄了很久,然而並不能在規定時間內完成。究其原因,是線性代數的知識已經忘光了。痛定思痛,我決定把這個題目弄出來,上傳到CSDN部落格,以警醒我日後仍需多加用功。
    本文的程式碼涉及到以下幾個易忘點:
動態輸入,換行時停止輸入
動態構建二維陣列
函式傳遞二維陣列
    閱讀本文程式碼需要基礎:線性代數矩陣轉化
    演算法輸入:2 -1 1 1                                    
           4 1 -1 5                                    
           1 1 1 0 
    演算法輸出:1 0 -1
    程式碼如下所示:
//==================================================||
//                                                  ||
//用高斯下降法解多元一次方程組                      ||
//Input:2 -1 1 1                                    ||
//      4 1 -1 5                                    ||
//      1 1 1 0                                     ||
//Output:1 0 -1                                     ||
//                                                  ||
//Coding by Wison                                   ||
//2015/5/10                                         ||
//                                                  ||
//==================================================||


#include<iostream>
using namespace std;


//高斯下降法求輸入陣列的上三角形等價矩陣
void gaussElimination(double** A,int size1,int size2)
{
	double B[100][100]={};
	for(int i=0;i<size1;++i)
		for(int j=0;j<size2;++j)
			B[i][j]=A[i][j];
	for(int i=0;i<size1-1;++i)
	{
		for(int j=i+1;j<size1;++j)
			for(int k=i;k<size2;++k)
			{
				A[j][k]=A[j][k]-A[i][k]*B[j][i]/B[i][i];
			}
		for(int p=0;p<size1;++p)
			for(int q=0;q<size2;++q)
				B[p][q]=A[p][q];
	}
}

//逆推導上三角形等價矩陣,求輸出陣列
void decodeMatrix(double** A,int size1,int size2,double* AN,int sizean)
{
	for(int i=size1-1;i>=0;i--)
	{
		double temp=A[i][size2-1];
		for(int k=i;k<size1-1;k++)
		{
			temp=A[i][size2-1]-A[i][k+1]*AN[k+1];
		}
		AN[i]=temp/A[i][i];
	}
}

int main()
{
	//先建立第一個輸入陣列,確定輸入規模
	double input[10];

	//輸入規模
	int size=0;

	//得出輸入規模,併為第一個陣列賦值
	for(;;)
	{
		cin>>input[size++];
		if(getchar()=='\n')
			break;
	}

	//如果輸入規模大於1,則有效
	if(size>1)
	{
		//建一個二維陣列,首先賦行數
		double** A=new double*[size-1];
		
		//為二維陣列賦列數
		for(int i=0;i<size-1;++i)
		{
			A[i]=new double[size];
		}

		//為二維陣列賦第一個陣列的值
		for(int i=0;i<size;i++)
		{
			A[0][i]=input[i];
		}

		//為二位陣列賦其他行的值
		for(int i=1;i<size-1;++i)
		{
			for(int col=0;;col++)
			{
				cin>>A[i][col];
				if(getchar()=='\n')
					break;
			}
		}

		//建立一個輸出陣列
		double *an=new double[size-1];

		//先將輸入陣列放進高斯下降函式,求上三角形等價矩陣
		gaussElimination(A,size-1,size);

		//再通過對上三角形等價矩陣求逆推導,得出輸出陣列
		decodeMatrix(A,size-1,size,an,size-1);

		//輸出陣列列印
		for(int i=0;i<size-1;++i)
			cout<<an[i]<<" ";
	}
	else
	{
		//輸入格式有錯
		cout<<"你所輸入未夠--請從新輸入"<<endl;
	}

	system ("pause");
	return 0;
}