}
}
cout<<\初始点位:\Show();
void overrei::Cal() //计算 { inti,j; int c=1; while(1) { c=1; for(i=0;i if((p[i][j]-q[i][j])>e||(q[i][j]-p[i][j])>e) //相邻两次迭代误差是否小于1e-5 { c=0;break; } } if(c==0) break; } if(c==1 && k!=0) break; Diedai(); } } void overrei::Diedai() //迭代函数 { inti,j; double y=x/4; if(k%2) { for(i=1;i p[i][j]=q[i][j]+y*(p[i-1][j]+p[i][j-1]+q[i+1][j]+q[i][j+1]-4*q[i][j]); } } k++; } void overrei::Show() //输出部分 { inti,j; for(i=0;i int main() { cout<<\ **************************************\ cout<<\ 超松弛迭代法求解接地金属槽内电位的分布\ cout<<\ **************************************\ overrei A(5,5,1e-5); A.Initialization(); A.Cal(); cout<<\电位分布:\ A.Show(); cout<<\迭代次数:\ return 0; } 实验二按对称场差分格式求解电位的分 布 一.实验思路 只计算一半的区域,对另一半进行对称性计算,减小计算量。选取二维数组,同样是两个数组a[41][41]、b[41][41],分别用于表示迭代前后的取值。由此对第20列进行特殊处理。即第21列是和第20列相等的,因为在第21列上标注了\?Φ/?x=0,即要求每次迭后都要求u1[i][20]=u1[i][19],其余则同前。当计算出了前21列的电位值时,根据对称性可得到 右半边的电位值,即要求u1[i][40-j]=u1[i][j];,直接赋值。四周的电位值依旧保持不变,不能够参与迭代。并且中间对称列上的电位值为零,故也不参与迭代。由题意可知,只有第1列到第20列参与迭代。在进行精度计算时,用数组b的值与相应数组a里的值进行比较,没迭代一次都要进行比较。如果在误差允许的范围内,则继续迭代;当超过误差标准的时候则停止迭代。依旧按照比较得到最少收敛次数的方法在程序中计算出最佳收敛因子。然后对对称列右边的点进行对称赋值。最后输出输出最佳迭代因子、迭代的次数和迭代后各相应点的电位值。 二.源程序代码 #include double u1[41][41],u2[41][41]; int flag=10000,i,j,e,n; double a,d; //a最佳加速收敛因子 for(j=0;j<41;j++) { u1[0][j]=100; u1[40][j]=0; } for(i=1;i<40;i++) { u1[i][0]=0; u1[i][40]=0; } for(i=1;i<40;i++) //内部点赋初值 for(j=1;j<21;j++) { u1[i][j]=2.5*(j-1); } cout<<\迭代前左半区域各电位点上的初始值:\ for(i=0;i<41;i++) { for(j=0;j<21;j++) { cout< cout< cout< for(d=1;d<2;d+=0.01)//取迭代次数最少的加速收敛因子 { n=0; for(j=0;j<41;j++) { u1[0][j]=100; u1[40][j]=0; } for(i=1;i<40;i++) { u1[i][0]=0; u1[i][40]=0; } for(i=1;i<40;i++) for(j=1;j<21;j++) { u1[i][j]=2.5*(j-1); } do//迭代x次 { for(i=0;i<41;i++) { for(j=0;j<22;j++) { u2[i][j]=u1[i][j]; } } for(i=1;i<40;i++) { for(j=1;j<20;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]); } u1[i][20]=u1[i][19]; } for(i=1;i<40;i++)//判断精度