Link
一道高斯消元的题目,其实重点还是在如何得出方程组也就是增广矩阵。
代码
const double EPS=1e-7;
inline int gauss(double a[][N], bool l[], double ans[], const int& n) {
int res = 0, r = 0;
for(int i = 0; i < n; i++)
l[i] = false;
for(int i = 0; i < n; i++) {
for(int j = r; j < n; j++)
if(fabs(a[j][i]) > EPS) {
for(int k = i; k <= n; k++)
swap(a[j][k], a[r][k]);
break;
}
if(fabs(a[r][i]) < EPS) {
++res;
continue;
}
for(int j = 0; j < n; j++)
if(j != r && fabs(a[j][i]) > EPS) {
double tmp = a[j][i] / a[r][i];
for(int k = i; k <= n; k++)
a[j][k] -= tmp * a[r][k];
}
l[i] = true;
++r;
}
for(int i = 0; i < n; i++)
if(l[i])
for(int j = 0; j < n; j++)
if(fabs(a[j][i]) > EPS)
ans[i] = a[j][n] / a[j][i];
return res;
}
double b[N][N], a[N][N];
double ans[N];
bool l[N];
int n;
void solve() {
cin >> n;
for(int i = 0; i < n + 1; i++) {
for(int j = 0; j < n; j++) {
cin >> b[i][j];
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++)
a[i][n] += b[i][j] * b[i][j] - b[i+1][j]*b[i+1][j];
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
a[i][j] = 2 * (b[i][j] - b[i+1][j]);
}
}
gauss(a, l, ans, n);
for(int i = 0; i < n; i++)
printf("%.3lf ", ans[i]);
cout << endl;
}