高斯消元入門筆記

2022-06-23 19:15:08 字數 3419 閱讀 9614

目錄【例題】

【矩陣樹入門】

【總結】

高斯消元是一種解線性方程組的方法。

通過初等行變換把增廣矩陣變為簡化階梯型矩陣的線性方程組求解演算法就是高斯消元演算法

值得一提的是有一種名為高斯—約旦消元法的方法,可以將階梯型矩陣進一步化簡。

通常這種方法實現更簡單,**常數更小,精度誤差更小,更為通用。

板子題

解乙個線性方程組。

高斯—約旦消元法大致思路如下:

選擇乙個尚未被選過的未知數作為主元,選擇乙個包含這個主元的方程。

將這個方程主元的係數化為1。

通過加減消元,消掉其它方程中的這個未知數。

重複以上步驟,直到把每一行都變成只有一項有係數。

在消元完成之後,一定為三種情況之一:

若存在係數全部為 \(0\) 但常數不為 \(0\) 的項,方程組無解。

若係數不為 \(0\) 的行恰好有 \(n\) 個,說明方程恰好有 \(1\) 個解。

若係數不為 \(0\) 的行有 \(k個,說明主元有 \(k\) 個,自由元有 \(n-k\) 個,方程有無數多個解。

同時為了保留精度,我們通常使用所有可選主元中最大的那乙個進行消元,可以證明這樣精度誤差最小。

每次列舉找到最大的對應元,然後消元。

時間複雜度 \(o(n^3)\)。

int n;

double a[110][110];

const double eps = 1e-8;

int main()

for(int j=1; j<=n; j++)

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

printf("%.2lf\n", a[i][n+1] / a[i][i]);

return 0;

}

異或的本質是不進製加法,所以同樣可以用高斯消元處理。

方法和結果和上述一模一樣,這裡只是提一句。

球形空間產生器

給定 \(n\) 維座標內的 \(n+1\) 個點,求使 \(n+1\) 個點共球的球心位置,資料保證有且僅有乙個解。

距離:設兩個 \(n\) 維空間上的點 \(a,b\) 的座標為 \((a_1, a_2, \cdots , a_n), (b_1, b_2, \cdots , b_n)\)則ab的距離定義為:

\[dist = \sqrt

\]

我們的目標是求乙個座標 \((x_1,x_2,\cdots,x_n)\) 使:

\[\sum_^n (a_-x_j)^2=c(1\leq i\leq n+1)

\]其中 \(c\) 為常數。

容易看出這並不是乙個線性方程組,無法使用高斯消元處理。

但是如果將相鄰方程作差,我們不難得到乙個 \(n\times n\) 的線性方程組:(\(1\leq i\leq n\))

\[\sum_^n (a_-x_j)^2-\sum_^n (a_-x_j)^2=0

\]\[\sum_^n (a_^2+x_j^2-2\times a_\times x_j)-\sum_^n (a_^2+x_j^2-2\times a_\times x_j)=0

\]\[\sum_^n(a_^2-a_^2-2x_j\times(a_+a_))=0

\]\[\sum_^n 2(a_+a_)\times x_j=\sum_^na_^2-a_^2

\]上式中除了 \(x\) 之外都是常數,於是我們得到了 \(n\times n\) 的線性方程組。

消元即可。

int n;

double a[20][20];

double f[20][20];

int main()

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

}for(int i=1; i<=n; i++) printf("%.3lf ", f[i][n+1] / f[i][i]);

return 0;

}

開關問題

有 \(n\) 個開關和 \(k\) 個關係有序對,關係 \((i,j)\) 表示改變開關 \(i\) 時 \(j\) 的狀態同時改變。

對於任意乙個開關,最多只能進行一次開關操作,計算有多少種可以達到指定狀態的方法。

前文已經提到過,異或方程組同樣可以使用高斯消元,只是將加減消元改變為異或操作。

值得注意的是通常運用高斯消元解異或方程組時,可以將每一行狀態壓縮至乙個intbitset,便於操作。

主要**如下:

int n,a[50];

int main()

if(a[i] == 1)

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

if(a[i] & (1《外星千足蟲

給定 \(m\) 個從 \(n\) 個數中挑選某些數求和後和的奇偶性,求解 \(n\) 個數的奇偶性。

如果有解,輸出解。同時如果只需要 \(m\) 個條件中的前 \(k\) 個就能夠確定解,則輸出 \(k\)。

類似於上題的解異或方程組,但是還要記錄乙個 \(k\)。

可以發現在高斯消元的同 時,我們自上而下找到的第乙個主元就是最小的。

\(k\) 的取值在所有條件中取 \(\max\) 即可。

可惜時間複雜度 \(o(n^3)\) 好像不太行,利用bitset優化到 \(o(\frac)\),實測能過。

int n, m;

char s[n];

bitseta[m];

int main()

for(int i=1; i<=m; i++)

int ans = 0;

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

ans = max(ans, k);

swap(a[k], a[i]);

for(int j=1; j<=m; j++)

if(j != i && a[j][i]) a[j] ^= a[i];

} printf("%d\n", ans);

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

if(a[i][n+1]) puts("?y7m#");

else puts("earth");

return 0;

}

矩陣樹定理是高斯消元的一大運用。

坑留在這裡:matrix tree定理入門筆記。

高斯消元題目的難度通常體現在問題的轉化上。

轉化為高斯消元後,題目通常變得無腦起來。

引用資料&特別鳴謝:

《演算法競賽高階指南》。

高斯消元模板題解。

完結撒花

高斯消元 浮點高斯消元

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

高斯消元學習筆記

先來安利乙個部落格 高斯消元 線性基 學習筆記 本文就講了最基礎的高斯消元,高斯消元的擴充套件應用可以看上面的那個呀w 高斯消元是用來解線性方程組的。所謂線性方程組,就是一次方程組。對於解這個一般的線性方程組,求xi a11 x1 a12 x2 a1n xn b1 a21 x1 a22 x2 a2n...

高斯消元學習筆記

數學上,高斯消元法 英語 gaussian elimination 是線性代數中的乙個演算法,可用來為線性方程組求解,求出矩陣的秩,以及求出可逆方陣的逆矩陣。當用於乙個矩陣時,高斯消元法會產生出乙個行梯陣式。以上引自維基百科。我們可以把乙個 n 元 1 次方程表示成乙個 n 行 n 1 列的矩陣 矩...