Quad 函数在 python 中返回不同的值
Quad function returning different values in python
我在尝试使用 quad 集成功能时遇到问题。本质上,我有两个版本的代码,我在不同的地方定义了 t(a)。这两个代码对我来说看起来一样,但我得到的结果略有不同。
我猜这是由于使用四边形方法相关的错误,但我不太确定。非常感谢任何帮助!
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
,只有一个参数,但您可以看到它需要 2 个参数,a
和 w
,如果你已经定义了一个变量 w
(也许你在 jupyter notebook 中工作),它可能会起作用,这可能是你不同结果的原因
要使您的代码正常工作并使您的版本 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)
在这个例子中一个closure它被用来传递w
变量,你会得到相同的结果
我在尝试使用 quad 集成功能时遇到问题。本质上,我有两个版本的代码,我在不同的地方定义了 t(a)。这两个代码对我来说看起来一样,但我得到的结果略有不同。
我猜这是由于使用四边形方法相关的错误,但我不太确定。非常感谢任何帮助!
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
,只有一个参数,但您可以看到它需要 2 个参数,a
和 w
,如果你已经定义了一个变量 w
(也许你在 jupyter notebook 中工作),它可能会起作用,这可能是你不同结果的原因
要使您的代码正常工作并使您的版本 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)
在这个例子中一个closure它被用来传递w
变量,你会得到相同的结果