这些频繁调用函数是否可以在dblquad中返回固定值?

时间:2018-03-23 01:49:55

标签: python python-2.7 scipy

此脚本使用SciPy的dblquad计算来自均匀充电环的(x0,y0,z0)处的电场。

我的问题是关于gfunhfun的使用,它定义了内积分限制对外积分变量的函数依赖性。如果我选择整合笛卡尔坐标,这将是一个千篇一律的形状,但当我使用圆柱坐标时,函数返回常量浮点数。

有没有办法消除这些只返回常量的函数调用,以避免函数调用的时间损失?

该示例可能未在其他方面进行优化,但这只是一个显示gfunhfun使用情况的简单示例。

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

1 个答案:

答案 0 :(得分:2)

根据dblquad的定义,gfunhfun参数的类型为callable,这意味着它们将由dblquad调用功能呼叫方式。

但是,您可以使用Python lambda而不是普通函数来使代码变得有点整洁。例如:

Ex, Exerr = dblquad(Excalc, thmin, thmax, lambda: 0.8, lambda: 1.2, epsrel=eps)