#include<stdio.h>
#include<math.h>
int main()
{
double A[3][3] = {10,-1,-2,-1,10,-2,-1,-1,5};
double b[3] = {7.2,8.3,4.2};
double x[3] = {0,0,0};
//第k+1次迭代的结果
double xx[3] = {0,0,0};
//第k次迭代的结果
int size = 3;
int Max = 100;
//最大迭代次数
double residual = 0.0;
double sum = 0.0;
double dis = 0.0;
double dif = 1.0;
//相邻迭代的结果差
double eps = 1.0e-5;
//迭代精度
for(int k=1; (k<Max)&&(dif>eps); k++)
{
dif = 0.0;
for(int i=0; i<size; i++)
{
for(int j=0; j<size; j++)
{
//与Jacobi迭代法唯一的区别就是sum的求法
if(j<i)
{
sum +=A[i][j]*x[j];
}
if(j>i)
{
sum +=A[i][j]*xx[j];//上一次的x[j]
}
}
x[i] = (b[i]-sum)/A[i][i];
sum=0.0;
}
residual=0.0;
for(int m=0; m<size; m++)
{
dis=fabs(x[m]-xx[m]);
if(dis>residual)
residual=dis;
}
dif=residual;
printf("\n第%d次迭代的结果:\n",k);
for(int i=0; i<size; i++)
{
printf("%12.6f ",x[i]);
xx[i]=x[i];
}
printf("\n与上次计算结果的距离:%12.8f \n",dif);
}
printf("\n迭代计算的结果为:\n");
for(int k=0; k<size; k++)
{
printf("%12.6f ",xx[k]);
}
printf("\n");
return 0;
}
赛德尔迭代法
最新推荐文章于 2024-06-25 09:50:29 发布