1

我正在用 4 个变量进行多重积分,其中 2 个具有限制作为函数。但是,错误出现在我的一个常量限制变量上。实在想不通我们为什么。非常感谢您的建议!

from numpy import sqrt, sin, cos, pi, arcsin, maximum
from sympy.functions.special.delta_functions import Heaviside
from scipy.integrate import nquad

def bmax(x):
    return 1.14*10**9/sin(x/2)**(9/7)

def thetal(x,y,z):
    return arcsin(3.7*10**15*sqrt(cos(x/2)**2/10**6-1.23*10**10/z+0.003*sin(x/2)**2*(2.51*10**63/sin(x/2)**9/y**7-1))/(z*sin(x/2)**2*cos(x/2)*(2.51*10**63/sin(x/2)**9/y**7-1)))

def rt(x,y):
    return 3.69*10**12/(2.5*10**63/sin(x/2)**7*y**7-sin(x/2)**2)

def rd(x,y):
    return maximum(1.23*10**10,rt(x,y))

def rl(x,y):
    return rd(x,y)*(sqrt(1+5.04*10**16/(rd(x,y)*cos(x/2)**2))-1)/2

def wbound():
    return [1.23*10**10,3.1*10**16]

def zbound():
    return [10**(-10),pi-10**(-10)]

def ybound(z):
    return [0,bmax(z)-10**(-10)]

def xbound(z,y,w):
    return [thetal(z,y,w),pi-thetal(z,y,w)]

def f(x,y,z,w):
    return [5.77/10**30*sin(z)*sin(z/2)*y*sin(x)*Heaviside(w-rl(z,y))*Heaviside(w-rd(z,y))/w**2]

result = nquad(f, [xbound, ybound,zbound,wbound])
4

2 回答 2

1

该错误的原因是尽管您不希望这些界限依赖于变量,nquad但仍将变量传递给您提供给它的函数。所以绑定函数必须采用正确数量的变量:

def wbound():
    return [1.23*10**10,3.1*10**16]

def zbound(w_foo):
    return [10**(-10),pi-10**(-10)]

def ybound(z, w_foo):
    return [0,bmax(z)-10**(-10)]

def xbound(z,y,w): 
    return [thetal(z,y,w),pi-thetal(z,y,w)]

现在函数zboundybound接受额外的变量,但只是忽略它们。

我不确定最后一个界限,xbound(...):你想要变量y并被z翻转吗?根据定义的所谓正确排序scipy.integrate.nquad将是

def xbound(y,z,w):
    ... 

编辑:正如 kazemakase 指出的那样,函数f应该返回 afloat而不是列表,因此[...]应该删除 return 语句中的括号。

于 2017-07-31T12:52:44.587 回答
0

nquad它的第二个参数需要一个序列bounds ,具有相当严格的语法。

如果被积函数f取决于x, y, z, w并且这是定义的顺序,则其中的项bounds必须依次为xb、和yb,其中每个边界可以是 2 元组,例如, 或返回 2 元组的函数.zbwbxb = (xmin, xmax)

关键点是,这些函数的参数......当我们执行内部积分时,在 中dx,我们有可用yzw用于计算 中的边界x,因此它必须是
def xb(y,z,w): return(..., ...)- 同样地 def yb(z,w): return (..., ...)
def zb(w): return (..., ...)
积分的最后一个变量的界限必须是常数。

总结

# DEFINITIONS

def f(x, y, z, w): return ..  . # x inner integration, ..., w outer integration
def xb(y,z,w): return (...,...) # or simply xb=(...,...) if it's a constant
def yb(z,w): return (...,...)   # or yb=(...,...)
def zb(w): return (...,...)     # or zb=(...,...)
wb = (...,...)

# INTEGRATION

result, _ = nquad(f, [xb, yb, zb, wb])
于 2017-07-31T13:59:22.540 回答