• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
acmer4302
博客园    首页    新随笔    联系   管理    订阅  订阅
math

有限差分法求解电磁场边值问题

项目说明

  1. 使用python语言实现了编程实现

  2. math.py文件为项目源码,下面为使用步骤

    1. 需要安装python 3和可以运行python文件的pycharm编译器或者其它python编译器
    2. 然后创建项目 将源码考进去就可以运行啦
    3. 输入看3的运行结果部分,有注释说明
  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
posted on 2021-03-13 22:40  wjs_ouc  阅读(97)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3