#include <stdio.h>
#include <math.h>
#define MAXstep 1000
#define Err 1e-6
double sum(int n, int i, double A[][100], double x[], double b[]);
void SOR(int n, double A[][100], double b[], double x[], double w);
double _max(double a, double b);
int main(){
int n;
double A[100][100],b[100],x[100];
double w;
scanf("%d", &n);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
scanf("%lf", &A[i][j]);
}
}
for(int i = 0; i < n; i++) scanf("%lf", &b[i]);
for(int i = 0; i < n; i++) scanf("%lf", &x[i]);
scanf("%lf", &w);
SOR(n, A, b, x, w);
}
double sum(int n, int i, double A[][100], double x[], double b[]) {
double ret=0;
for (int j=0; j<n; j++) {
ret += A[i][j] * x[j];
}
ret -= b[i];
return ret;
}
double _max(double a, double b) {
return a > b ? a : b;
}
void SOR(int n, double A[][100], double b[], double x[], double w){
double exp = 1.0 + Err;
int step = 0;
if (w >= 2 | w <= 0)
return;
while(exp > Err && step < MAXstep){
exp = 0;
double x0[100];
for (int u=0; u<n; u++) {
x0[u] = x[u];
}
for (int i=0; i<n; i ++) {
x[i] = x[i] - w / A[i][i] * sum(n, i, A, x, b);
exp = _max(exp, fabs(x[i] - x0[i]) / (1.0 + fabs(x[i])));
// printf("%lf ", exp);
}
step ++;
// printf("\n%d ", step);
// for (int k=0; k<n; k ++) {
// printf("%lf ", x[k]);
// }
}
if (step < 1000) {
for (int k=0; k<n; k ++) {
printf("%lf ", x[k]);
}
printf("\n%d", step);
}
}
12-17
4492