zoukankan      html  css  js  c++  java
  • 高斯消元part2

    今天整一整高斯消元的模板,正经的

    高斯消元主要用于解n元一次线性方程组与判断是否有解

    主要思想? 就是高斯消元啊

    主要思想是理想状态下消为每行除最后一项外只有一个1,并且每行位置互异,具体看下面。

    这里代码的目的主要是求方程的解

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    double a[105][105];
    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]);
        }
        for(int i=1;i<=n;i++){
            int t=i;
            while(a[t][i]==0&&t<=n) t++;  //判断是否有解,如果每行对于某项系数全为0,则视为无解(无唯一解)
            if(t==n+1){
                cout<<"No Solution";
                return 0;
            }
            for(int j=1;j<=n+1;j++) swap(a[t][j],a[i][j]);   //(通行列式)如果首项为0,则挑一行不为零的换下
            double x=a[i][i];  //保存系数,以便下面用
            for(int j=1;j<=n+1;j++) a[i][j]/=x;
            for(int j=1;j<=n;j++){
                if(j==i) continue;   //这里主要思想放在下面注释point
                x=a[j][i];
                for(int k=1;k<=n+1;k++){
                    a[j][k]-=x*a[i][k];
                }
            }
        }
        for(int i=1;i<=n;i++) printf("%0.2lf
    ",a[i][n+1]); //因系数消为1,顾每行最后即为解
        return 0;
    }

    point:

    对于计算每行“i”,i即表示行数,即对于每行进行消元,理想状态下需把第n行的第n项系数消为1,其余消掉(消为0),所以当j==i时,跳过不做消元处理,只在之前那一步把系数化为1,其他位置的系数留给下面的式子来消,故当j!=i时,用这一行把其他同位置的系数消为0,并且如果有解,则数据保证能消为理想状态(好像证明的一部分已经给出了。。。)

  • 相关阅读:
    Burp Suite Intruder的4种攻击类型
    JSP Response Set Status
    Mybatis中的#和$的区别
    请求转发、请求重定向
    Spring IoC Container and Spring Bean Example Tutorial
    成员变量声明时初始化和构造方法中初始化的区别
    JDK开发WebService
    Mac设置截图保存位置
    Socket通信
    DOM4J解析xml
  • 原文地址:https://www.cnblogs.com/648-233/p/10692734.html
Copyright © 2011-2022 走看看