高斯消元学习笔记
作者:互联网
参考文章:高斯消元(Gauss消元)https://www.cnblogs.com/xcg123/p/10679600.html
矩阵相关定义性质全总结 https://blog.csdn.net/I_canjnu/article/details/105778485
用来解n元一次方程组。
操作很简单:先从定位点(i,i)往下找第一个当前列非零的一行,换到当前列。
再让这行除以(i,i)上的数,(i,i)即变成了1。
利用这个1,让所有行减去第i列数倍的第i行,第i列就消好了。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,pl;
double a[1001][1001];//注意数据类型
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)//高斯消元的矩阵是n*(n+1)的,别忘了最后一列
cin>>a[i][j];
for(int i=1;i<=n;i++)
{
pl=i;
while(a[pl][i]==0&&pl<=n)
pl++;
// 判断第i列首元素非0的最上行,因为第i行第i列元素不能为0
if(pl==n+1) {cout<<"No Solution";return 0;}
//一直判到了n+1行,可是一共才只有n行,说明有一列全为0,无解
for(int j=i;j<=n+1;j++) //将第i行第i列元素不为0的那一行与当前行交换
swap(a[i][j],a[pl][j]);
double k=a[i][i]; //让第i行每个元素都除以a[i][i]使得a[i][i]为1
for(int j=i;j<=n+1;j++)
a[i][j]=a[i][j]/k; //将第i行第i列的元素消成1,注意同行进行同样的操作
for(int j=1;j<=n;j++)
{
if(i!=j) //将第i列除了第i行的元素全消成0
{ //方法是第j行每个元素a[j][m]都减去a[j][1]*a[i][m]
double ki=a[j][i];
for(int m=i;m<=n+1;m++)
a[j][m]=a[j][m]-ki*a[i][m];
}
}
}
for(int i=1;i<=n;i++)
printf("%.2lf\n",a[i][n+1]);
return 0;
}
标签:int,笔记,学习,前列,高斯消,https,include,1001 来源: https://www.cnblogs.com/InductiveSorting-QYF/p/16183242.html