第五章场问题,选做了课后5.1题
由场中已知的边界位置电势来确定其它各处的电势,之后进一步求电场强度。
解题分析
观察下图,已知小正方形区域为一等势体区域,且电势为1;大正方形外框亦为一等势边界,电势为0。则由系统整体的对称性,设置各选定位置处的电势初始参考值
如下图,将小正方形和大正方形之间的距离等分为三份(分界线由虚线标出),并将电势差等分,设置各虚线处的具体参考值(已标识于虚线处):
一,9×9矩阵
设置一个9×9的矩阵,记录下初始值,之后进行迭代更新。迭代时应注意到小正方形区域和大正方形边框处的电势不应变化。
上图即为场区域一些格点处的初始电势设定值。
Mathematica代码:
While[Abs[u1 - (u[[2, 1]] + u[[2, 3]] + u[[1, 2]] + u[[3, 2]])/4] >= 10^-4,
For[i = 2, i <= 8, i++,
For[j = 2, j <= 8, j++,
If[i >= 4 && i <= 6 && j >= 4 && j <= 6, Null, u[[i, j]] = (u[[i, j - 1]] + u[[i, j + 1]] + u[[i - 1, j]] + u[[i + 1, j]])/4]]]; u1 = u[[2, 2]]];
MatrixForm[u]
设定的迭代终止条件为矩阵元素(2,2)在迭代前后值之差小于10^-4,得到迭代结果矩阵为(截图效果AV画质。。。):
按矩阵元素值的大小对应颜色深浅,画出颜色表示图(外周一圈纯白表示着0):
二,17×17矩阵
由上图可直观的看出迭代达到稳定时势场的大致分布,但像素点还有待增多,增多后效果会很好。我试着写任意步长细分区域的程序,而且把初始矩阵的设定也有编程解决了,于是这个问题在任意细分下的情况也可以解决,首先,设置初始矩阵为17×17,矩阵初始值自动设定程序为:
Mathematica代码:
step = .166667;
For[i = 1, i <= 17, i++,
For[j = 1, j <= 17, j++,
If[(i == 2 || i == 16) && (j >= 2 && j <= 16) || (j == 2 || j == 16) && (i >= 2 && i <= 16), u[[i, j]] = step*1];
If[(i == 3 || i == 15) && (j >= 3 && j <= 15) || (j == 3 || j == 15) && (i >= 3 && i <= 15), u[[i, j]] = step*2];
If[(i == 4 || i == 14) && (j >= 4 && j <= 14) || (j == 4 || j == 14) && (i >= 4 && i <= 14), u[[i, j]] = step*3];
If[(i == 5 || i == 13) && (j >= 5 && j <= 13) || (j == 5 || j == 13) && (i >= 5 && i <= 13), u[[i, j]] = step*4];
If[(i == 6 || i == 12) && (j >= 6 && j <= 12) || (j == 6 || j == 12) && (i >= 6 && i <= 12), u[[i, j]] = step*5];
If[(i == 7 || i == 11) && (j >= 7 && j <= 11) || (j == 7 || j == 11) && (i >= 7 && i <= 11), u[[i, j]] = 1];
If[(i == 8 || i == 10) && (j >= 8 && j <= 10) || (j == 8 || j == 10) && (i >= 8 && i <= 10), u[[i, j]] = 1];
If[i == 9 && j == 9, u[[i, j]] = 1]]]
因为区域被分成了更多小区域,所以判断稳定的条件由之前的10^-4改变为10^-5,得稳定的17×17矩阵为(请忽略画质。。。可点击原图查看,会清晰一些):
彩图为:
中心小正方形为1势能区域,最外面一圈为0势能,颜色由红向蓝过度,势能值由1向0减小,此图已经比较细腻了,显示效果也比较好。颜色相同的条带可近似看作是等势线。
三,33×33矩阵
为了更好的显示效果,做了个33×33矩阵,运行结果矩阵很大,迭代运算的截止精度也向小数点后又推进了一位,达到了10^-6,最终结果矩阵大到无法完全截屏(下图只截取了一部分):
但彩图的效果很好:
从上图已经可以看出很好的显示效果了,直观又上眼。其“等势线”也更加精细,场的分布已经比较了然,是一个很好的效果。
我在编程过程中发现在理解了教材的算法和原理后,用Mathematica处理这个问题很容易,于是顺便把下题也解决了,与上题不同,此题的初始电势值设置要从头再来,且+1与-1之间也不是上题中的小正方形区域:
在上题的代码基础上,修改一下限制条件,有:
Mathematica代码:
While[Abs[u1 - (u[[2, 1]] + u[[2, 3]] + u[[1, 2]] + u[[3, 2]])/4] >= 10^-4, For[i = 2, i <= 8, i++, For[j = 2, j <= 8, j++, If[i >= 4 && i <= 6 && (j == 4 || j == 6), Null, u[[i, j]] = (u[[i, j - 1]] + u[[i, j + 1]] + u[[i - 1, j]] + u[[i + 1, j]])/4]]]; u1 = u[[2, 2]]]
MatrixForm[u]
运行结果矩阵为:
由该矩阵我们能发现势场分布与之前一题在左部分矩阵元上的区别,此题左半部分势场虽然有与上一题相似的地方(位于势值1和势值0之间),但是由于势值1区域由小正方形平板缩小为一个线分布,且右半部分增加了势值为-1的线分布,对势值有了明显影响。
转换为颜色图,效果更直观(蓝色越深,值越小,白色为0势值,颜色越偏向黄则势值越大):
因为这个题目初始矩阵的设置比较麻烦,故只做了9×9的矩阵,但原理是类似的。
结论
由课本的拉普拉斯等式出发,做分析得出数值解法,取得了一定效果,稳定矩阵的存在表明了方法的可靠性,矩阵转换为彩图显示令结果更加明显而直观,将区域细分为更多取样点,初始矩阵越大时,最终结果越精细,越了然直观。不得不说,课本的分析介绍的这种数值方法很好很有用,取样点密度高了之后会有更好的结果。
说明
这次我没用Python,改用的Mathematica。我现在对那玩意有点阴影,有时候出问题找不到源头。。。但既然是计算物理而不是计算Python,用什么工具就不重要了,结果出来了就行。