• 列主元求解矩阵


    //运行环境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");
    }
    

  • 相关阅读:
    Resize a VMWare disk (zz)
    StepbyStep: Installing SQL Server Management Studio2008 Express after Visual Studio 2010(zz)
    (C#)利用反射动态调用类成员[转载]
    Discuz!NT 系统架构分析 (转)
    C#反射实例讲解(转)
    什么是反射?
    创建保存图片目录
    取资源文件中的值 System.Resources.ResourceManager
    Net中的反射使用入门
    iis上实现虚拟目录
  • 原文地址:https://www.cnblogs.com/zztong/p/6695289.html
Copyright © 2020-2023  润新知