当前位置:文档之家› 迭代法实验报告

迭代法实验报告

迭代法实验报告 一. 实验目的:掌握迭代方法的用处 二. 实验环境:Cfree5.0 三. 实验时间:2013年6月20日 四. 实验地点:电子信息楼1201教室 五. 实验内容:运用编程实现迭代方法可以更好的解线性方程组,得到线性方程的解。

六. 实验理论依据:
高斯-赛德尔(Gauss-Seidel )迭代公式
我们注意到在雅可比迭代法中并没有对新算出的分量11k x +,12k x +,,
11k i x +-进行充分利用.不妨设想,在迭代收敛的条件下,我们把
(1)()()()11211331111(1)()()()22112332222(1)()()()1122,111()1(1(k k k k n n k k k k n n k k k k n n n n n n nn x a x a x a x b a x a x a x a x b a x a x a x a x b a +++--⎧=---+⎪⎪⎪=---+⎪⎨⎪⎪⎪=---+⎪

式中第一个方程算出的11k x +立即投入到第二个方程中,代替()1k x 进行计算,当12
k x +算出后代替()2k x 马上投入到第三个方程中计算,依次进行下去,这样也许会得到
更好的收敛效果.根据这种思路建立的一种新的迭代格式,我们称为高斯-赛德尔(Gauss-Seidel )迭代公式,
高斯=赛德尔迭代法的分量形式:
(1)()()()11211331111(1)(1)()()22112332222(1)(1)(1)(1)1122,111()1(1(k k k k n n k k k k n n k k k k n n n n n n nn x a x a x a x b a x a x a x a x b a x a x a x a x b a +++++++--⎧=---+⎪⎪⎪=---+⎪⎨⎪⎪⎪=---+⎪

高斯-赛德尔迭代法的矩阵形式:
(1)(),(0,1,2,)k k x Bx f k +=+=
其中
1()B D L U -=-,1()f D L b -=- B 称为高斯-赛德尔迭代矩阵,f 称为高斯-赛德尔迭代常量..
七. 运行代码如下:
#include"stdio.h"
#include"math.h"
int main()
{
bool pan1=true;
int n,n1,n2=0,k=0;
double
num[100][100],L[100][100],U[100][100],x[100],y[100],num1=0,b[100],D[100][100],x1[200][200],x2[200][200];
printf("\n");
printf("*******************************高斯迭代法解如下********************************");
printf("输入要输入矩阵的阶数为(按Enter 输入矩阵数字):");//
输入矩阵的阶数
scanf("%d",&n1);
for(int i=0;i<n1;i++)//输入矩阵的数
{
printf("输入第%d行数字为(按Enter进入下一行的输入):",i+1);
for(int j=0;j<n1;j++)
{
scanf("%lf",&num[i][j]);
}
}//输入矩阵的数结束
for(int i=0;i<n1;i++)//求解对角线上的矩阵数
{
for(int j=0;j<n1;j++)
{
if(i==j)
{
D[i][j]=num[i][j];
L[i][j]=0;
U[i][j]=0;
}
if(i>j)
{
L[i][j]=-num[i][j];
}
if(i<j)
{
U[i][j]=-num[i][j];
}
}
}//求解对角线上的矩阵数结束
printf("=================================输出D的矩阵为==================================");
for(int i=0;i<n1;i++)//输出D矩阵 {
for(int j=0;j<n1;j++)
{
printf("%10lf",D[i][j]);
}
printf("\n");
}
printf("\n");
printf("=================================输出L的矩阵为
==================================");
for(int i=0;i<n1;i++)//输出L矩阵
{
for(int j=0;j<n1;j++)
{
printf("%10lf",L[i][j]);
}
printf("\n");
}
printf("\n");
printf("=================================输出U的矩阵为
==================================");
for(int i=0;i<n1;i++)//输出U矩阵
{
for(int j=0;j<n1;j++)
{
printf("%10lf",U[i][j]);
}
printf("\n");
}
printf("输入矩阵右端常数为(以空格隔开,按回车进
行下一步):");//输入b的值
for(int i=0;i<n1;i++)
{
scanf("%lf",&b[i]);
}//输入b的值结束
printf("输入初始化x(0)的矩阵值(以空格隔开,按回车得到结果):");//输入x的值
for(int i=0;i<n1;i++)
{
scanf("%lf",&x2[0][i]);
}
while(pan1)//高斯迭代法的for语句部分 {
for(int i=0;i<n1;i++)
{
for(int j=0;j<i;j++)
{
num1+=num[i][j]*x2[k+1][j];
}
for(int j1=i+1;j1<n1;j1++)
{
num1+=num[i][j1]*x2[k][j1];
}
x2[k+1][i]=(b[i]-num1)/num[i][i];
num1=0;
}
for(int i=0;i<n1;i++) {
if(fabsf(x2[k+1][i]-x2[k][i])<0.002) {
n2++;
}
}
if(n2==n1)
{
pan1=false; }
else
{
k++;
pan1=true; }
}//高斯迭代法的for语句部分结束
printf("迭代次数k的值为:%d\n",k);//输出迭代次数
printf("输出的迭代法解的结果为:\n"); for(int i=0;i<n1;i++)//输出x的解
{
printf("第%d个x的值为:%lf\n",i+1,x2[k][i]);
}
printf("\n");
}
八.运行结果如下:
九.实验心得:
高斯=赛德尔迭代法其系数矩阵是严格对角占优的,所以高斯=赛德尔迭代法有很好的收敛性。

相关主题