【學習筆記】高斯消元法
阿新 • • 發佈:2020-11-27
引出:
給定一個線性方程組,對其求解。
一般對於求解線性方程組的問題,我們用到高斯消元法對其進行求解。那麼高斯消元咋消啊?
正文:
假設我們要求解一個線性方程組:
\[\left\{\begin{matrix} x&+& 3y&+& 4z&=&5 \\ x&+& 4y&+& 7z&=&3 \\ 9x&+& 3y&+& 2z&=&2 \end{matrix}\right.\]按照數學課上常規操作,我們應該先選擇一個式子的 \(x\)
比如上面的式子先用第三個式子消掉其它的 \(x\):
\[\left\{\begin{matrix} 0\times x&+& \frac{8}{3}y&+& \frac{34}{9}z&=&\frac{43}{9} \\ 0\times x&+& \frac{11}{3}y&+& \frac{61}{9}z&=&\frac{25}{9} \\ 9x&+& 3y&+& 2z&=&2 \end{matrix}\right.\]剩下的式子,再用第二個式子消 \(y\):
\[\left\{\begin{matrix} 0\times y&+& (-\frac{114}{99}z)&=&\frac{273}{99} \\ \frac{11}{3}y&+& \frac{61}{9}z&=&\frac{25}{9} \\ \end{matrix}\right.\]得到 \(z=-2.39\),用 \(z\) 代回得到 \(y=5.18,x=-0.97\)。
在程式碼中實現就是這樣的步驟。
程式碼:
int main() { scanf ("%d", &n); for (int i = 1; i <= n; i++) for (int j = 1; j <= n + 1; j++) scanf ("%lf", &a[i][j]); for (int i = 1; i <= n; i++) { int mxi = i; for (int j = i + 1; j <= n; j++) if(fabs(a[mxi][i]) < fabs(a[j][i])) mxi = j; if(fabs(a[mxi][i]) < 1e-7) { puts("No Solution"); return 0; } swap(a[mxi], a[i]); double inv = a[i][i]; for (int j = i; j <= n + 1; j++) a[i][j] /= inv; for (int j = i + 1; j <= n; j++) { inv = a[j][i]; for (int k = i; k <= n + 1; k++) a[j][k] -= a[i][k] * inv; } } ans[n] = a[n][n + 1]; for (int i = n - 1; i; --i) { ans[i] = a[i][n + 1]; for (int j = i + 1; j <= n; ++j) ans[i] -= ans[j] * a[i][j]; } for (int i = 1; i <= n; i++) printf("%.2lf\n", ans[i]); return 0; }