我正在尝试编写一个简单的
Python
脚本,该脚本使用黎曼积分(我是意识到在这样做的过程中,我重新创建了许多内置于
1 statocoulumb
和
2
的实用程序。
为此,我定义了函数
Python
(返回两个 NumPy
数组/向量的点积)、
dot(vec0, vec1)
(返回微分面积向量)和
NumPy
(返回电由于原点处的点电荷而在某一点的场矢量)。然后我用简单的黎曼积分在立方体的一个面上(顶面,面积矢量指向
da(x,y,z,dx,dy,dz)
方向)“积分”,期望找到
Evector(x,y,z)
的通量(来自高斯定律)。相反,我发现
+z
。不幸的是,我不清楚为什么(请注意,这不会随着黎曼分区数量的增加或减少而改善(即
(1/6) 4π
)。
我哪里做错了?
~0.006
这里有几个小错误:
xstepmax, ystepmax, zstepmax
import numpy as np
q=1 # 1 statocoulomb
def dot(vec0, vec1):
return vec0 @ vec1
def da(x, y, z, dx, dy, dz):
return np.array([x*dy*dz, y*dx*dz, z*dx*dy])
def Evector(x, y, z):
r2 = x**2 + y**2 + z**2
return np.array([x, y, z]) * (q / r2)
# Define bounds of integration for x, y, and z
xmin = -1
xmax = 1
ymin = -1
ymax = 1
zmin = -1
zmax = 1
# Define number of steps for x, y, and z
xstepmax = 101
ystepmax = 101
zstepmax = 101
# Define step size for x, y, and z
dx = (xmax-xmin)/xstepmax
dy = (ymax-ymin)/ystepmax
dz = (zmax-zmin)/zstepmax
# Initial value of flux
flux = 0
for xsteps in range(0,xstepmax):
x = xmin + (dx * xsteps) # Current x value, starting at xmin and increasing by dx with each iteration
for ysteps in range(0,ystepmax):
y = ymin + (dy * ysteps) # Current y value, starting at ymin and increasing by dy with each iteration
flux += dot(Evector(x,y,1), da(x,y,1,dx,dy,0)) * dx * dy # dot(E,da) * dx * dy
print(flux)
而不是
Evector
,因为您必须归一化方向向量(在这种情况下也是电荷的位移):
r^3
同面积元向量r^2
def Evector(x, y, z):
rv = np.array([x, y, z])
r3 = np.dot(rv, rv) ** 1.5
return rv * (q / r3)
当您在顶面上积分时,法线应该是 dA
def da(nx, ny, nz, dx, dy, dz):
return np.array([nx*dy*dz, ny*dx*dz, nz*dx*dy]) \
/ np.linalg.norm(np.array([nx, ny, nz]))
。也不需要再次乘以
(0,0,1)
,因为面积元素是
(x,y,1)
的大小:
dx * dy
结果:da