各种迭代法的算法实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include
using namespace std;
int m,n;
//完成一个动态二维数组的创建
float **creat()
{
int i,j;
m=0;n=0;
cout<<"输入Ax=b的A矩阵数组p[m][n]的m行,n列"<cout<<"输入行m:";cin>>m;
cout<<"输入列n:";cin>>n;
float **p=new float *[m+1];
for(i=1;i<=m;i++)
p[i]=new float[n+1];
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
cout<<"输入"<cin>>p[i][j];
}
cout<}
cout<<"你输入的矩阵为:"<for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
cout<cout<}
cout<return p;
}
//完成Ax=b的b常量的输入
float *constant()
{
cout<<"输入形如Ax=b的b矩阵"<float *b=new float[m+1];
for(int i=1;i<=m;i++)
{
cout<<"输入b"<cin>>b[i];
}
cout<return b;
}
//完成x[0]的初始值输入
float *initx()
{
float *x=new float[n+1];
cout<<"输入x[n]的初始值"<for(int i=1;i<=n;i++)
{
cout<<"输入x["<cin>>x[i];
}
cout<return x;
}
//Jacobi迭代法
void jacobi(int e)
{
float **p,*b,*x;
int i,j,k;
float sum,*x1;
x1=new float[n+1];
p=creat();
b=constant();
x=initx();
cout<<"输入迭代次数k:";cin>>k;
for(int v=1;v<=k;v++)
{
for(i=1;i<=m;i++)
{
sum=0.0;
for(j=1;j<=n;j++)
if(i!=j)
sum=p[i][j]*x[j]+sum;
if(e==1)
x1[i]=(b[i]-sum)/p[i][i];
else if(e==2)
x[i]=(b[i]-sum)/p[i][i];
}
if(e==1)
for(i=1;i<=n;i++)
x[i]=x1[i];
}
cout<<"经过"<cout<<"x(k)=(";
for(i=1;i<=n-1;i++)
cout<cout<for(i=1;i<=m;i++)
delete[] p[i];
delete[] p;
delete[] b;
delete[] x;
cout<}
//Gauss-Seidel迭代法
void GaussSeidel()
{
jacobi(2);
}
//三次样条插值矩阵追赶法
void Chaseafter()
{
int i;
float *b,*a,*c,*q,*w,*f,*y,*x;
cout<<"输入Ax=f的A的m级矩阵数组p[m][m]的m行,m列"<cout<<"输入行列m:";cin>>m;
b=new float[m+1];
a=new float[m];
c=new float[m];
q=new float[m+1];
w=new float[m];
f=new float[m+1];
y=new float[m+1];
x=new float[m+1];
cout<<"将三次样条插值Ax=f的矩阵转换为A=LU格式"<cout<<"输入A矩阵的对角元素的值"<for(i=1;i<=m;i++)
{
cout<<"输入a["<cin>>b[i];
}
cout<for(i=2;i<=m;i++)
{
cout<<"输入a["<cin>>b[i];
}
cout<for(i=1;i{
cout<<"输入a["<cin>>c[i];
}
cout<for(i=1;i<=m;i++)
{
cout<<"输入f["<cin>>f[i];
}
cout<//计算A=LU中矩阵L和U矩阵的相关值
q[1]=b[1];w[1]=c[1]/b[1];
for(i=2;i<=m;i++)
{
q[i]=b[i]-a[i]

/w[i-1];
if(i<=m-1)
w[i]=c[i]/(b[i]-a[i]*w[i-1]);
}
//解方程Ly=f
y[1]=f[1]/b[1];
for(i=2;i<=m;i++)
y[i]=(f[i]-a[i]*y[i-1])/(b[i]-a[i]*w[i-1]);
//解方程Ux=y
x[m]=y[m];
for(i=m-1;i>=1;i--)
x[i]=y[i]-w[i]*x[i+1];
cout<<"解出x[i]为:"<cout<<"x(i)=(";
for(i=1;i<=m;i++)
cout<cout<delete[] b;
delete[] a;
delete[] c;
delete[] q;
delete[] w;
delete[] f;
delete[] y;
delete[] x;
}
/*印证收敛因子w对超松弛迭代方程的收敛速度的影响
目的是用于印证,因此方程特例化以以下方程为例n级
-4 1
1 -4 1
1 -4 1
. . .
. . .
. . .
1 -4 1
1 -4
*/
void facor()
{
float w,sum;int k=0,i;
cout<<"输入迭代因子:";cin>>w;
cout<<"输入级数n:";cin>>m;
float **p=new float *[m+1];
float *x1=new float[m+1];
for(i=1;i<=m;i++)
p[i]=new float[m+1];
for(i=1;i<=m;i++)
for(int j=1;j<=m;j++)
p[i][j]=0.0;
p[1][1]=-4;p[1][2]=1;
p[m][m]=-4;p[m][m-1]=1;

for(i=2;i{
p[i][i-1]=p[i][i+1]=1;
p[i][i]=-4;
}
float *b=new float[m+1];
float *x=new float[m+1];
b[1]=b[m]=-3;x[1]=x[m]=0.0;
for(i=2;i{
x[i]=0.0;
b[i]=-2;
}

do{
for(i=1;i<=m;i++)
x1[i]=x[i];
for(i=1;i<=m;i++)
{
sum=0.0;
for(int j=1;j<=m;j++)
if(i!=j)
sum=p[i][j]*x[j]+sum;
x[i]=w*(b[i]-sum)/p[i][i];
}
k++;
sum=0.0;
for(i=1;i<=m;i++)
sum=(x1[i]-x[i])*(x1[i]-x[i])+sum;
sum=sqrt(sum);
}
while(sum>0.000001);
cout<<"当迭代因子为"<for(i=1;i<=m;i++)
delete [] p[i];
delete [] p;
delete [] x;
delete [] x1;
delete [] b;
}



int main()
{
cout<<"*************************解线性方程组的迭代法*****************************"<int c=1;
while(c==1||c==2||c==3||c==4)
{
cout<<" 1.Jacobi迭代法。2.Gauss-Seidel迭代法。3.追赶法。4.超松弛迭代方程.5.退出系统。"<cout<<"选择:";cin>>c;
switch(c)
{
case 1:cout<<"**********************Jacobi迭代法*************************"<jacobi(1);break;
case 2:cout<<"*******************Gauss-Seidel迭代法*********************"<GaussSeidel();break;
case 3:cout<<"************************追赶法****************************"<Chaseafter();break;
case 4:cout<<"**********************超松弛迭代方程**********************"<facor();break;
}
}
return 0;
}

相关文档
最新文档