加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

用python进行电位数值微分

发布时间:2020-12-20 13:49:43 所属栏目:Python 来源:网络整理
导读:我用下面的代码来获得四极电位的电场. for n in range (nx-1): for m in range (ny-1): for k in range (nz-1): Ex[n,m,k] =-( (T[n+1,k]-T[n,k]) )/((x[n+1]-x[n])); Ey[n,k] =-( (T[n,m+1,k]) )/((y[m+1]-y[m])); Ez[n,k+1]-T[n,k]) )/((z[k+1]-z[k])); re
我用下面的代码来获得四极电位的电场.

for n in range (nx-1):
  for m in range (ny-1):
   for k in range (nz-1):
     Ex[n,m,k] =-( (T[n+1,k]-T[n,k]) )/((x[n+1]-x[n]));
     Ey[n,k] =-( (T[n,m+1,k]) )/((y[m+1]-y[m]));
     Ez[n,k+1]-T[n,k]) )/((z[k+1]-z[k]));
     return Ex,Ey,Ez,T

这里T是通过数值求解拉普拉斯方程得到的3D电位,从图中可以看出红色电极(正)有错误的电场矢量方向(顶部电极的右上侧和右下侧)同样的错误也在其他电极中.即,负电极具有必须是相反方向的输出电场矢量.

我也使用中央差异法,但我得到相同的数字.你能告诉我我的差异化有什么问题吗?

解决方法

你的问题在于matplotlib解释方向的方式,方向本身源于矩阵常规索引的方式,这与许多人(比如我自己)的想法相反.具体来说,第一个索引是垂直索引,而第二个索引是水平索引.如果您使用了非正方形数组,这可能已经很明显,这会显示您的x和y是向后的.以下示例说明了渐变(仅略微修改)如何给出正确的结果.第一个图显示了您实际绘制的内容,其中交换了渐变的x和y分量.图(你可以通过运行它获得)表明梯度不是与轮廓线正交(因为它必须是),有时会走错方向.

第二个和第三个数字都显示了使用漂亮方法绘制渐变的正确方法,其中我们有坐标的2D数组以及我们绘制的东西(无论是箭头还是轮廓).我按照你的代码使用meshgrid来生成我的X和Y,但需要将参数交换到meshgrid以获得正确的维度.更简洁的方法是使用相同的编码样式来生成坐标,就像绘制的东西一样,在这种情况下,具有显式索引的while循环将是最佳的.

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-3,3,0.2)
y = np.arange(-5,5,0.2)
z = np.arange(-5,0.2)

def grad(f):
    gx = np.zeros_like(f)
    gy = np.zeros_like(f)
    gz = np.zeros_like(f)
    for n in range(1,len(x)-1):
        for m in range(1,len(y)-1):
            for k in range(1,len(z)-1):
                gx[n,k] = (T[n+1,k]-T[n-1,k])/(x[n+1]-x[n-1]);
                gy[n,k] = (T[n,m-1,k])/(y[m+1]-y[m-1]);
                gz[n,k-1])/(z[k+1]-z[k-1]);
    return gx,gy,gz

T = np.zeros((len(x),len(y),len(z)))
for n in range(len(x)):
    for m in range(len(y)):
        for k in range(len(z)):
            T[n,k] = np.sin((x[n] - y[m])/3.0) + 0.3*np.cos(y[m]) + z[k]**2

gx,gz = grad(T)

Y,X= np.meshgrid(y,x)

plt.figure('WRONG with x and y')
plt.contour(y,x,T[:,:,round(len(z)/2)],64)
plt.colorbar()
plt.quiver(y,10*gx[:,10*gy[:,round(len(z)/2)])
plt.xlabel("x")
plt.ylabel("y")
plt.axes().set_aspect('equal')


plt.figure('with X and Y')
plt.contour(X,Y,64)
plt.colorbar()
plt.quiver(X,round(len(z)/2)])
plt.xlabel("X")
plt.ylabel("Y")
plt.axes().set_aspect('equal')

plt.figure('with Y and X')
plt.contour(Y,X,64)
plt.colorbar()
plt.quiver(Y,round(len(z)/2)])
plt.xlabel("Y")
plt.ylabel("X")
plt.axes().set_aspect('equal')

plt.show()

最后,我再次指出,揭示此错误的最简洁方法是使用nx!= ny运行程序.代码将失败并显示一条错误消息,表明数组维度不匹配,这会导致您以正确的方式交换(希望)周围的事情.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读