/*18.编程序,按如下要求来求解n元一次线性方程组(假设方程组具有唯一解)。
(1)方程个数n之值由用户通过键盘输入;
(2)方程组存放在"增广矩阵"A之中,而n行n+1列的A存储空间通过new来动态分配,且A的各元素值也由用户通过键盘输入;
(3)方程组的解存放于"向量"B之中,而具有n个元素的B存储空间也通过new来动态分配。
提示:将整个求解任务(总任务)进行"分解",设计出多个各负其责的自定义函数以完成各子任务。
求解n元一次线性方程组,实际上是要对增广矩阵A进行"同解变换",
并最终将求出的解存放于B数组之中。而所谓的"同解变换"主要使用如下的变换方法:
"将某一行的各数据乘以适当的倍数加到另一行的对应各元素上去",从而可首先将系数矩阵消为"上三角",
而后再进行所谓的"回代过程",最后完成求解任务。*/
#include<iostream.h>
#include<iomanip.h>
void main()
{
int n,i,j,k;
cout<<"高斯顺序消去法求解n元一次线性方程组."<<endl<<endl;
cout<<"请输入线性方程组的元数n:"<<endl;
cin>>n;
cout<<endl;
cout<<"请输入增广矩阵a[n][n+1]:"<<endl;
float **a; //动态数组a[n][n+1],用于存放方程组的系数与方程的值
a=new float*[n];
for(int m=0;m<n;m++)
{
a[m]=new float[n+1];
}
float *x=new float[n]; //动态数组x[n],用于存放方程组的解
for(int p=0;p<n;p++) //两层循环,增广矩阵存于数组
{
for(int q=0;q<n+1;q++)
{
cin>>a[p][q];
}
}
cout<<endl;
cout<<"您刚才输入的矩阵为:"<<endl; //按一定格式输出矩阵
for(p=0;p<n;p++)
{
for(int q=0;q<n+1;q++)
{
cout<<setw(6)<<a[p][q];
}
cout<<endl;
}
for(k=0;k<n-1;k++) //高斯顺序消元,对增广矩阵进行初等行变换,使系数矩阵化为上三角形
{
for(i=k+1;i<n;i++)
{
float m=-a[i][k]/a[k][k];
for( j=k+1;j<n+1;j++)
{
a[i][j]=a[i][j]+a[k][j]*m;
}
}
}
for(i=n-1;i>=0;i--) //回代
{
for( j=i+1;j<n;j++)
{
a[i][n]-=a[i][j]*x[j];
}
x[i]=a[i][n]/a[i][i];
}
cout<<endl; //输出线性方程组的解
cout<<"该线性方程组的解为:"<<endl;
for(int loop=1;loop<=n;loop++)
{
cout<<"X"<<loop<<"="<<x[loop-1]<<endl;
}
}
评论0