方程组的简单迭代法

  • 格式:doc
  • 大小:220.66 KB
  • 文档页数:10

2013-2014(1)专业课程实践论文题目:方程组的简单迭代法
一、算法理论
1.解线性方程组的两种方法:
直接法: 经过有限次运算后可求得方程组精确解的方法(不计舍入误差!)
迭代法:从解的某个近似值出发,通过构造一个无穷序列去逼近精确解的方法。

2.迭代法主要研究的问题:
1)迭代格式的构造;
2)迭代的收敛性分析;
3)收敛速度分析;
4)复杂性分析;(计算工作量)
5)初始值选择。

3.迭代法的原理:
Ax=中系数矩阵的主对角线移到一边并将其系将原线性方程组b
数化为一,然后在给定迭代初值的情况下通过迭代的方法求解线性方程组的值。

4.迭代法的基本思想:
Ax=(1)将线性方程组b
(其中A为n阶非奇异矩阵,b为n维向量)
改写成等价形式 f Bx x += (2) 构造简单迭代格式:
j k j k j f Bx x +=+)(
)1(
)(,,...2,1,0=k (3)
亦即
j k j k j f Bx x +=+)(
)1(
)( , ,...,,...,n;k ,j 1021== (4)
可算出线性方程组(1)的近似解序列:))1(0,...,k x x x ()(
我们把用公式(3)进行迭代求解的方法称为简单法,并称式(3)
为简单迭代式,矩阵B 称为迭代矩阵,)(0x 称为初始近似解,)
(k x 称为k 次近似解,k 称为迭代次数。

#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
#define kk 50 //定义最大方程元数
int n,i,c,j,hh,gg,mm;
double A[kk][kk],x[kk][kk],b[kk],y[kk],a[kk],z[kk],m,nn,d,e=1,w,fff ; int main()
{
cout<<"输入的方程元数"<<endl; //数据的输入
cin>>n;
cout<<"请输入方程系数矩阵:"<<endl;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>A[i][j];
cout<<"请输入右边向量:"<<endl;
for(i=0;i<n;i++)
cin>>b[i];
cout<<"输入你想要的迭代精度(建议1e-5以上)!"<<endl; cin>>fff;
cout<<"输入最大迭代次数(建议300次以上)!"<<endl;
cin>>mm;
//计算出迭代矩阵
for(i=0;i<n;i++)
{
b[i]=b[i]/A[i][i];
for(j=0;j<n;j++)
{
if(i==j)
{
x[i][i]=0;
}
else
{
x[i][j]=-A[i][j]/A[i][i];
}
}
}
//输出迭代矩阵
cout<<"计算出迭代矩阵为:"<<endl; for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<x[i][j]<<" ";
cout<<b[i]<<" ";
cout<<endl;
}
//赋迭代初值
cout<<"输入迭代初值"<<endl;
for(i=0;i<n;i++)
cin>>y[i];
int f=1;
//简单迭代法
cout<<" ";
for(i=1;i<n+1;i++)
cout<<'\t'<<"X["<<i<<"]"<<" "<<'\t'; cout<<"精度";
cout<<endl;
cout<<"迭代初值为:";
cout<<setiosflags(ios::fixed);
for(i=0;i<n;i++)
cout<<y[i]<<" ";
cout<<endl;
while(e>fff)
{
for(i=0;i<n;i++)
z[i]=y[i];
nn=0;
for(j=0;j<n;j++)
{
nn=nn+x[i][j]*y[j];
y[i]=nn+b[i];
}
e=fabs(z[0]-y[0]);
if(fabs(z[i]-y[i])>e)
e=fabs(z[i]-y[i]);
if(i==0)
{
cout<<setiosflags(ios::fixed);
cout<<"第"<<setw(3)<<setprecision(3)<<f++<<"次迭代"<<" "; }
cout<<setiosflags(ios::fixed);
cout<<setw(8)<<setprecision(8)<<y[i]<<" ";
}
cout<<e;
cout<<endl;
if(f>mm)
{
cout<<"迭代次数大于"<<mm<<"次"<<endl;
cout<<"认为方程发散,迭代不收敛"<<endl;
exit(1);
}
}
cout<<endl;
cout<<endl;
cout<<"方程迭代了"<<f-1<<"次,达到你所要求的精度"<<fff<<endl; cout<<"最后结果为:"<<endl;
cout<<endl;
for(i=0;i<n;i++)
{
cout<<"X"<<"["<<i+1<<"]"<<"="<<y[i];
cout<<endl;
}
exit(1);
四、算法实现
例1.用简单迭代法解线性方程组
⎪⎩⎪⎨⎧=+--=-+-=--2.453
.82102.7210321321321x x x x x x x x x
解: 先在输入方程元数内输入3
在输入方程系数矩阵内输入10 -1 -2;-1 10 -2; -1 -1 5 在输入右边向量内输入7.2 8.3 4.2
输入想要的迭代精度0.000000001
输入最大迭代次数25
输入迭代初始值0 0 0
运行结果如图
4.1
图4.1
例2.用简单迭代法解方程组
⎩⎨⎧=+=+12232
121x x x x 解:先在输入方程元数内输入2
在输入方程系数矩阵内输入3 1;1 2 在输入右边向量内输入2 1 输入想要的迭代精度0.0000001 输入最大迭代次数15
输入迭代初始值0.1 0.1
运行结果如图4.2
图4.2。