有限差分法求解电磁场边值问题
项目说明
-
使用python语言实现了编程实现
-
math.py文件为项目源码,下面为使用步骤
- 需要安装python 3和可以运行python文件的pycharm编译器或者其它python编译器
- 然后创建项目 将源码考进去就可以运行啦
- 输入看3的运行结果部分,有注释说明
-
编程时使用了简单迭代法
先对场域中每一节点都赋予迭代初值,注意边值的值要确定好,场域内节点的初始值可以任意估计,估计较好的话可以减少迭代的次数!然后定一个固定的顺序依次计算节点的值。具体公式如下:
![img]()
每一个节点都等于它上下左右节点之和的
,如上式不断地重复迭代,直到某一次迭代过程中,在所有节点与自己上一次迭代值的差中,找出最大值,当最大值不超过某一数时,迭代可以结束,即
![img]()
下面是结合一个例题使用简单迭代法实现python编程:
import datetime import functools import numpy as np import math def add(list_one):#根据坐标实现电位值的输出 while(1): m = int(input("请输入坐标行号: ")) n = int(input("请输入坐标列号: ")) if(m==-1 and n==-1):#当同时输入-1 -1的时候退出此模块 break print(list_one[m][n]); def main():#入口函数也是主函数 p_max=0 max=0 m=int(input("请输入电位阵行数: ")) n = int(input("请输入电位阵列数: ")) # list_two = [[0] * m] * n # list_one=[[0]*(m-2)]*(n-2) list_one = np.zeros((m-2, n-2), dtype=float) # print(list_two) # num=int(input("请输入初始估计电位值数")) # for i in range(0,num): # x=int(input("请输入经度位置: ")) # y=int(input("请输入维度位置: ")) # val=int(input("请输入初始估计电位值: ")) # list_two[x][y]=val print("请依次输入初始估计电位值: ") list_two=[] for i in range(m): l2=[] for j in range(n): val = float(input()) l2.append(val) list_two.append(l2) # print(list_two[i][j]) print(list_two) n_generation = 0 while 1:#以下为核心算法部分 for i in range(0,m-2): for j in range(0,n-2): list_one[i][j] = 0.25 * (list_two[i+2][j+1] + list_two[i+1][j+2] + list_two[i][j+1] + list_two[i+1][j])#节点迭代方程 p_max = max; if(list_one[i][j] - list_two[i+1][j+1]<0): max=list_two[i+1][j+1]-list_one[i][j] if (max < p_max): max = p_max# 找出误差最大值 # print(list_one) n_generation+=1 if (max < 1e-4): # 检查迭代是否满足结束条件 break for i in range(1,m-1): for j in range(1,n-1): list_two[i][j] = list_one[i-1][j-1]#节点值更新 # print(list_one) max = 0; # 每次迭代的最大误差需要初始化 print(list_one) print("the final number of generation is "+str(n_generation)) add(list_one) if __name__=="__main__": main()
下面附运行结果以及一些注释:
请输入电位阵行数: 5
请输入电位阵列数: 5
请依次输入初始估计电位值:
#需要输入25个位置的初始化估计电位值 当然 这个比较规则
0
0
0
0
0
0
25
25
25
0
0
50
50
50
0
0
75
75
75
0
0
100
100
100
0
#最初的5*5的初始估计电位值
[[0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 25.0, 25.0, 25.0, 0.0], [0.0, 50.0, 50.0, 50.0, 0.0], [0.0, 75.0, 75.0, 75.0, 0.0], [0.0, 100.0, 100.0, 100.0, 0.0]]
[[ 7.14400155 9.82295445 7.14400155]
[18.75152588 25.00228882 18.75152588]
[42.85828727 52.68009731 42.85828727]]
#迭代次数
the final number of generation is 28
#同时输入-1 -1 结束输入坐标获取电位值
请输入坐标行号: 2
请输入坐标列号: 2
42.85828726632417
请输入坐标行号: -1
请输入坐标列号: -1


浙公网安备 33010602011771号