@xiaoziyao
2020-04-25T08:02:09.000000Z
字数 3171
阅读 2050
数学 学习笔记
矩阵(不看也行,不是很需要)
我们要解有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){//手写swapa+=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;}
