/*-------------高斯—賽德爾迭代法解線性方程組---------
參考教材:《數值分析》李乃成,梅立泉,科學出版社
《計算方法教程》第二版 凌永祥,陳明逵*/
#include<stdio.h>
#include<math.h>
int main(void)
{
double A[5][5] = {{28,-3,0,0,0},
{-3,38,-10,0,-5},
{0,-10,25,-15,0},
{0,0,-15,45,0},
{0,-5,0,0,30}};
double b[5] = {10,0,0,0,0};
double x[5] = {0,0,0,0,0}; //第k+1次迭代的結果
double xx[5] = {0,0,0,0,0}; //第k次迭代的結果
int size = 5;
int Max = 100; //最大迭代次數
double residual = 0.0; //
double sum = 0.0;
double dis = 0.0;
double dif = 1.0; //相鄰迭代的結果差
double eps = 1.0e-3; //迭代精度
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];//本次的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;
//打印第k次的結果
printf("\n第%d次迭代的結果:\n",k);
for(i=0;i<size;i++)
{
printf("%12.8f ",x[i]);
xx[i]=x[i];
}
printf("\n與上次計算結果的距離(無窮範數):%12.8f \n",dif);
}
printf("\n迭代計算的結果爲:\n");
for(k=0;k<size;k++)
{
printf("%12.8f ",xx[k]);
}
printf("\n");
return 0;
}