高斯消元 小白系列

2021-08-21 03:56:43 字數 2256 閱讀 7320

在oi的海洋中,數學作為萬科之基礎,當然佔了很大的比重。讓我們來一起感受oi和數學之間的樂趣吧。

高斯消元聽上去很高大上,其實只是解多元一次方程組的最常用方法。而這種方法就是我們小學學過的加減消元。

首先我們來看乙個三元一次方程組

x-2y+3z=6

4x-5y+6z=12

7x-8y+10z=21

(資料來自洛谷使用者「我不是柳橙汁」)

加減消元如何消?這取決於方程中每個未知數的係數,所以我們先把係數拿出來,放到乙個二維陣列裡(矩陣)

這樣:

1 -2 3 6

4 -5 6 12

7 -8 10 21

為了防止消元出鍋,我們把x的係數絕對值最大的放到第一排

7 -8 10 21

4 -5 6 12

1 -2 3 6

接下來我們開始消元,首先用第一行消去後兩行的x. 即第二行所有數字乘-7/4,然後與第一行相加。第三行所有數字乘-7,然後與第一行相加。

消後結果如下

7 -8 10 21

0 3/4 -1/2 0

0 6 -11 -21

然後我們開始用第二行消去第三行的y,原理和上面一樣

7 -8 10 21

0 3/4 -1/2 0

0 0 7/8 21/8

這時我們會發現,最後一行只剩乙個未知數z,便可解出z=3.接著將z=3 帶入第二行,可以解出y=2。將y=2,z=3帶入第一行,可以解出x=1。

所以高斯消元就是這樣乙個簡單的過程,用第一行消去下面所有行的第乙個未知數,用第二行消去下面所有行的第二個未知數,以此類推…

直到最後一行,便只剩下最後乙個未知數,將此未知數解出,然後逐一代回到上面的式子中,就可以解出所有的未知數啦

當然,我們知道,多元方程組並不一定每個未知數都有唯一解。

那麼什麼時候某個未知數是無數個解呢?

當所有元都消完後,第n行的第n個未知數的係數為0

比如這樣

1 2 3 5

0 5 6 7

0 0 0 3

此時第三行的第三個未知數z的係數為0,則此時的z可以取任意值,這樣的未知數我們把它稱為自由元。

那麼什麼時候方程無解呢?

很簡單,用一元一次方程來舉乙個例子

0*x=1這樣的方程顯然無解,放到多元方程組中也是一樣的道理呢

總之,高斯消元的**實現就這模擬這樣乙個加減消元並代入求值的過程

然而這中間還有很多細節需要各位在寫**中體會

所以希望大家先自己寫寫**再回來看我的

畢竟我的**太醜。。

洛谷模板題傳送門

#include

#include

#include

#include

#include

using namespace std;

double s

q[105][105];//矩陣

double ans[105];

int n;

void change(int

x)//交換行

}if(num==x) return;

else

} }int main()

change(1);

for(int i=1;i<=n;i++)//需要消去第i個變數

for(int j=i+1;j<=n;j++)//在第j行 }}

for(int i=n;i>=1;i--)

ans[i]=(s

q[i][n+1]-bb)/s

q[i][i];

}for(int i=1;i<=n;i++)

printf("%.2lf\n",ans[i]);

}

那麼高斯消元基礎就到這裡啦

謝謝支援

系列 高斯消元

bzoj 1013 題目大意 給出 n 維球體上的 n 1 個點,求球心 思路 設球心座標 x 1,x 2,x 3 cdots x n 則對於任意兩個點 a 1,a 2 cdots a n b 1,b 2 cdots b n 得到 x 1 a 1 2 x 2 a 2 2 cdots x n a n ...

高斯消元 浮點高斯消元

浮點數高斯消元 問題描述 給出乙個線性方程組,有n個方程組,m個未知數。解這個線性方程組。輸入格式 第1行 2個整數n和m,n,m 400,且n不一定等於m 接下來n行,每行m 1個整數,表示乙個方程的m個未知數的係數和常數 輸出格式 如果無解,輸出 no solution 如果有唯一解,輸出m行,...

矩陣消元 高斯消元

安利一波高斯消元的部落格,內容很詳細。看完這個相信你已經理解了大概,高斯消元求線性方程組,在學習線性代數 大學課程 的時候我們都接觸過。原理是先把執行緒組轉換成矩陣,然後把它等價變換成上三角矩陣,這樣從下到上依次可以求出解集。高斯消元模板 模板題 include define n 205 using...