日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高斯消元~

發布時間:2023/12/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高斯消元~ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用途:高斯消元可以在n3時間復雜范圍內,求解含n個方程,n個未知數的多元線性方程組。解的可能有三種:無解、無窮多組解、唯一解。
做法:高斯消元可以通過初等行列變化把增廣矩陣轉換成階梯型矩陣,進而求解 n 個線性方程組的解。
初等行列變換
1.把某一行乘一個非0的數(方程左右兩邊同乘)
2.交換某兩行的位置
3.把某一行的若干倍加到另一行上
經過如上這三種操作,將原來的增廣矩陣變成一個上三角的形式

線性方程組為:

a11x1 + a12x2 + a13x3 + … + a1nxn = b1 a21x1 + a22x2 + a23x3 + … + a2nxn = b2 … an1x1 + an2x2 + an3x3 + … + annxn = bn

增廣矩陣為:

a11 a12 a13 ... a1n b1 a21 a22 a23 ... a2n b2. .. a21 a22 an3 ... ann bn

經過三種初等行列變換,上面的增廣矩陣就可以形成一個階梯型矩陣

a11 a12 a13 ... a1n b1a22 a23 ... a2n b2. ..ann bn

像上面這種階梯型屬于完美階梯型,如果能化成完美階梯型,則有唯一解。
解的情況
上三角的形式有三種:完美階梯型——唯一解、0 = 非零(左邊沒有未知數,右邊的系數非零)——無解、出現了很多 0 = 0 的方程(該方程可以被很多其它的方程表示,這個方程是多余的)—— 無窮多組解

算法步驟
枚舉每一列 c:
① 找到列 c 絕對值最大的一行
② 將該行換到最上面
③ 將該行第一個數變成 1 (即第 c 列的數變成 1)
④ 將下面所有行第 c 列消成 0


典例:AcWing 883.高斯消元解線性方程組

#include <iostream> #include <algorithm> #include <cmath>using namespace std;const int N = 110; const double eps = 1e-6; //浮點數存儲是有誤差的,如果x < eps,我們就認為x = 0 double a[N][N]; int n;int gauss() {int c,r; // c 是列數 r 是行數for(c = 0,r = 0; c < n; c ++ ){int t = r;for(int i = r; i < n; i ++ ) //枚舉每一行if(fabs(a[i][c]) > fabs(a[t][c])) //找到當前列絕對值最大的一行t = i;//當前這一列最大值都為 0,說明這一列所有系數都為0if(fabs(a[t][c]) < eps) continue;//把絕對值最大的這行(即第t行)換到當前最上面一行(第r行)for(int i = c; i <= n ; i ++ ) swap(a[t][i],a[r][i]);//把當前行(即第r行)的第一個數變成1,即同時除以該行第一個數//注意這里要從后往前更新,如果先更新第1個數就不對了for(int i = n; i >= c; i -- ) a[r][i] /= a[r][c];//把下面所有行的第c列消成0for(int i = r + 1; i < n; i ++ )if(fabs(a[i][c]) > eps) //如果已經是0 ,就不用消了for(int j = n; j >=c; j -- )a[i][j] -= a[r][j] * a[i][c];r ++ ;}//最終得到方程個數小于n個,說明不是唯一解,需要判斷是無解還是無窮多組解if(r < n){for(int i = r; i < n; i ++ )if(fabs(a[i][n]) > eps) // 0 = 非零,無解return 2;return 1; //有無窮多組解}//有唯一解,從下向上回代,依次求解 for(int i = n - 1; i >= 0; i -- )for(int j = i + 1; j < n; j ++ )a[i][n] -= a[i][j] * a[j][n]; return 0; //有唯一解 }int main() {cin >> n;for(int i = 0; i < n; i ++ )for(int j = 0; j < n + 1; j ++ )cin >> a[i][j];int t = gauss();if(t == 0) //唯一解{for(int i = 0; i < n; i ++ ) printf("%.2lf\n",a[i][n]);}else if(t == 1) puts("Infinite group solutions"); //無窮多組解else puts("No solution"); //無解return 0; }

總結

以上是生活随笔為你收集整理的高斯消元~的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。