求逐次超松弛迭代法(SOR)的C++程序 5
编制解n阶线性方程组Ax=b的SOR方法的通用程序(要求x(k)-x(k-1)≤ε),最好是C++程序。...
编制解n阶线性方程组Ax=b的SOR方法的通用程序(要求x(k)-x(k-1)≤ε),最好是C++程序。
展开
1个回答
展开全部
#include<iostream.h> #include<math.h> #include<iomanip.h> Void main()
{double u1[5][5],u2[5][5]; int flag=1000,i,j,e,n;
double a,d;//a最佳加速收敛因子
for(i=0;i<5;i++)for(j=0;j<5;j++)
{if(i==0)u1[i][j]=100;else u1[i][j]=0;}
cout<<"迭代前各电位点上的初始值:"<<endl;
for(i=0;i<5;i++)
{for(j=0;j<5;j++){cout<<u1[i][j]<<" ";//输出迭代初值}cout<<endl; }cout<<"\n";
for(d=1;d<2;d+=0.01)//找取迭代次数最少的加速收敛因子 {n=0;for(j=0;j<5;j++)
{u1[0][j]=100;}
for(i=1;i<5;i++)for(j=0;j<5;j++) {u1[i][j]=0;}do//迭代x次 {for(i=0;i<5;i++) {for(j=0;j<5;j++) {u2[i][j]=u1[i][j];}}
for(i=1;i<4;i++)for(j=1;j<4;j++)
{u1[i][j]=u2[i][j]+(d/4)*(u2[i+1][j]+u2[i][j+1]+u1[i-1][j]+u1[i][j-1]-4*u2[i][j]);} for(i=1;i<4;i++)//判断精度 {{for(j=1;j<4;j++)
{if(fabs(u1[i][j]-u2[i][j])>1e-5)
{e=1; break; }
else e=0; }
if(e==1) break; }} n++;//迭代次数}while(e); if(n<flag) {flag=n; a=d; }}
cout<<"收敛因子:"<<a<<endl;
cout<<endl;
cout<<"迭代次数:"<<flag<<endl; cout<<endl;
cout<<"各节点上最终电位近似值:"<<endl; for(i=0;i<5;i++) {for(j=0;j<5;j++)
{cout<<setiosflags(ios::fixed)<<setprecision(5)<<setw(8)<<u1[i][j]<<" "; //对齐输出} cout<<endl; }
cout<<endl; }
{double u1[5][5],u2[5][5]; int flag=1000,i,j,e,n;
double a,d;//a最佳加速收敛因子
for(i=0;i<5;i++)for(j=0;j<5;j++)
{if(i==0)u1[i][j]=100;else u1[i][j]=0;}
cout<<"迭代前各电位点上的初始值:"<<endl;
for(i=0;i<5;i++)
{for(j=0;j<5;j++){cout<<u1[i][j]<<" ";//输出迭代初值}cout<<endl; }cout<<"\n";
for(d=1;d<2;d+=0.01)//找取迭代次数最少的加速收敛因子 {n=0;for(j=0;j<5;j++)
{u1[0][j]=100;}
for(i=1;i<5;i++)for(j=0;j<5;j++) {u1[i][j]=0;}do//迭代x次 {for(i=0;i<5;i++) {for(j=0;j<5;j++) {u2[i][j]=u1[i][j];}}
for(i=1;i<4;i++)for(j=1;j<4;j++)
{u1[i][j]=u2[i][j]+(d/4)*(u2[i+1][j]+u2[i][j+1]+u1[i-1][j]+u1[i][j-1]-4*u2[i][j]);} for(i=1;i<4;i++)//判断精度 {{for(j=1;j<4;j++)
{if(fabs(u1[i][j]-u2[i][j])>1e-5)
{e=1; break; }
else e=0; }
if(e==1) break; }} n++;//迭代次数}while(e); if(n<flag) {flag=n; a=d; }}
cout<<"收敛因子:"<<a<<endl;
cout<<endl;
cout<<"迭代次数:"<<flag<<endl; cout<<endl;
cout<<"各节点上最终电位近似值:"<<endl; for(i=0;i<5;i++) {for(j=0;j<5;j++)
{cout<<setiosflags(ios::fixed)<<setprecision(5)<<setw(8)<<u1[i][j]<<" "; //对齐输出} cout<<endl; }
cout<<endl; }
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询