📄 解线性方程组的guass列主元消去法.cpp
字号:
// 黄泳晞(2003402054529)
//算法2.1 解线性方程组的Guass列主元消去法
#include <iostream.h>
#include <iomanip.h>
class Gauss
{
public:
float A[100][101];
int N;
void input();
void output();
int guas();
};
void Gauss::input()//输入 矩阵元素
{
int n1=0,n2=0,k=0,j=0;
cout<<"线性方程组的个数:";
cin>>N;
for(n1=0;n1<N;n1++)
{
for(n2=0;n2<N+1;n2++)
{
cout<<"A("<<n1<<")("<<n2<<") = ";
cin>>A[n1][n2];
}
}
cout<<endl;
}
void Gauss::output()//输出当前矩阵元素
{
int n1,n2;
cout<<"矩阵为 : "<<endl<<endl;
for(n1=0;n1<N;n1++)
{
for(n2=0;n2<N+1;n2++)
{
cout<<setw(12)<<A[n1][n2];
}
cout<<endl;
}
cout<<endl;
}
Gauss::guas()//Gauss消去法
{
float P=0,W=0,temp,esp=0.0001;
int I=0,i=0,j=0;
for(int k=0;k<N-1;k++)//列主元
{
P=A[k][k];
I=k;
for(i=k;i<N;i++)
{
if ((A[i][k]*A[i][k])>(P*P))
{
P=A[i][k];
I=i;
}
}
if ((P*P)<=esp)
{//当|p|<ESP时,中断程序
cout<<"程序中断"<<endl<<"ERROR Reason: |P|<ESP"<<endl;return 0;
}
for(j=k;j<N+1;j++)//換行
{
if (I==k)
break;//判断,主元在最搞位置时跳过下面换行语句
temp=A[k][j]; A[k][j]=A[I][j]; A[I][j]=temp;//换行
}
for(i=k+1;i<N;i++)//进行消元
{
A[i][k]=(A[i][k]/A[k][k]);
for(j=k+1;j<N+1;j++)
{
A[i][j]=(A[i][j]-A[i][k]*A[k][j]);
}
}
if (-esp<=A[N][N] && A[N][N]>=esp)
{//当A[N][N]=0时,中断程序
cout<<"程序中断"<<endl<<"ERROR Reason: A[N][N]=0"<<endl;return 0;
}
}
cout<<"经Gauss列主元素消去发计算后,";output();
A[N][N+1]=(A[N][N+1]/A[N][N]);//进行回代
for(k=N-1;k>=1;k--)
{
temp=0;
for(j=k+1;j<=N;j++)
{
temp=temp+A[k][j]*A[j][N+1];
}
A[k][N+1]=A[k][N+1]-temp;
A[k][N+1]=A[k][N+1]/A[k][k];
}
A[N-1][N]=A[N-1][N]/A[N-1][N-1];
for(k=N-2;k>=0;k--)
{
W=0;
for(j=k+1;j<N;j++)
{
W=W+A[k][j]*A[j][N];
}
A[k][N]=A[k][N]-W;
A[k][N]=A[k][N]/A[k][k];
}
cout<<"进行回代后,";output();
cout<<"最后结果为 : "<<endl;
for(int b=0;b<N;b++)
{
cout<<"x("<<b+1<<")="<<A[b][N]<<" ";
}
cout<<endl;
return 0;
}
void main()
{ //主程序
Gauss t;
t.input();
cout<<"输入的";
t.output();
t.guas();
//完毕........................................................................
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -