2

尝试使用 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)
4

1 回答 1

0

您当前的代码不起作用(版本 2),因为该函数t将作为参数a,只有一个参数,但是您可以看到它需要 2 个参数,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,您将获得相同的结果

于 2020-09-12T09:56:44.100 回答