guass列主元消去法

来源:互联网 发布:python时间序列分析包 编辑:程序博客网 时间:2024/05/12 19:52
#include<iostream>
#include<math.h>
#include<iomanip>
#define kk 50  //定义最大方程元数
int n;
using namespace std;
void changer(double *p,double *q);            
void main()
{
 cout<<"    ****************************************************************"<<endl;
 cout<<"    **************本程序是利用高斯列主元消元法求解线性方程组********"<<endl;
 cout<<"    *************************制作人:李小龙*************************"<<endl;
 cout<<"    ********************说明:方程最多个数为50**********************"<<endl;
 cout<<"    ****************************************************************"<<endl;
 int i,j,k,s;
 double A[kk][kk],r,l[kk][kk],b[kk],u,temp;
aa: cout<<"输入的方程元数"<<endl;
 cin>>n;
 cout<<"请输入方程系数矩阵:"<<"/n";
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
   cin>>A[i][j];
 cout<<"请输入右边向量:"<<"/n";
 for(i=0;i<n;i++)
  cin>>b[i];
 for(k=0;k<n-1;k++)
 {
  s=k;
  r=fabs(A[k][k]);
  for(i=k;i<n;i++)    
   if(r<fabs(A[i][k]))
   {
    r=fabs(A[i][k]);
    s=i;
   }//获取主元
   if(s!=k)
   {
    changer(*(A+k),*(A+s));//交换行元素
    temp=b[k];b[k]=b[s];b[s]=temp; //右边向量的交换
   }
   cout<<"第"<<k+1<<"次选取主元并交换行的顺序"<<endl;
   for (i=0;i<n;i++)
   {
    for (j=0;j<n;j++)
     cout<<setw(4)<<setprecision(4)<<A[i][j]<<"   ";
    cout<<b[i]<<endl;
   }//
   cout<<endl;
   for(i=k+1;i<n;i++)
   {
    l[i][k]=A[i][k]/A[k][k];//计算消去系数
    for(j=k;j<n;j++)
     A[i][j]=A[i][j]-l[i][k]*A[k][j];
    b[i]=b[i]-l[i][k]*b[k];
   }//消元过程
   cout<<"第"<<k+1<<"次消元"<<endl;
   for (int e=0;e<n;e++)
   {
    for (j=0;j<n;j++)
     cout<<setw(4)<<setprecision(4)<<A[e][j]<<"   ";
    cout<<b[e]<<endl; 
   }
   cout<<endl;
 }
 if(A[k][k]<0.0001)
 {
  cout<<"系数矩阵是非奇异矩阵!"<<"/n";
  cout<<"所以:方程无唯一解!"<<"/n";
  cout<<"********请问是否继续*********?"<<endl;
     cout<<"********退出请输入1*********"<<endl;
     cout<<"********要继续请输入任意非1的整数*********"<<endl;
     int g;
     cin>>g;
  if(g!=1)goto aa;
    else exit(1);
 }//判断系数矩阵的奇异性
 for(i=n-1;i>=0;i--)
 {
  u=0;
  for(j=i+1;j<n;j++)
   u=u+A[i][j]*b[j];
  b[i]=(b[i]-u)/A[i][i];
 }//回代过程
 cout<<"最后得方程的根为:"<<"/n";
 for(i=0;i<n;i++)
  cout<<"x"<<i+1<<"="<<b[i]<<"/n";
 cout<<"********退出请输入1*********"<<endl;
 cout<<"********要继续请输入任意非1的整数*********"<<endl;
 int g;
 cin>>g;
 if(g!=1)goto aa;
 else exit(1); 
}
void changer(double *p,double *q)           
{
 int i;
 double temp;
 for(i=0;i<n;i++)
 {
  temp=*(p+i);
  *(p+i)=*(q+i);
  *(q+i)=temp;
 }
} //交换行元素的函数
原创粉丝点击