對於乙個線性的方程組求解。
假設這個方程有 \(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...