直接上代码
/*
用迭代法求解方程组Ax=b
Gauss-Seidel法
*/
#include<stdio.h>
#include<math.h>
#define EPS 0.5e-6
double a[10][10], b[10], x[10], y[10];//分别表示A,b,x,y
double sum=0;
int N0, n;//最大迭代次数N0, n*n的数组A
void input(){
printf("输入n:");
scanf("%d", &n);
printf("输入二维数组A:\n");
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
scanf("%lf", &a[i][j]);
}
}
printf("输入一维数组b:\n");
for(int i = 1;i <= n;i++){
scanf("%lf", &b[i]);
}
printf("输入最大迭代次数N0:\n");
scanf("%d", &N0);
for(int i = 1;i <= n;i++){
x[i] = 0;
}
}
//计算yi-xi的绝对值的最大值
double G_max(double x[], double y[]){
double max=0;
for(int i = 1; i <= n; i++){
if(fabs(y[i] - x[i]) > max){
max=fabs(y[i] - x[i]);
}
}
return max;
}
void Gauss_Seidel(){
printf("k x[1] x[2] x[3]\n");
for(int k=1 ; k<=N0; k++){
printf("%d %lf %lf %lf\n", k, x[1], x[2], x[3]);
for(int i=1; i<=n ;i++){
sum = 0;
for(int j=1; j<=n; j++){
for(int t = 1; t < j; t++){
x[t] = y[t];
}
if (i != j){
sum+= a[i][j] * x[j];
}
}
y[i] = (-1 * sum + b[i]) / a[i][i];
}
if (G_max(x,y) > EPS){
for (int i=1; i<=n; i++){
x[i] = y[i];//继续迭代
}
}
else {
printf("\n迭代次数为 %d\n",k);
printf("最终迭代结果如下(xi):\n");
for(int i=1; i<=n; i++){
printf("x%d = %lf\n", i, y[i]);
}
return;
}
}
printf("\n迭代次数超过N0!计算失败!\n");
return;
}
int main(){
input();
Gauss_Seidel();
return 0;
}