我在尝试使用quad集成函数时遇到了一个问题。本质上,我有两个版本的代码,在不同的地方定义t(a(。这两个代码在我看来是一样的,但我得到的结果略有不同。
我猜测这是由于使用quad方法时出现的错误,但不太确定。非常感谢您的帮助!
import numpy as np
from scipy.integrate import quad
s = 0.05
# Version 1
def POi1(w):
def t(a):
return (1/(0.27*a**(-1)+(1-0.27)*a**(-3*w-1))**(1/2))
return (np.exp(-((1+w)**2)/(2*s**2))*(1/(quad(t, 0, 1)[0]+((2/3)*(1/(np.abs(1+w)*1*(1-0.27)**2))))))
PO1 = quad(POi1, -np.inf, -1)[0]
print(PO1)
#Version 2
def t(a):
return (1/(0.27*a**(-1)+(1-0.27)*a**(-3*w-1))**(1/2))
def POi1(w):
return (np.exp(-((1+w)**2)/(2*s**2))*(1/(quad(t, 0, 1)[0]+((2/3)*(1/(np.abs(1+w)*1*(1-0.27)**2))))))
PO1 = quad(POi1, -np.inf, -1)[0]
print(PO1)
您当前的代码不起作用(版本2(,因为函数t
将作为参数a
,只有一个参数,但您可以看到它需要两个参数,a
和w
,如果您已经定义了变量w
(可能您在jupyter笔记本中工作(,它可能会起作用,这可能是导致结果不同的原因
要使您的代码工作,并在版本2中获得相同的结果,您可以使用:
def get_t(w):
def t(a):
return (1/(0.27*a**(-1)+(1-0.27)*a**(-3*w-1))**(1/2))
return t
def POi1(w):
t = get_t(w)
return (np.exp(-((1+w)**2)/(2*s**2))*(1/(quad(t, 0, 1)[0]+((2/3)*(1/(np.abs(1+w)*1*(1-0.27)**2))))))
PO1 = quad(POi1, -np.inf, -1)[0]
print(PO1)
在这个例子中,一个闭包用于传递w
变量,您将得到相同的结果