📄 gauss-seidel.txt
字号:
#include<stdio.h>
#define MAX 10
double A[MAX][MAX]; //系数矩阵
double b[MAX]; //右端项
double x0[MAX]; //初始迭代向量
double x[MAX]; //迭代向量
double e; //容许误差
int n; //A的阶数
int N; //最大迭代次数
double judge(double x[],double x0[])
{
//计算 ||x-x0||^2
double temp=0;
for(int i=1;i<=n;i++)
temp+=(x[i]-x0[i])*(x[i]-x0[i]);
return temp;
}
void main()
{
int i,j,k;
//以下代码输入系数矩阵A,右端项b,初始迭代向量x0,容许误差e,最大迭代次数N
printf("请输入系数矩阵A的阶数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("请输入A的第%d行元素,各元素间以空格间隔:\n",i);
for(j=1;j<=n;j++)
scanf("%lf",&A[i][j]);
}
printf("输入右端项b,各元素间以空格间隔:\n");
for(i=1;i<=n;i++)
{
scanf("%lf",&b[i]);
}
printf("输入初始迭代向量,各元素间以空格间隔:\n");
for(i=1;i<=n;i++)
{
scanf("%lf",&x0[i]);
}
printf("输入容许误差:\n");
scanf("%lf",&e);
printf("输入最大迭代次数:\n");
scanf("%d",&N);
//以下代码为迭代运算
for(k=1;k<=N;k++)
{
//第k次迭代
for(i=1;i<=n;i++)
{
//计算x,这几行代码为程序的关键,也是与Jacobi迭代法不同之处
x[i]=b[i];
for(j=1;j<=i-1;j++)
x[i]-=A[i][j]*x[j];
for(j=i+1;j<=n;j++)
x[i]-=A[i][j]*x0[j];
x[i]=x[i]/A[i][i];
}
//以下四行代码输出每次迭代的信息,可以省略
printf("第%d次迭代 ",k);
for(i=1;i<=n;i++)
printf("%lf ",x[i]);
printf("\n");
if(judge(x,x0)<e*e)
{
//判断是否满足要求
printf("\n迭代向量的近似值为:\n");
for(i=1;i<=n;i++)
printf("%lf ",x[i]);
return;
}
for(i=1;i<=n;i++) //不满足要求,此时令x0=x,进行下次迭代
x0[i]=x[i];
}
printf("迭代已超过最大次数!");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -