计算机模拟超松弛法计算电位.docx
《计算机模拟超松弛法计算电位.docx》由会员分享,可在线阅读,更多相关《计算机模拟超松弛法计算电位.docx(10页珍藏版)》请在冰豆网上搜索。
计算机模拟超松弛法计算电位
三级项目报告
课程名称:
电磁场与电磁波
课程设计题目:
计算机模拟超松弛法计算电位
指导教师:
系别:
专业:
通信工程
组长:
组员:
无
完成时间2009年11月11日
成绩:
评阅人:
目录
一项目意义与目标
二项目内容与要求
三项目报告正文
1.实验仪器与软件
2.实验原理
3.实验结果与分析
四.项目总结
1.个人总结
五.参考文献
一项目意义与目标
在计算电磁场中求边值问题的解析解的时候常使用的方法有分离变量法和镜像法,但在许多实际问题中往往由于边界条件过于复杂而无法求得解析解。
在这些情况之下,一般可以借助于数值法求电磁场的数值解。
有限差分法是一种数值解法.这种方法是将场域进行网格划分,并用有限差分方程近似地替代偏微分方程,然后求解差分方程,得到电位函数的数值解。
本项目通过学习教材上使用超松弛法计算电位的方法并使用计算机进行模拟,已达到掌握使用超松弛法计算电位的方法。
二项目内容与要求
一个二维电场,电位函数为φ(x,y),边界条件图所示,将正方形场域分成20个正方形网格。
有16个内部网格点。
假定16个网格点的初始值都定为零,试用超松弛法确定16个内部网格点的电位值。
图1
三项目报告正文
1.实验仪器与软件
实验仪器:
无
实验软件:
TurboC++2.0
2.实验原理
在求电磁场的电位值问题时,使用有限差分法是一种比较容易的数值解法。
首先把求解的区域划分为网格,把求解区域内连续的场分布用求网络节点上的离散的数值代替。
只要把网格划分得足够细,就可以达到足够的精度。
本项目使用的网格划分方法为正方形网格划分,如图2所示.
图2
应用有限差分法计算静态场边值问题时,需要把微分方程用差分方程来代替。
设x轴上邻近0点的一点的点位为φx,用泰勒公式展开时为:
故1点电位为:
3点的点位为:
当h很小时,4阶以上的高次项可以忽略不计,得:
同样地,可得:
将上面两式相加,得:
在上式代入:
得:
,其中
上式是二维泊松方程的有限差分形式。
对于
,即
的区域,得到二维拉普拉斯方程的有限差分形式为:
上式表示任意点的点位等于围绕它四个点的点位的平均值。
当用网格将区域划分后,对每一网络电写出类似的式子,就得到方程数与未知电位的网络点数相等的线性方程组。
已知的边界条件在离散化后成为边界上节点的已知电位值。
按照上述原理,使用简单迭代法的计算方法如下:
先对每一网格点任意设一初值,然后按一个固定顺序依次计算每点的电位。
即利用
围绕它的四个点的电位的平均值作为它的新值,当所有的点计算完后,用它们的新值代替旧值,即完成了一次迭代。
然后再进行下一轮迭代,直到每一点计算的新值和旧值之差小于指定的范围为止。
在网格中(j,k)点在n+1次迭代时按下式计算:
简单迭代法在解决问题时的收敛速度比较慢,实际中常采用超松弛法。
则在网格中(j,k)点在n+1次迭代时按下式计算:
按照项目目标要求,需要求解的问题为:
一个二维电场,电位函数为φ(x,y),边界条件图所示,将正方形场域分成20个正方形网格。
有16个内部网格点。
假定16个网格点的初始值都定为零,试用超松弛法确定16个内部网格点的电位值。
如图所示,从左上角开始把各点依次编号为(0,0)至(5,5)
其中边界点(包括(0,0)至(0,5);(1,0)至(5,0);(5,1)至(5,5);(0,5)至(5,4))的电位已知,分别为100V,0V,5V,100V;其余各点的电位初值设为0;
即各点电位初值如下
{100,100,100,100,100,100},
{0,0,0,0,0,100},
{0,0,0,0,0,100},
{0,0,0,0,0,100},
{0,0,0,0,0,100},
{0,50,50,50,50,50}
使用超松弛法计算(1,1)至(4,4)的各点电位
则a(i,j)的电位为:
a[i][j]=(a[i-1][j]+a[i][j-1]+a[i+1][j]+a[i][j+1])/4
则[i][j]点从(1,1)按先从左到右迭代,从上到下换行的运行方法至(4,4)时为完成一次迭代。
在[i][j]点每次计算好该点的新值,准备运行到下一点时,比较一次新值与旧值的绝对值之差是否在所需的精度范围内,若是,则计数变量c自加1。
每完成一次迭代后,判断计数变量c是否大于等于16。
若是,则表示需要求解的16个点都在所需精度范围内;若否,则表示还有部分点没有达到所需精度,则c变量归零,从新开始新一轮迭代,直至需要求解的16个点都在所需精度范围内后,停止迭代,输出从(1,1)至(4,4)16个点的电位值。
使用TurboC++2.0软件模拟的源程序如下:
#include"stdio.h"
floatabs(floatx,floaty)
{
floatz;
if(x>=y)z=x-y;
if(xreturn(z);
}/*建立求绝对值的函数*/
voidmain()
{
inti,j,c=0;
floatt,s,d;
floata[6][6]={{100,100,100,100,100,100},
{0,0,0,0,0,100},
{0,0,0,0,0,100},
{0,0,0,0,0,100},
{0,0,0,0,0,100},
{0,50,50,50,50,50}};/*为网格内的每个点赋初始值*/
printf("Pleaseinsertaccuracy\n");/*要求用户输入计算精度*/
scanf("%f",&d);
printf("IntitalArray:
\n");
for(i=0;i<6;i++)
{
printf("\n");
for(j=0;j<6;j++)
{
printf("%.2f",a[i][j]);
}
printf("\n");
}/*输出赋予初值后网格内的各个点的值*/
printf("\n");
printf("FiguredArray:
\n");
do
{
c=0;
for(i=1;i<5;i++)
for(j=1;j<5;j++)
{
s=a[i][j];
t=a[i][j]=(a[i-1][j]+a[i][j-1]+a[i+1][j]+a[i][j+1])/4;
if(abs(s,t)<=d)c=c+1;
}
}while(c<=15);/*用超松弛法计算网格点的电位值,使其达到输入的精度*/
printf("%d",c);
for(i=0;i<6;i++)
{
printf("\n");
for(j=0;j<6;j++)
{
printf("%.2f",a[i][j]);
}
printf("\n");
}/*输出经计算后的网格内各点的电位值*/
printf("\n");
}
3.实验结果与分析
实验结果:
本次实验中精度取0.001,即在使用计算机进行模拟时输入0.001。
则实验结果如下:
输入精度:
输出结果:
则如输出结果所示,各点的电位值为:
{100,100,100,100,100,100},
{0,52.27,74.05,85.42,93.18,100},
{0,35.04,58.52,74.43,87.31,100},
{0,29.36,50.57,66.48,81.63,100},
{0,31.82,47.92,59.28,72.73,100},
{0,50,50,50,50,50}
以上各点对应点(0,0)至(5,5)
在本次实验中使用网格线把电磁场区域划分为25个网格。
虽然在使用计算机模拟的过程中使用的精度为0.001,但因为网点数较小,并不能很好地进行电磁场区域中等位点的分析。
四.项目总结
个人总结
本次项目中,需要运用的知识主要包括1、电磁场与电磁波中使用超松弛法计算电位值;2、C语言编程中二维数组的应用。
在制作本次实验的计算机模拟程序时,因为C语言中有某些语句的使用方法出现遗忘,所以在编程的过程中出现了好几次结果都与预想不符。
通过本次的项目制作,使我学到如何真正地把不同领域的知识结合起来,并做成成品。
我认为这一种动手能力和知识迁移能力对一个工学院的学生来说是非常重要的。
五.参考文献
[1]谢处方,饶克谨.电磁场与电磁波(第三版)[M].北京:
高等教育出版社,2008:
96-103.
[2]谭浩强.C程序设计(第三版)[M].北京:
清华大学出版社,2007:
135-138.