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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高斯消元入门

發(fā)布時間:2025/7/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高斯消元入门 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

學(xué)高斯消元之前,我覺得這東西真難。學(xué)完之后,我發(fā)現(xiàn)高斯消元其實(shí)也挺簡單的。

先通過一個例子來初步認(rèn)識高斯消元

這里有一組方程:

\[\begin{cases}5x+4y=24,\\4x+3y=19.\end{cases}\]

這組方程怎么用高斯消元來求解呢?

我們先用一個\(delta\)來記錄要想與②式相加消掉\(x\),①式所要擴(kuò)大的倍數(shù)。不難發(fā)現(xiàn),在這個例子中,\(delta=-\frac45\),因此,我們將①式左右兩邊同乘\(delta\),得:

\[-4x-\frac{16}5y=-\frac{96}5\tag{等式性質(zhì)}\]

將②式加上③式,可消掉\(x\)

\[-\frac15y=-\frac15\tag{加減消元法}\]

結(jié)合①式和消元得到的④式,我們就得到了:

\[\begin{cases}5x+4y=24,\\-\frac15y=-\frac15\end{cases}\]

然后,我們就可以從最后一個式子開始,求出每一個未知數(shù)的答案:

  • ④式:
    \(y=-\frac15÷-\frac15=1\)
    代入①式得
    \[5x=20\tag{代入消元法}\]
  • ①式:
    \(x=20÷5=4\)

綜上所述,原方程組的解為
\[ \begin{cases} x=4,\\ y=1. \end{cases} \]

整理思路

接下來,我們整理一下剛才的步驟與思路:

  • 第一步:先選擇第一行的第一個元素,然后通過加減消元法消去每一行的這一個元素。
  • 第二步:我們發(fā)現(xiàn)最后一個方程已經(jīng)可以直接求解,然后用代入消元法將最后一個方程求出來的解代入前面的每一個方程實(shí)現(xiàn)消元。

上面的步驟只是對于二元方程的,對于一個\(n\)元方程應(yīng)該這樣用高斯消元法:

  • 新建一個變量\(i\),初始化\(i=1\)
  • 找到一個行數(shù)大于等于\(i\)且第\(i\)個元素系數(shù)不為0的方程,將其移至第\(i\)
  • 如果找不到,就輸出\(No\) \(Solution\),并退出程序
  • 新建變量\(j\),初始化\(j=i+1\)
  • 用一個變量\(delta\)記錄在將想要將第\(i\)行與第\(j\)行相加消掉第\(i\)個元素第\(i\)行所要擴(kuò)大的倍數(shù),即\(-\frac{第j行第i個元素的系數(shù)}{第i行第i個元素的系數(shù)}\)
  • 將第\(j\)行每一個元素的系數(shù)分別加上第\(i\)行對應(yīng)的元素的系數(shù)乘以\(delta\)后的值
  • \(j\)加1,如果\(j\)不大于\(n\),返回步驟5
  • \(i\)加1,如果\(i\)不大于\(n\),返回步驟2
  • \(i\)重新賦值為\(n\)
  • 如果第\(i\)行第\(i\)個元素的系數(shù)為0,就輸出\(No\) \(Solution\),并退出程序
  • 否則,該行其他元素的系數(shù)肯定都為0,因此第\(i\)個未知數(shù)的值為\(\frac{第i行等號右邊的值}{第i行第i個元素的系數(shù)}\)
  • 將第\(i\)個元素的值代入第\(1\sim i-1\)行的式子中消去第\(i\)個未知數(shù)
  • \(i\)減1,如果\(i\)不小于1,返回步驟10
  • 再接下來就是代碼的實(shí)現(xiàn)了。

    代碼

    #include<bits/stdc++.h> #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)<(y)?(x):(y)) #define abs(x) ((x)<0?-(x):(x)) #define LL long long #define ull unsigned long long #define tc() (A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++) #define N 100 char ff[100000],*A=ff,*B=ff; using namespace std; const double eps=1e-6; int n; double a[N+5][N+5],s[N+5]; inline int read() {int x=0,f=1;static char ch;while(!isdigit(ch=tc())) f=ch^'-'?1:-1;while(x=(x<<3)+(x<<1)+ch-48,isdigit(ch=tc()));return x*f; } inline void swap(double &x,double &y) {double t=x;x=y,y=t; } inline void Find_line(int x)//找到一個行數(shù)大于等于x且第x個元素系數(shù)不為0的方程,將其移至第x行 {register int i=x,j;while(i<=n&&fabs(a[i][x])<eps) ++i;//只要i不大于n且這一行第x個元素為0,就將i加1if(i>n) puts("No Solution"),exit(0);//如果無解,輸出"No Solution",并退出程序for(j=1;j<=n;++j) swap(a[x][j],a[i][j]);//將第i行移至第x行 } int main() {register int i,j,k;for(n=read(),i=1;i<=n;s[i++]=read()) for(j=1;j<=n;++j) a[i][j]=read();//讀入每一個元素的系數(shù)以及等于號右邊的值for(i=1;i<=n;++i) {Find_line(i);for(j=i+1;j<=n;++j)//消去[i+1~n]中每一行第i個元素{double delta=-a[j][i]/a[i][i];//delta記錄在將想要將第i行與第j行相加消掉第i個元素第i行所要擴(kuò)大的倍數(shù)for(k=i;k<=n;++k) a[j][k]+=a[i][k]*delta;//將第j行每一個元素的系數(shù)分別加上第i行對應(yīng)的元素的系數(shù)乘以delta后的值s[j]+=s[i]*delta;}}for(i=n;i;--i) {if(!a[i][i]) return puts("No Solution"),0;//如果第i行第i個元素的系數(shù)為0,就輸出"No Solution",并退出程序for(s[i]/=a[i][i],j=i-1;j;--j) s[j]-=a[j][i]*s[i];//計(jì)算出第i個未知數(shù)的值,并將第i個元素的值代入第1~i-1行的式子中消去第i個未知數(shù)}for(i=1;i<=n;++i) printf("%.2lf\n",s[i]);//輸出每一個未知數(shù)的值return 0; }

    例題

    一道例題:【BZOJ1013】[JSOI2008] 球形空間產(chǎn)生器

    轉(zhuǎn)載于:https://www.cnblogs.com/chenxiaoran666/p/Gauss.html

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。