高斯消元
【高斯消元】P3389 【模板】高斯消元法
#include
using namespace std;
int m,n;
double a[1001][1001];
//数组a记录矩阵相关信息
int main()
{
scanf("%d",&n);
for(int i=1;
i<=n;
i++)
{
for(int j=1;
j<=n+1;
j++)
{
scanf("%lf",&a[i][j]);
}
}
int flag=1;
///flag用来判断该方程是否有解
for(int i=1;
i<=n;
i++)///利用矩阵的性质,对矩阵进行化简成上三角形,来对矩阵进行求解
{
int pos=i;
for(int j=i+1;
j<=n;
j++)
{
if(fabs(a[j][i])>fabs(a[pos][i]))///fabs来求精度比较高的浮点型数据的绝对值
{
pos=j;
///找第i行及以下的矩阵中第i列的元素的绝对值的最大值,pos记录最大值所在的行数
}
}
if(fabs(a[pos][i])<1e-8)如果找到的最大值小于1e-8,则该方程无解,flag值赋为0
{
flag=0;
break;
}
for(int j=1;
j<=n+1;
j++)
{
swap(a[pos][j],a[i][j]);
///交换第i行与第pos行所有元素,使得第i行的元素首非零元素为最大
}
for(int j=i+1;
j<=n;
j++)
{
double k=a[j][i]/a[i][i];
///第i行以下的元素全部减为0,k为倍数
for(int t=i;
t<=n+1;
t++)//对第j行的元素进行处理
{
a[j][t]-=k*(a[i][t]);
}
}
}
if(flag==0)
{
printf("No Solution\n");
return 0;
}
for(int i=n;
i>=1;
i--)
{
for(int j=i+1;
j<=n;
j++)
{
a[i][n+1]-=a[j][n+1]*a[i][j];
///最后化简成最简形的矩阵,那么a[i][n+1]就是解
}
a[i][n+1]/=a[i][i];
}
for(int i=1;
i<=n;
i++)
{
printf("%.2lf\n",a[i][n+1]);
}
return 0;
}
推荐阅读
- AIoT(人工智能+物联网)|程序员的数学【线性代数基础】
- topcoder|Topcoder SRM 661 Div1 Easy: MissingLCM
- HDU 5184 Brackets (卡特兰数)
- 水题纪念|【51nod - 1098】 最小方差(基础数学,公式化简,前缀和,积的前缀和)
- 扩展欧几里德算法(gcd扩展使用)
- 数学|CF 514D.Nature Reserve 几何,二分,交集
- codeforces|Codeforces Round #665 (Div. 2) C. Mere Array(数学)
- codeforces|Codeforces Round #665 (Div. 2) A. Distance and Axis(思维,数学)
- 数论|Codeforces Global Round 10 B. Omkar and Infinity Clock(数学)