@xiaoziyao
2020-04-25T16:02:09.000000Z
字数 3171
阅读 1599
数学
学习笔记
矩阵(不看也行,不是很需要)
我们要解有n个未知数的n个不成倍数的线性方程组,如下式:
#include<stdio.h>
const int maxn=105;
const double eps=1e-20;//极限小值,用来处理误差
int i,j,k,m,n,flg;
double a[maxn][maxn];
inline double fabs(double x){//double的绝对值
return x<0? -x:x;
}
inline void swp(double &a,double &b){//手写swap
a+=b,b=a-b,a-=b;
}
void gauss_jordan(){
flg=0;
for(int i=1;i<=n;i++){//枚举每一个式子
int k=i;
double tmp=fabs(a[i][i]);
for(int j=i+1;j<=n;j++)
if(tmp<fabs(a[k][i]))
tmp=fabs(a[k][i]),k=j;
//有点像选择排序,每一次选择都求出了当前项最大系数 ,减少误差
if(tmp<eps){//系数为0,无解或无穷多解
flg=1;
return ;
}
if(i!=k)//交换两行
for(int j=1;j<=n+1;j++)
swp(a[i][j],a[k][j]);
for(int j=1;j<=n;j++)//将除第i个之外所有式子的系数处理一遍
if(i!=j){//不能自己减自己
tmp=a[j][i]/a[i][i];
for(k=i+1;k<=n+1;k++)
a[j][k]-=a[i][k]*tmp;
}
}
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++)
scanf("%lf",&a[i][j]);
gauss_jordan();//高斯-约旦算法
if(flg){//无解
puts("No Solution");
return 0;
}
for(i=1;i<=n;i++)
printf("%.2lf\n",a[i][n+1]/a[i][i]);//当前项的解为右边的项除以系数
return 0;
}