迭代法的突出优点是算法简单,因而写成程序比较容易,然而迭代法又要求系数矩阵在迭代过程中保持收敛(要求对角占优),否则发散的迭代没有实用价值。
1>Jacobi迭代法
对于线性方程组∑aij*xj=bi,转化为xi=(bi-∑aij*xj)/aij,选取迭代初值x1=x2=x3=0,将其代入迭代,不断用第k步的值进行迭代出k+1步,直至逼近所要的结果。
do{
cout<<endl;
error1=0;//清零
for(i=0;i<row;i++)
{
temp=0;
for(j=0;j<line;j++)
if(j!=i)temp=temp+matrix[i][j]*x[j];
x1[i]=(result[i]-temp)/matrix[i][i];
cout<<x1[i]<<"\t";
if(ABS(x1[i]-x[i])>error1)error1=ABS(x1[i]-x[i]);//寻找最大误差
}
for(j=0;j<line;j++)x[j]=x1[j];
}while(error1>error);//精度控制
2>Gauss-Seidel迭代法
类似于上述Jacobi的迭代方法,只不过这里将每次运算出的最新结果立马运用于接下来的运算当中,而不等到下一轮才开始。
do{
cout<<endl;
error1=0;//误差清零
for(i=0;i<row;i++)
{
temp=0;
for(j=0;j<line;j++)
if(j!=i)temp=temp+matrix[i][j]*x[j];
temp1=x[i];
x[i]=(result[i]-temp)/matrix[i][i];
cout<<x[i]<<"\t";
if(ABS(x[i]-temp1)>error1)error1=ABS(x[i]-temp1);//寻找当前最大误差
}
}while(error1>error);
说明:一般说来,后者的迭代方法省空间也节省时间自然比前者好,但有时候,后者的迭代比前者迭代收敛慢甚至可能有后者不收敛而前者收敛的情况出现。此外,为了及时制止发散情况的出现,可以通过限制运算次数的方式减少资源的浪费。