超松驰迭代法SOR_解线性方程组的迭代法
标签:计算方法实验
#include <stdio.h>
#include <math.h>
#define maxn 3
int main()
{
double a[maxn][maxn + 1], x[maxn] = {0};
double eps = 1e-9, w = 1.05;
int n, k, kmax = 100;
freopen("gauss.txt", "r", stdin);
scanf("%d", &n);
for(int i = 0; i < n; i++)
for(int j = 0; j < n + 1; j++)
scanf("%lf", &a[i][j]);
//for(int i = 0; i < n; i++)
//{
//for(int j = 0; j < n + 1; j++) printf("%-15f", a[i][j]);
//printf("\n");
//}
for(k = 0; k < kmax; k++)
{
double norm = 0;
for(int i = 0; i < n; i++)
{
double x0 = x[i];
double sum = 0;
for(int j = 0; j < n; j++) if(j != i) sum += a[i][j] * x[j]; ///
x[i] = (1 - w) * x0 + (a[i][n] - sum) / a[i][i]; ///w松弛因子
if(fabs(x[i] - x0) > norm) norm = fabs(x[i] - x0); //norm计算范数
}
printf("\nk = %2d x = ", k + 1);
for(int i = 0; i < n; i++) printf("%-15f", x[i]);
if(norm < eps) break;
}
if(k < kmax)
{
printf("\n\nk = %d\n", k + 1);
for(int i = 0; i < n; i++) printf("x%d = %-15f\n", i + 1, x[i]);
}
else printf("\n\nfailed\n");
return 0;
}
数据文件
实验结果