使用numpy计算点电荷电场梯度时绘图异常的问题排查
点电荷电场计算与绘图问题分析
你的代码存在两个核心问题,导致电场方向不符合正点电荷向外辐射的物理规律:
1. np.gradient的分量顺序搞反了
对于二维数组,np.gradient的返回顺序是行方向(对应y轴)的梯度在前、列方向(对应x轴)的梯度在后。也就是说:
e_field[0]是电势对y的偏导(dV/dy)e_field[1]是电势对x的偏导(dV/dx)
而电场的定义是电势的负梯度:E = -∇V = -(dV/dx, dV/dy),你需要交换两个分量的顺序,才能得到正确的x、y方向电场分量。
2. plt.quiver的位置参数错误
plt.quiver需要传入二维网格坐标X, Y来定位箭头,而不是一维的x, y。用一维数组会导致箭头位置与网格点不匹配,进一步加剧方向混乱。
修正后的代码
import numpy as np import matplotlib.pyplot as plt q = [10, 10, 1] # 点电荷的(x,y)坐标和电荷量 vmin, vmax = 0, 32 x = y = np.linspace(vmin, vmax, 100) X, Y = np.meshgrid(x, y) # 加入1e-6避免电荷位置处的数值无穷大 potential = q[2] / np.sqrt((X - q[0])**2 + (Y - q[1])**2 + 1e-6) # 拆分梯度分量:dV/dy, dV/dx dV_dy, dV_dx = np.gradient(potential) # 计算正确的电场分量 E_x = -dV_dx E_y = -dV_dy # 计算合适的缩放比例 s = max(np.max(E_x), np.max(E_y)) * 0.1 # 使用二维网格坐标定位箭头,传入正确的电场分量 plt.quiver(X, Y, E_x, E_y, units='xy', pivot='tail', width=0.03, scale=s) plt.xlabel('x') plt.ylabel('y') plt.xlim(vmin, vmax) plt.ylim(vmin, vmax) plt.show()
内容的提问来源于stack exchange,提问作者Mikołaj Grymuza
相关产品推荐
相关产品推荐

