1、资料内容仅供您学习参考,如有不当之处,请联系改正或者删除。工程电磁场报告工程电磁场报告2010/4/2王小警工程电磁场报告 -迭代法在计算电位中的应用所谓迭代法, 是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法( 或者称为一次解法) , 即一次性解决问题。迭代法又分为精确迭代和近似迭代。”二分法”和”牛顿迭代法”属于近似迭代法。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、 适合做重复性操作的特点, 让计算机对一组指令( 或一定步骤) 进行重复执行, 在每次执行这组指令( 或这些步骤) 时, 都从变量的原值推出它的一个新值。在这次实验中是利用迭代法求出在二维
2、场中的电位分布, 相对于其它求解方法, 虽然精确度存在误差, 可是简单易行, 充分利用计算机的高效, 能够很快的得出大致的电位分布。实验采用的是C+语言进行辅助。一、 初试牛刀-计算55的电位分布; 这个实验是用于实现超松弛法来求节点电位, 考虑到要求的场是二维分布的, 因此构造的基本数据为二维数组, 套用的迭代公式为: aij=bij+( /4)*(bi+1j+bij+1+ai-1j+aij-1-4*bij);迭代因子为, 可根据经验公式算出, 直接赋值, 考虑到计算机的高效性, 在此可任取一大于1小于2的数, 最后均能得出答案, 只是迭代次数有所差异。启动该实验的方框图如下赋边界已知电位赋
3、场点初始值累计迭代次数M=0迭代次数M+1利用公式进行迭代判断是否达到精度要求 N Y打印出每一个点的点位 Y结束实现该功能的源程序如下: #include#include#includevoid main()double a55; double b55; int i=0,j=0;static int M=0;bool N=true;for(j=1;j=3;j+) for(i=1;i=3;i+)aij=0; for(j=0;j=4;j+) a4j=0;a0j=100;for(i=1;i=4;i+)ai0=0;ai4=0; cout各内节点上电位的初始迭代值为:endl;/输出初始迭代值for(
4、i=0;i=4;i+)for(j=0;j=4;j+)coutaij ; coutendl;coutn; do for(i=0;i=4;i+) for(j=0;j=4;j+) bij=aij; for(i=1;i=3;i+) for(j=1;j=3;j+) aij=bij+(1.2/4)*(bi+1j+bij+1+ai-1j+aij-1-4*bij); for(i=1;i=3;i+) for(j=1;j0.00001) N=true; break; else N=false; M+; while(N); cout经迭代后, 各节点电位的近似值为:endl;for(i=0;i=4;i+)for(j
5、=0;j=4;j+)coutsetiosflags(ios:fixed)setprecision(5)aij ;coutendl;coutendl;cout迭代次数Mendlendl;程序很短, 可是实现了要求的功能, 经运行可得出结果: 电位大概的分布如左图所示, 能够看出还是比较符合的。在这个实验中要注意几点: 首先是要选取合适的数据类型, 如果采用了int型, 会对结果造成很大的影响; 其次是对精度的控制, 否则会影响迭代次数和结果; 再次就是迭代公式要熟悉, 把它转换为计算机语言。总之这个实验算是一个练手, 为下一步的实验打下基础。搞清楚这个实验的原理和方法, 很容易得出下一个实验的操
6、作过程。二、 实战演练-用迭代法求出对称场中的点位分布。其实这一个实验和上一个是大同小异, 只是要考虑最中间一行的迭代关系, 这很重要, 否则会出现中间两行没有进行迭代的情况。作出左边一半后, 直接再用C+给另外一半赋予与左侧相对称的值即可。程序启动试验设计的方框图如下图所示: 赋边界的电位值赋场内各点的电位值累计迭代次数M=0迭代次数加1按照公式进行迭代检验是否达到精度 Y把另外一半镜像出来, 直接赋值打印出结果结束实验源程序如下: #include#include#include#includevoid main()double a4020; /定义数组a, 用于存放初始迭代值double
7、 b4020; /定义数组b, 用于和数组a进行比较, 以确定是否达到实验进度double c4040;int i=0,j=0; bool M;static int N=0; /定义静态变量, 记录迭代的次数 ifstream infile(test.txt,ios:noreplace);ofstream outfile;outfile.open(test.txt);for(i=1;i40;i+) /为内节点赋初始迭代值for(j=1;j20;j+)aij=2.5*(j-1); for(i=1;i40;i+)/为左边界赋初始迭代值ai0=0;for(j=0;j20;j+) /为上下边界赋值 a
8、0j=100;a39j=0;cout初始迭代值为:endl;outfile初始迭代值为:endl;for(i=0;i40;i+)for(j=0;j20;j+)outfileaij ; /输出到文件 coutaij ; /输出数组coutendl;outfileendl; do /开始进行迭代for(i=0;i40;i+) /先将a数组前一次复制到b数组, 便于精度比较 for(j=0;j20;j+) bij=aij; for(i=1;i=38;i+)for(j=1;j=18;j+) /套用迭代公式, 去迭代因数为1.5aij=bij+(1.5/4)*(bi+1j+bij+1+ai-1j+aij
9、-1-4*bij);ai19=0.25*(ai-119+ai18+bi+119+ai18);for(i=1;i=38;i+) /比较是否达到精度要求for(j=1;j0.00001)M=true; break;elseM=false; N+; /完成一次迭代, 迭代次数+1while(M); for(i=0;i=39;i+) /将另外对称部分镜像出来for(j=0;j=19;j+)cij=aij; ci39-j=aij;coutendl;cout经过的迭代次数为: Nendl;outfile经过的迭代次数为: Nendl;coutendl; cout经过迭代后, 各节点电位的近似值为:endl
10、;outfile经过迭代后, 各节点电位的近似值为:endl;for(i=0;i=39;i+)for(j=0;j=39;j+)coutsetiosflags(ios:fixed)setprecision(5)cij ;outfilesetiosflags(ios:fixed)setprecision(5)cij ;coutn;coutn;outfileendl;infile.close();outfile.close();cout实验数据太多, 已存放源程序目录下, 名为”test.txt”; coutn;coutn;将输出数据全部导出到文件中, 再利用excel制作表格, 可得到比较好的数据分布图, 如左图。可看出数据越多, 图表越是精确, 基本上能够反映出电位分布情况。这和用软件模拟的效果很是相似。实验总结: 经过了这次试验, 让我对迭代法有了一个更深入的认识, 领略到了计算机带来的方便, 对于一些抽象的东西, 充分利用计算机, 让我们直观的看到了电位分布, 这是很便捷的, 相信在经过一段时间的学习之后, 能更有效地利用现代的手段进行辅助学习。迭代法的巧妙利用能解决许多问题, 它虽然要重复很多次, 但计算简便, 就相对于精度要求不高的定性分析, 是一种很有效的解决方法。