在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...