演算法 高斯消元及其應用

2022-09-12 14:54:25 字數 2307 閱讀 5872

對於乙個線性的方程組求解。

假設這個方程有 \(n\) 個,則時間複雜度為 \(o(n^3)\)。

有些題目的 \(dp\) 狀態有後效性,但是對於線性的方程,可以用高斯消元進行計算。

高斯消元法的思路是:通過消元運算,直到得到乙個只關於 \(x_1\) 的式子,只關於 \(x_1,x_2\) 的式子,只關於 \(x_1,x_2,x_3\) 的式子,然後回代計算即可。

如下:最初有乙個 \(n\) 元線性方程

\[\begin

a_x_1+a_x_2+...+a_x_n=b_1 \\

a_x_1+a_x_2+...+a_x_n=b_2 \\

\vdots \\

a_x_1+a_x_2+...+a_x_n=b_n \\

\end

\]將上述方程轉換為

\[\begin

a_x_1+a_x_2+...+a_x_n=b_1 \\

a_x_1+\fraca_}}x_2+...+\fraca_}}x_n=b_2 \\

\vdots \\

a_x_1+\fraca_}}x_2+...+\fraca_}}x_n=b_n \\

\end

\]最後通過減法消去後 \(n-1\) 個方程的 \(x_1\):

\[\begin

a_x_1+a_x_2+...+a_x_n=b_1 \\

(\fraca_}}-a_)x_2+...+(\fraca_}}-a_)x_n=b_2-b_1 \\

\vdots \\

(\fraca_}}-a_)x_2+...+(\fraca_}}-a_)x_n=b_n-b_1 \\

\end

\]如此,對於剩下的 \(n-1\) 個方程又是乙個新的線性方程求解問題,繼續遞迴求解,最後回代。

若對於當前的子問題中,有一次計算中的 \(x_n\) 就已經消失了,那麼原問題中的這一未知數沒有唯一解。

若當前中存在乙個方程的各項係數都為 \(0\) ,且該條方程的常數項不為 \(0\) ,則一定無解。

當然,**具體實現的時候並不需要寫遞迴,直接用迴圈模擬即可。

實現中還有乙個問題,每次求解的 \(a_\) 是否會對答案產生影響?

可以發現,若 \(a_\) 太小,那麼會導致精度問題,所以每次需要選取主元素:最大的 \(a_\) 所有方程以它為基礎來進行消元。

#include #include #include using namespace std;

#define eps 1e-7

void read(int &n)

while (c >= '0' && c <= '9')

if (f) n = -n;

}const int maxn = 1e2 + 5;

double a[maxn][maxn], ans[maxn];

int n;

int main()

} ans[n] = a[n][n + 1];//回代求解

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

for (int i = 1; i <= n; i++) printf("%.2lf\n", ans[i]);

return 0;

}

模板題目鏈結。

在 \(n\) 維空間中,給出 \(n+1\) 個點,求出圓心的座標。

規定:設座標陣列為 \(a\),由題意得:

\(\sum_^ (a_-x_j)^2=c\)

化簡得:

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

將常數項與未知數分離:

\(\sum_^2(a_-a_)x_j=\sum_^(a_^2-a_^2)\)

等價轉化為了 \(n\) 個線性方程,求解即可。

#include #include #include using namespace std;

#define eps 1e-7

const int maxn = 1e2 + 5;

double a[maxn][maxn], b[maxn][maxn], ans[maxn];

int n;

int main()

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

} ans[n] = a[n][n + 1];

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

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

return 0;

}

高斯消元 浮點高斯消元

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

演算法初探 高斯消元

2020.07.30 16 36 千萬不要將行的意義和列的意義搞混!以下稱為矩陣的初等行變換 也就是說,高斯消元就是通過初等行變換去求解變化為增廣矩陣的線性方程組 例如下面這個方程組 begin2x 0 x 1 5x 2 x 3 23 x 0 2x 1 8x 2 4x 3 11 3x 0 x 1 x...

矩陣消元 高斯消元

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