一,问题的提出
对实验四所列目的和意义的线性方程组,试分别选用Jacobi迭代法,Gauss-Secidol迭代法和SOR方法计算其解.
二,要求
1,体会迭代发求解线性方程组,并能与消去法做比较
2,分别对不同精度,体会该迭代法的收敛快慢.
3,对方程组2,3使用SOR方法时,选取松弛因子,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;
4,给出各种算法的设计程序和计算结果
三,目的和意义
1,通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较,
2,运用所学的迭代算法,解决各类线性方程组,编出算法程序;
四,代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <math.h>
using namespace std;
const int maxn=3;
int main()
{
double a[maxn][maxn]= {{10,-1,2},{-1,10,-2},{-1,-1,5}};
double b[maxn]= {7.2,8.3,4.2};
double x[maxn]= {0,0,0},y[maxn],s,Max,eps=0.00000000001;
int k=1;
while(k<100) //循环迭代200次,判断是否收敛
{
Max=0;
for(int i=0; i<maxn; i++)
{
int sum=0;
for(int j=0; j<maxn; j++)
if(i!=j)
sum+=a[i][j]*x[j]; //求出方程式左边之和
y[i]=(b[i]-sum)/a[i][i]; //新迭代出来的x的值
}
for(int i=0; i<maxn; i++)
if(Max<fabs(y[i]-x[i])) //循环求出所有x的精确度(Max存最大的精确度)
Max=fabs(y[i]-x[i]);
if(Max<eps) break; //最大的精确度都小于要求的精确度满足条件退出循环
printf("\nk=%d, ",k);
for(int i=0; i<maxn; i++)
printf("y[%d]=%lf ",i,y[i]);
k++;
for(int i=0;i<maxn;i++)
x[i]=y[i]; //更新x的值重新迭代
}
if(k==100)
printf("ERROR!\n");
printf("\nk=%d, ",k);
for(int i=0; i<maxn; i++)
printf("y[%d]=%lf ",i,y[i]); //输出迭代出的x
return 0;
}