此脚本使用SciPy的dblquad计算来自均匀充电环的(x0,y0,z0)处的电场。
我的问题是关于gfun
和hfun
的使用,它定义了内积分限制对外积分变量的函数依赖性。如果我选择整合笛卡尔坐标,这将是一个千篇一律的形状,但当我使用圆柱坐标时,函数返回常量浮点数。
有没有办法消除这些只返回常量的函数调用,以避免函数调用的时间损失?
该示例可能未在其他方面进行优化,但这只是一个显示gfun
和hfun
使用情况的简单示例。
def Excalc(r, th):
x, y, z = r*np.cos(th), r*np.sin(th), 0.0
return (x0-x) * ((x0-x)**2 + (y0-y)**2 + (z0-z)**2)**-1.5
def Eycalc(r, th):
x, y, z = r*np.cos(th), r*np.sin(th), 0.0
return (y0-y) * ((x0-x)**2 + (y0-y)**2 + (z0-z)**2)**-1.5
def Ezcalc(r, th):
x, y, z = r*np.cos(th), r*np.sin(th), 0.0
return (z0-z) * ((x0-x)**2 + (y0-y)**2 + (z0-z)**2)**-1.5
def gfun(x):
return rmin
def hfun(x):
return rmax
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import dblquad
twopi = 2.*np.pi
# annulus of uniform, unit charge density
rmin, rmax = 0.8, 1.2
thmin, thmax = 0, twopi
# point to evaluate the field
x0, y0, z0 = 1.5, 0, 1
eps = 1E-10
Ex, Exerr = dblquad(Excalc, thmin, thmax, gfun, hfun, epsrel=eps)
Ey, Eyerr = dblquad(Eycalc, thmin, thmax, gfun, hfun, epsrel=eps)
Ez, Ezerr = dblquad(Ezcalc, thmin, thmax, gfun, hfun, epsrel=eps)
print Ex, Ey, Ez
print Exerr, Eyerr, Ezerr
答案 0 :(得分:2)
根据dblquad
的定义,gfun
和hfun
参数的类型为callable
,这意味着它们将由dblquad
调用功能呼叫方式。
但是,您可以使用Python lambda
而不是普通函数来使代码变得有点整洁。例如:
Ex, Exerr = dblquad(Excalc, thmin, thmax, lambda: 0.8, lambda: 1.2, epsrel=eps)