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 个参数,aw,如果你已经定义了一个变量 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变量,你会得到相同的结果