线性方程求解实验
一、实验环境
实验设备:计算机
实验使用的语言:高级程序设计语言(C、Java或Matlab等)
二、实验要求
1、认真分析题目的条件和要求,复习相关理论知识,选择适当的解决方案和算法;
2、编写上机实验程序,作好上机前的准备工作;
3、上机调试程序,并试算各种方案,记录计算的结果(包括必要的中间结果);
4、对实验结果进行分析、归纳、总结。
三、实验目的
熟练掌握Jacobi法和 Gauss-Seidel法,认识迭代法收敛的含义以及迭代法初值和方程组系数矩阵性质对收敛速度的影响。
四、实验内容
【实验题1】
用迭代法求解 Ax=b;(迭代法收敛速度实验)
(Jacobi法)
- 问题的求解算法及数据结构(流程图)
2.源程序清单
#include<math.h>
#include<stdio.h>
#define N 3
#define EPS 0.5e-6
static double aa[N][N]={{6,2,-1},{1,4,-2},{-3,1,4}};
static double bb[N]={-3,2,4};
int main()
{
int i,j,k,NO;
double a[N+1][N+1],b[N+1],x[N+1],y[N+1];
double d,sum,max;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
a[i][j]=aa[i-1][j-1];
b[i]=bb[i-1];
}
printf("\n Please enter NO:");
scanf(" %d",&NO);printf("\n");
for(i=1;i<=N;i++) x[i]=0;
k=0;
printf(" k", ' ');
for(i=1;i<=N;i++) printf("%8cx[%d]", ' ',i);
printf("\n 0");
for(i=1;i<=N;i++) printf("%12.8g",x[i]);
printf("\n");
do
{
for(i=1;i<=N;i++)
{
sum=0.0;
for(j=1;j<=N;j++)
if(j!=i) sum=sum+a[i][j]*x[j];
y[i]=(-sum+b[i])/a[i][i];
}
max=0.0;
for(i=1;i<=N;i++)
{
d=fabs(y[i]-x[i]);
if(max<d) max=d;
x[i]=y[i];
}
printf("%6d",k+1);
for(i=1;i<=N;i++) printf("%12.8g",x[i]);
printf("\n");
k++;
}
while((max>=EPS)&&(k<NO));
printf("\n k=%d\n",k);
if(k>=NO) printf("\n fail! \n");
else for(i=1;i<=N;i++)
printf(" x[%d]=%g",i,x[i]);
}
3.程序运行结果及分析
(1)选取不同初值和不同的b,给定迭代误差用两种迭代法计算,观测得到的迭代向量并分析计算结果给出结论。
代码同上,取b2
运行截图:
代码同上,取b1,x0取1
运行截图:
(2)取定及b,将A的主对角线元素成倍放大,其他不变,用迭代法计算多次,比较收敛速度,分析计算结果并给出结论。
x0={0,0,0},b取b1,A的主对角线元素放大两倍
代码同上,讲矩阵主对角线的两个放大两倍
运行截图:
x0={0,0,0},b取b1,A的主对角线元素放大三倍
代码同上,讲矩阵主对角线的两个放大三倍
运行截图:
五、实验总结
经过这次实验,我了解了:1.迭代法具有需要计算机的存贮单元较少,程序设计简单,原始系数矩阵在计算过程中始终不变等优点。2.迭代法在收敛性及收敛速度等方面存在问题。
在同等精度下,Gauss-Seidel迭代法比Jacobi迭代法收敛速度快。一般来说,Gauss-Seidel迭代法比Jacobi迭代法收敛要快,但有时反而比Jacobi迭代法要慢,而且Jacobi迭代法更易于优化。因此,两种方法各有优缺点,使用时要根据所需适当选取。
当松弛因子为1时,超松弛迭代方法等同于Gauss-Seidel迭代法,这和理论推导完全相同。另外,超松弛迭代法的收敛速度完全取决于松弛因子的选取,一个适当的因子能大大提高收敛速度。