zoukankan      html  css  js  c++  java
  • 高斯-约旦消元法

    其实,我只会约旦消元法

    推荐blog:这里

    还有这里(这是高斯)

    其实这就是一个小学5年级的数学题-解方程,只是变得有规律可循

    具体细节可以先去看看上面的blog,我先说说约旦消元跟高斯消元的区别:

    下面是约旦消元消完后的结果,所以它可以不用回带:

    而高斯消元后的结果是这样,所以它还需要从下往上回带:

    至于怎么消元,就是找到这一列中系数绝对值最大的,然后先将它系数化为1,再分别去别的行,乘以当前行,当前列的系数 ,(整行都乘),然后顺便处理别的列,就做完了

    至于为什么要选最大的,第二篇blog有详细说明

    推荐题:洛谷P3389 【模板】高斯消元法

    代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 double a[105][105],b[105];
     4 int main(){
     5     int n,i,j,Max,k;
     6     double can;
     7     scanf("%d",&n);
     8     for(i=1;i<=n;i++){
     9         for(j=1;j<=n;j++)
    10             cin>>a[i][j];
    11         cin>>b[i];
    12     }
    13     for(i=1;i<=n;i++){
    14         Max=0;
    15         for(j=i;j<=n;j++){
    16             if(fabs(a[j][i])>fabs(a[Max][i]))Max=j;
    17         }
    18         if(a[Max][i]==0){
    19             printf("No Solution
    ");
    20             return 0;
    21         }
    22         for(j=i;j<=n;j++){
    23             swap(a[i][j],a[Max][j]);
    24         }swap(b[i],b[Max]);//为了保持约旦消元的矩阵队列,从左上到右下有数,其他都为0
    25         for(j=1;j<=n;j++){
    26             if(j!=i){
    27                 can=a[j][i]/a[i][i];
    28                 for(k=i;k<=n;k++){
    29                     a[j][k]-=a[i][k]*can;
    30                 }
    31                 b[j]-=can*b[i];
    32             }//将a[i][i]先系数化为1,再乘上当前for的a[j][i]的系数(对所有i行的数如此操作)
    33         }
    34     }
    35     for(i=1;i<=n;i++)printf("%.2lf
    ",b[i]/a[i][i]);
    36     return 0;
    37 }
  • 相关阅读:
    为什么网站不被百度收录或收录清零?
    XmlSerializer序列化一组成员到文本文件
    windows phone不同页面间传值
    windows phone下进行Isolated的IO读写
    windows Phone 后退键历史的清除
    Window Phone ListBox的DataBinding:
    VGA的相关代码
    如何避免Quartus II自動將未宣告的信號視為wire?
    XINLINX约束心得
    VIM配置文件备份
  • 原文地址:https://www.cnblogs.com/Jessica-Cao/p/13569326.html
Copyright © 2011-2022 走看看