我选择的是简单好写的高斯-约旦消法
1.选择一个尚未被选过的未知数作为主元,选择一个包含这个主元的方程。
2.将这个方程主元的系数化为1。
3.通过加减消元,消掉其它方程中的这个未知数。
4.重复以上步骤,直到把所有式子变成形如: a*1+b*0+c*0……=d
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| inline bool Gauss() { for (int i = 1; i <= n; ++i) { int mx = i; for (int j = i + 1; j <= n; ++j) if (abs(a[j][i]) > abs(a[mx][i])) mx = j; if (a[mx][i] == 0) return false; for (int j = i; j <= n + 1; ++j) swap(a[i][j], a[mx][j]); for (int j = 1; j <= n; ++j) if (j != i) { double d = a[j][i] / a[i][i]; for (int k = i + 1; k <= n + 1; ++k) a[j][k] -= a[i][k] * d; } } return true; }
|
输出解
1 2
| for (int i = 1; i <= n; ++i) printf("%.2f\n", a[i][n+1] / a[i][i]);
|