用python进行电位数值微分

时间:2015-05-13 13:21:40

标签: python gradient

我使用以下代码来获得四极电位的电场。

y = ["wham bam"]
>>> y
["wham bam"]

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

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

1 个答案:

答案 0 :(得分:1)

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

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

meshgrid

最后,我再次指出,揭示此错误的最简洁方法是使用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,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,m,k] = (T[n+1,m,k]-T[n-1,m,k])/(x[n+1]-x[n-1]); gy[n,m,k] = (T[n,m+1,k]-T[n,m-1,k])/(y[m+1]-y[m-1]); gz[n,m,k] = (T[n,m,k+1]-T[n,m,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,m,k] = np.sin((x[n] - y[m])/3.0) + 0.3*np.cos(y[m]) + z[k]**2 gx,gy,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, x, 10*gx[:,:,round(len(z)/2)], 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, T[:,:,round(len(z)/2)], 64) plt.colorbar() plt.quiver(X, Y, 10*gx[:,:,round(len(z)/2)], 10*gy[:,:,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, T[:,:,round(len(z)/2)], 64) plt.colorbar() plt.quiver(Y, X, 10*gy[:,:,round(len(z)/2)], 10*gx[:,:,round(len(z)/2)]) plt.xlabel("Y") plt.ylabel("X") plt.axes().set_aspect('equal') plt.show() 运行您的程序。代码可能会失败,并显示一条错误消息,指出数组尺寸不匹配,这会导致您以正确的方式交换(希望)周围的东西。