标签:换行 names 核心 交换 最大 lib void for i++
高斯消元法用于讨论线性方程组的解。
1、概念
齐次线性方程组:所有方程的常数项均为0
非齐次线性方程组:方程的常数项不均为0
线性方程组的各项系数构成系数矩阵
线性方程组的各项系数和常数项构成增广矩阵
注:齐次线性方程组有零解和非零解。未知量取值不全为0,称之为非零解。故齐次线性方程组必定有解,而非齐次线性方程组存在唯一解,无解,无数解三种情况。
2、核心
通过矩阵初等行变换,将增广矩阵变换为阶梯性矩阵,再将矩阵转换为方程组逐步带回,得到原方程的解的过程叫高斯消元法。
3、线性方程组解的判定
定义增广矩阵的秩r(A B),系数矩阵的秩r(A);
推论一:线性方程组有解的充要条件:r(A B)=r(A);
推论二:线性方程组有唯一解的充要条件:r(A B)=r(A)=n;
推论三:线性方程组有无数解的充要条件:r(A B)=r(A)<n;
对于齐次线性方程组r(A B)!=r(A),方程组只有零解。
对于非齐次线性方程组r(A B)!=r(A),方程组无解。
注:用列中最大元素当作主元能减小答案误差
4、模板:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include <stdlib.h> #define dd double using namespace std; int n; dd a[110][110],ans[110]; void kk()//阶梯性矩阵 { for(int m=1;m<=n;m++) { int p=m; for(int i=m+1;i<=n;i++)//选取列中最大系数当作主元 if(a[i][m]>a[p][m])p=i; if(p!=m)swap(a[p],a[m]);//交换行 if(a[m][m]==0){puts("No Solution");exit(0);} for(int i=m+1;i<=n;i++) { dd mul=-a[i][m]/a[m][m]; for(int j=m;j<=n+1;j++) a[i][j]+=a[m][j]*mul; } } for(int m=n;m>=1;m--) { for(int i=n;i>=m-1;i--) a[m][n+1]-=ans[i]*a[m][i]; ans[m]=a[m][n+1]/a[m][m]; } for(int i=1;i<=n;i++)printf("%.2f\n",ans[i]); } 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]); kk(); return 0; }
标签:换行 names 核心 交换 最大 lib void for i++
原文地址:http://www.cnblogs.com/lxykk/p/7647722.html