码迷,mamicode.com
首页 > 其他好文 > 详细

高斯消元法的一点理解><

时间:2017-10-10 21:51:16      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:换行   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!