工程电磁场C++编程作业-一、用超松弛迭代法求解接地金属槽内电位的分布二、按对称场差分格式求解电位的分布
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工程电磁场实验报告
——C++编程课题
一、用超松弛迭代法求解接地金属槽内电位的分布
二、按对称场差分格式求解电位的分布
一、用超松弛迭代法求解接地金属槽内电位的分布一、实验原理
二、程序框图:
三、实验内容:
1、用超松弛迭代法求解接地金属槽内点位分布
1)内容及要求:
2)实验思路:
由超松弛迭代法,将网格分成5*5列,边界点正好都是网格的节点,对所有的节点进行编号,并记录节点的坐标位置,并用一个二维数组进行表示u1[5][5],此数组表示的是迭代后的值。
考虑到迭代前后的数值不一样,再用一个二维数组表示迭代之前的数值u2[5][5]。
运用C++的知识在计算机上将边界值和内节点进行赋值,即将节点离散化。
然后开始迭代。
迭代开始之前将另一个数组b赋值,用数组a给其赋值,表示迭代之前的值,好用于后面精度的比较。
开始进行迭代时,根据超松弛公式将迭代方程编写输入。
每次迭代结束后将数组a和数组b对应的值进行比较,即是精度的计算。
如果误差大于所规定的误差0.00001,将a的值赋给b,然后继续进行迭代。
直到当迭代前后数值误差小于所规定的误差时停止迭代。
并比较迭代因子的大小对收敛次数的影响,选取最烧收敛次数的迭代因子作为实验最后的输出结果。
最后输出最适合迭代因子、迭代的次数和迭代后各点的电位值。
3)程序如下:
//********用超松弛迭代法求解接地金属槽内电位的分布********
#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; }
4)输出结果:
5)总结:
最佳收敛因子:1.18
此时的最少迭代次数:10
2、按对称场差分格式求解电位的分布
1)内容及要求:
2)实验思路:
类似与第一题的思路,但只计算一半的区域,对另一半进行对称性计算,减小计算量。
选取二维数组,同样是两个数组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里的值进行比较,没迭代一次都要进行比较。
如果在误差允许的范围内,则继续迭代;当超过误差标准的时候则停止迭代。
依旧按照比较得到最少收敛次数的方法在程序中计算出最佳收敛因子。
然后对对称列右边的点进行对称赋值。
最后输出输出最佳迭代因子、迭代的次数和迭代后各相应点的电位值。
3)程序如下:
//**************按对称场差分格式求解电位分布*****************
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
void main()
{
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<<"迭代前左半区域各电位点上的初始值:"<<endl;
for(i=0;i<41;i++)
{for(j=0;j<21;j++)
{cout<<u1[i][j]<<" "; //输出迭代初值}
cout<<endl; }
cout<<endl<<"\n";
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++)//判断精度
{{for(j=1;j<21;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; }}
for(i=1;i<40;i++)//对其对称点赋值
for(j=1;j<21;j++){ u1[i][40-j]=u1[i][j]; }
cout<<"迭代后各节点上最终电位近似值:"<<endl;
for(i=0;i<41;i++)
{for(j=0;j<41;j++)
{cout<<setiosflags(ios::fixed)<<setprecision(5)<<setw(8)<<u1[i][j]<<" ";//对齐输出} cout<<endl; }
cout<<endl<<endl;
cout<<"收敛因子:"<<a<<endl;
cout<<endl;
cout<<"迭代次数:"<<flag<<endl;
cout<<endl;}
4)输出结果如下:
5)总结:
最佳收敛因子:1.91
此时为最少迭代次数:128
四、实验总结与感想:
迭代法求解是用于边界条件比较复杂的情况,一般只能用于近似求解。
一般的迭代次数都是比较多,不适合人工运算,所以借助计算机进行运算。
运用计算机求解一些工程问题,大大减少了人工计算的时间,十分方便。
一些软件或编程语言的使用对于工科学生的学习和工作来说十分重要。
在本次工程电磁场实验中,我们掌握了Maxwell软件的使用,又对C++程序射进进行了巩固,是一次不小的经历,不管是在精力投入上还是学习过程中,我们都深知自己要学习的永远没有止尽。
在本次实验中,我们学习了利用计算机编程来求解电磁场的分布问题,经过全部的求解过程,我们知道,只要给定电磁场的边界条件和分界面衔接条件,以及电磁场所满足的微分方程,就能确定电磁场的分布。