各种迭代法的算法实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include cout< /w[i-1];
#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<<"输入列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(j=1;j<=n;j++)
cout<
cout<
}
//完成Ax=b的b常量的输入
float *constant()
{
cout<<"输入形如Ax=b的b矩阵"<
for(int i=1;i<=m;i++)
{
cout<<"输入b"<cin>>b[i];
}
cout<
}
//完成x[0]的初始值输入
float *initx()
{
float *x=new float[n+1];
cout<<"输入x[n]的初始值"<
{
cout<<"输入x["<cin>>x[i];
}
cout<
}
//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<<"经过"<
for(i=1;i<=n-1;i++)
cout<
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列"<
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["<cin>>b[i];
}
cout<
{
cout<<"输入a["<cin>>b[i];
}
cout<
cout<<"输入a["<cin>>c[i];
}
cout<
{
cout<<"输入f["<cin>>f[i];
}
cout<
q[1]=b[1];w[1]=c[1]/b[1];
for(i=2;i<=m;i++)
{
q[i]=b[i]-a[i]
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]为:"<
for(i=1;i<=m;i++)
cout<
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<<"当迭代因子为"<
delete [] p[i];
delete [] p;
delete [] x;
delete [] x1;
delete [] b;
}
int main()
{
cout<<"*************************解线性方程组的迭代法*****************************"<
while(c==1||c==2||c==3||c==4)
{
cout<<" 1.Jacobi迭代法。2.Gauss-Seidel迭代法。3.追赶法。4.超松弛迭代方程.5.退出系统。"<
switch(c)
{
case 1:cout<<"**********************Jacobi迭代法*************************"<
case 2:cout<<"*******************Gauss-Seidel迭代法*********************"<
case 3:cout<<"************************追赶法****************************"<
case 4:cout<<"**********************超松弛迭代方程**********************"<
}
}
return 0;
}