南京理工大学工程电磁场实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最简程序设计流程图如下:
输出开始菜单 (边值都已经给定)
输入迭代因子 e
迭代次数 num=0
num++
3
开始循环迭代
否
函数判断相邻 二次差值是否 小于给定值
是
输出电位 a[i][j],计算次 数 num
终止
三、程序编写及其运行结果:
#include<stdio.h> #include<math.h> #include<windows.h> fun(float u[][5],float p) /*此函数即为差分求解的方法过程*/ {long int i,j,flag=1,num=0;float t,e=p/4; while(flag) {flag=0; for(i=1;i<4;i++) for(j=1;j<4;j++) { t=u[i][j]; u[i][j]=u[i][j]+e*(u[i][j-1]+u[i-1][j]+u[i][j+1]+u[i+1][j]-4*u[i][j]); if(fabs(u[i][j]-t)>=1e-5) flag=1; /*该判断语句用于判断 u[i][j]前后两次计算之差绝对值是否符合实验误差要求*/ } num++; } return num; } int main(void)
p/ 值 1.1 1.2 11 1.3 14 1.4 18 1.5 24 1.6 32 1.7 45 1.8 71 1.9 154 迭代次数 17
四、电位分布描绘
ax=20;ay=20;hx=4;hy=4;Hx=hx/ax;Hy=hy/ay;x0=4;y0=4; /设定变量参数/ for i=1:(20) xu(i)=x0-(i-1)*Hx;end; for i=1:(20) yu(i)=y0-(i-1)*Hy;end; [X,Y]=meshgrid(xu,yu);figure(1) /设定网格,建立坐标系/ contour(X,Y,u,10); /调用画等位线函数/
4
(k ) (k ) (k ) (k ) 2 (k ) [i-1, j i, j 1 i+1, j i, j 1 Fh 4i, j ]
(k ) ( k 1) 其中 i, 为求解新状态; i, j 为求解原状态; 为收敛因子; h 为 j
小网格高度; F = , 而由于金属电解槽中不存在静电荷, 所以 F =0 。 在做实验时,考虑到题目要求,我小组首先应用了自己比较熟悉
2
的编程软件 VC++6.0 编出程序计算出每个点的点电位和收敛因子 的 不同取值对计算次数的影响。实验中有一个要求较高的注意选项,即 在比较前后两次之差时要求的是每个点都需要比较, 而并非一个点满 足即可。因此在一下程序设计流程图的基础上,稍微对个别程序进行 修改,在程序中加入 flag 变量,并设定为 1,在进行迭代中每一次对 u[i][j]计算后进行差运算判断其绝对值, 如果有一个不满足, 则 flag 重设为 1,再次进行迭代。 在描绘电位分布实验中,我小组采用 MATlAB 软件中可视化 contour 函数画出电解槽中的电位分布。由于试验中行、列各有五个 点,相乘即为 25 点,电位点数明显较少,所以在第一次画图中画出 来的图像比较简单,可以明显看出折线角,因此我小组在程序中重新 设定参数,把行、列各设为 20,相乘以后总共为 400 个电位点,最终 画出的图像线条比较光滑。
MATlAB 绘制等电位线视图如下:
三维图像:
100 80 60 40 20 0 4 3 2 1 1 3 2 4
8wk.baidu.com
二维图像:
4
3.5 3
2.5
2
1.5
1
0.5 0.5 1 1.5 2 2.5 3 3.5 4
五、实验总结:
通过本次实验,我们在很大程度上把书本上的知识应用于实践中去, 例如 VC++的应用, 是我们第一次把其应用到工程实验上去, 超越了以 往只限于基础原理的学习。另一方面,在画图方面对于 MATlAB 的应 用,让我们初步认识到这款软件功能的强大,也让我们意识到掌握这 门软件的重要性,其在可视化,仿真方面发挥了很大的作用,大大地 帮助我们更深刻地理解和把握工程电磁场这门课程的相关知识。
0 0
0
100 V
二、实验原理:有限差分法
顾名思义, 有限差分法是将场域离散为许多网络, 应用差分原理, 将求解连续函数 微分方程转化为求解网格节点上 的代数方程组 的问题。本实验应用差分方程组求解方法中的超松弛迭代法,基本公 式如下:
( k 1) (k ) i, i, j j
4
{ long int i,j,num=0;float p,t,eps=1,e=p/4, u[5][5]={100,100,100,100,100}; printf("The original number is\n"); for(i=0;i<5;i++) {printf("\n"); for(j=0;j<5;j++) { printf("%-11.5f",u[i][j]); } } num=fun(u,1.1); printf("\nThe present number is:"); for(i=0;i<5;i++) {printf("\n"); for(j=0;j<5;j++) printf("%-11.5f",u[i][j]); }printf("\nThe whole solving times is: num=%d\n",num); printf("\n\nNow we are discussing the effect of p:\n"); /*讨论收敛因子不同取值的计算次数情况*/ for(p=1.1;p<2.0;p+=0.1) {printf("If the p value is %f",p); float u[5][5]={100,100,100,100,100}; num=fun(u,p); printf("\n\nThe present number is:"); for(i=0;i<5;i++) {printf("\n"); for(j=0;j<5;j++) printf("%-11.5f",u[i][j]); }printf("\nThe whole solving times is: num=%d\n",num); } system("pause"); return 0; }
三、程序设计及其运行情况:
#include<stdio.h> #include<math.h> #include<windows.h> fun(float u[][41],float p) /*此函数即为差分求解的方 法过程*/ {long int i,j,flag=1,num=0;float t,e=p/4; /*定义变量,在此 p 为收敛 因子*/ while(flag) {flag=0; for(i=1;i<40;i++) {for(j=1;j<20;j++) { t=u[i][j]; u[i][j]=u[i][j]+e*(u[i][j-1]+u[i-1][j]+u[i][j+1]+u[i+1][j]4*u[i][j]); if(fabs(u[i][j]-t)>=1e-5) flag=1; /*该判断语句用于判断 u[i][j]前后两次计算之差绝对值是否符合实验误 差要求*/ }u[i][20]=u[i][19]; }num++; } return num; } int main(void) { long int i,j,num=0,min=100000;float q,p,t,eps=1,e=p/4,u[41][41]; for(i=0;i<41;i++) {u[0][i]=100;u[40][i]=0;} /*定义初值*/ for(i=1;i<40;i++) {u[i][0]=u[i][40]=0;} for(i=1;i<40;i++) for(j=1;j<21;j++) u[i][j]=2.5*(j-1); printf("左半边初始值如下:\n"); for(i=0;i<41;i++) {printf("\n"); for(j=0;j<21;j++) { printf("%-11.5f",u[i][j]);
二、实验原理分析:
本实验与上一个实验类似,外加电压相同,并同样采用差分格式求解 法求解,原理以上已述,无需重复。然而仔细分析此实验,我们发现 有三点不同: (1) 本实验中所取网格点较多, 因此计算出来的电位矩阵比较庞大; (2) 为了克服网格点过多这一缺点,本实验采取对称求解,即只求 出单边电位,另一边电位与之对称即可; (3) 另一不同之处在边界条件不同,刚接触此题时,我小组产生疑 问,不知如何确定中间那一条分界线的确定值,最后经过深度 讨论方知此实验图示隐藏着另一重要条件,即中间有字样
程序运行界面如下:
5
6
结果分析:改变 p 的值,即改变 的取值,输出次数发现变化,有
输出结果明显看出,当 p 越接近 1,输出次数越多,当 p 变大使得其
7
越接近 2,运行次数也急剧增加。如果从 1 到 2 取值间隔为 0.1,则 当 p 取得 0.2 的时候迭代次数最少, 迭代次数最少意味着该取值最合 适。
0 。此条件异常重要,它告诉我们同一行的第 21 列与第 20 x
列的电位是相等的, 这就使得在每一次迭代时第 20 列的值计算 完后必须赋给相应的第 21 列,由此实现正常迭代。
10
进行精度计算时,此实验与上一实验相同,需要比较每一个电位点前 后两次值的差的绝对值,在进行判断。当每一个点电位相邻两次电位 值差取绝对值后其小于所给误差范围方可结束循环,否则继续迭代。
9
实验二 按对称场差分格式求解电位的分布
一、实验内容:按对称查分格式求解电位的分布
已知:a 4cm, h 40 1mm 40 给定边值:如图示; 给定初值:i , j 误差范围: =10
2 1
p
-5
( j 1)
100 ( j 1) 40
计算:迭代次数 1) N ?, i , j 分布; 2)按电位差 =10画出槽中等位线。
工程电磁场实验报告
陈桂 韩晨 曹佳彬 汪光远 孙淑彬
1
实验一 用超松弛迭代法求解接地金属槽内 电位分布
一、实验内容: 试用超松弛迭代法求解接地金属槽内电位的分布。
已知: a 4cm , h a / 4 10mm 给定边值:如图所示。 给定初值: i(,0j) 0 误差范围: 10 5 计算迭代次数N=?, i , j 分布。
11
} } /*讨论收敛因子不同取值的计算次数情况*/ for(p=1.10;p<2.0;p+=0.01) { for(i=0;i<41;i++) {u[0][i]=100;u[40][i]=0;} /*定义初值*/ for(i=1;i<40;i++) {u[i][0]=u[i][40]=0;} for(i=1;i<40;i++) for(j=1;j<21;j++) u[i][j]=2.5*(j-1); num=fun(u,p);if(min>num) {min=num;q=p;} }printf("\n 最佳收敛因子为:p=%f",q); printf("\n 此时运行次数为: num=%d\n",min); printf("\n 当收敛因子为%f 的时候,输出结果为:", q); for(i=0;i<41;i++) {u[0][i]=100;u[40][i]=0;} /*定义初值*/ for(i=1;i<40;i++) {u[i][0]=u[i][40]=0;} for(i=1;i<40;i++) for(j=1;j<21;j++) u[i][j]=2.5*(j-1); num=fun(u,q); for(i=1;i<40;i++) for(j=1;j<21;j++) u[i][40-j]=u[i][j]; for(i=0;i<41;i++) {printf("\n"); for(j=0;j<41;j++) printf("%12.6f",u[i][j]);} system("pause"); return 0; }