列主元求解矩阵

//运行环境VS2010
//要求矩阵对角线无0元素
#include<iostream>
#include<math.h>
#include<fstream>
#include<iomanip>
#include<string>
#include<stdlib.h>
using namespace std;
int main()
{
	double **A_B_Matrix;   //行列式
    double *Ans;           //行列式的解
	double dd;           //无用缓存
	char c;             //无用缓存
	string s;            //无用缓存
	int n=0;               //矩阵的行数
	int m=0;              //矩阵的列数
	ifstream read("data.dat");
	while(getline(read,s))      //检测文件中矩阵有几行
	{
		n++;
	}
	read.close();
	read.open("data.dat");
	while(1)                 //检测矩阵有几列
	{
          read>>dd;
		  m++;
		  c=read.peek();
		  if('
'==c)
			  break;
	}
	read.close();
	if(m==n+1)
	{
		cout<<"行列式有唯一解"<<endl;
	}
	else
	{
		cout<<"此题无解或解不唯一"<<endl;
		exit(1);
	}
	Ans=new double[n+1];
	Ans[n]=0;
	A_B_Matrix=(double **)new double *[n];
	for(int i=0;i!=n;i++)
	{
		A_B_Matrix[i]=new double[n+1];
	}
	int nn=0;
	read.open("data.dat");
	while(!read.eof())                //将文件中的行列式读入A_B_Matrix
	{
		for(int i=0;i!=m;i++)
		{
			read>>A_B_Matrix[nn][i];
		}
		nn++;
	}
	read.close();
    for( int i=0;i!=n;i++)         //寻找列中较大值
	{
		double *Tem_Matrix;    //行交换时中间值
		Tem_Matrix=new double[n+1];
	    int Tem_R;     //最大值所在行缓存值
		Tem_R=i;
		for(int j=i+1;j!=n;j++)                //选出列中最大值所在的行
		{
			if(fabs(A_B_Matrix[Tem_R][i])<fabs(A_B_Matrix[j][i]))
			{
				Tem_R=j;                 
			}
		}
		for(int x=0;x!=n+1;x++)      //行交换
		{
			Tem_Matrix[x]=A_B_Matrix[Tem_R][x];
			A_B_Matrix[Tem_R][x]=A_B_Matrix[i][x]; 
			A_B_Matrix[i][x]=Tem_Matrix[x];       
		}
		for(int x=i+1;x!=n;x++)           //形成下三角为0的矩阵
		{
           double tem ;    //行与行之间的倍数
		   tem=-A_B_Matrix[x][i]/A_B_Matrix[i][i];
		   for(int m=0;m!=n+1;m++)                //将对应列下变为0
		   {   
			   A_B_Matrix[x][m]=A_B_Matrix[i][m]*tem+A_B_Matrix[x][m];
		   }
		}
	}
	cout<<"化简后的行列式为"<<endl;
	for(int i=0;i!=n;i++)
	{
		for(int j=0;j!=n+1;j++)
		{
			cout<<left<<setw(8)<<A_B_Matrix[i][j]<<'	';
		}
		cout<<'
';
	}
	cout<<"其解为"<<endl;
	for(int i=n-1;i!=-1;i--)          //求解
	{
		double sum=A_B_Matrix[i][n];         
		for(int j=i;j!=n;j++)
		{
			sum=sum-Ans[j+1]*A_B_Matrix[i][j+1];   
		}
		Ans[i]=(double)sum/A_B_Matrix[i][i];        
	}
	for(int i=0;i!=n;i++)         //输出所有的解
	{
		cout<<"x["<<i+1<<"]为"<<Ans[i]<<endl;
	}
	system("pause");
}

原文地址:https://www.cnblogs.com/zztong/p/6695289.html