Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将MATLAB quadgk积分转换为Scipy quad,并使用长函数进行积分(传递lambda函数的任何替代方法?)_Python_Matlab_Scipy_Numerical Integration - Fatal编程技术网

Python 将MATLAB quadgk积分转换为Scipy quad,并使用长函数进行积分(传递lambda函数的任何替代方法?)

Python 将MATLAB quadgk积分转换为Scipy quad,并使用长函数进行积分(传递lambda函数的任何替代方法?),python,matlab,scipy,numerical-integration,Python,Matlab,Scipy,Numerical Integration,好的,我有一个MATLAB代码,它将在积分过程中由quadgk生成的x值传递到integrand函数中: optionvalue(i) = exp(-r .* T2) .* quadgk(@(x) integrand(x,flag, F, K, vol, T2, T1), 0, Inf, 'AbsTol',tolerance); function value = integrand(x, flag, F,K,vol,T2,T1) d1 = (log(x ./ (x+K)) + 0.5 .* (

好的,我有一个MATLAB代码,它将在积分过程中由
quadgk
生成的x值传递到
integrand
函数中:

optionvalue(i) = exp(-r .* T2) .* quadgk(@(x) integrand(x,flag, F, K, vol, T2, T1), 0, Inf, 'AbsTol',tolerance);

function value = integrand(x, flag, F,K,vol,T2,T1)
d1 = (log(x ./ (x+K)) + 0.5 .* (vol.^2) .* (T2-T1)) ./ (vol .* sqrt(T2 - T1));
d2 = d1 - vol.*sqrt(T2 - T1);
mu = log(F) - 0.5 .*vol .^2 .* T1;
sigma = vol .* sqrt(T1);
value = lognpdf(x, mu, sigma) .* (flag .* x.*normcdf(flag .* d1) - flag .* (x+K).*normcdf(flag .* d2));
现在我转到SciPy尝试复制上面的内容,我在传递
x
的值时遇到了困难。SciPy显示函数
quad
必须采用lambda函数-我该如何将长
integrand
函数转换为该格式(或以其他方式使其工作)?就像我必须将它重写为
f(x)
类型,并删除传递到函数本身的
x
变量一样。以下是迄今为止我对Python的了解:

from scipy import integrate
from scipy.stats import norm, lognorm

# Define function and interval

def integrand(x, flag, F, K, vol, T2, T1):
    d1 = (np.log(x / (x+K)) + 0.5 * (vol**2) * (T2-T1)) / (vol * np.sqrt(T2 - T1))
    d2 = d1 - vol*np.sqrt(T2 - T1)
    mu = np.log(F) - 0.5 *vol **2 * T1
    sigma = vol * np.sqrt(T1)
    return lognorm.pdf(x, mu, sigma) * (flag * x*norm.cdf(flag * d1) - flag * (x+K)*norm.cdf(flag * d2))

 quad, quad_err = integrate.quad(integrand, 0, np.Inf, args=(x, flag, F, K, vol, T2, T1))
谢谢你的帮助

SciPy显示函数quad必须采用lambda函数——我该如何将长的被积函数转换为该格式(或以其他方式使其工作)

我希望我们不要把它们称为lambda函数——这让使用
lambda
语法的结果看起来有点特别,而实际上没有

quad
接受函数——不管您使用哪种语法构造它

>>> def f(x): return x**2
>>> quad(f, 0, 1)[0]
0.3333333333333333
>>> quad(lambda x: x**2, 0, 1)[0]
0.3333333333333333
>>> g = lambda x: x**2 # no point to naming this, but anyway
>>> quad(g, 0, 1)[0]
0.3333333333333333
或者,也许更像你的处境

>>> def h(x, a): return (x+a)**2
>>> quad(h, 0, 1, args=5)[0]
30.33333333333333
>>> quad(lambda x: (x+5)**2, 0, 1)[0]
30.33333333333333
SciPy显示函数quad必须采用lambda函数——我该如何将长的被积函数转换为该格式(或以其他方式使其工作)

我希望我们不要把它们称为lambda函数——这让使用
lambda
语法的结果看起来有点特别,而实际上没有

quad
接受函数——不管您使用哪种语法构造它

>>> def f(x): return x**2
>>> quad(f, 0, 1)[0]
0.3333333333333333
>>> quad(lambda x: x**2, 0, 1)[0]
0.3333333333333333
>>> g = lambda x: x**2 # no point to naming this, but anyway
>>> quad(g, 0, 1)[0]
0.3333333333333333
或者,也许更像你的处境

>>> def h(x, a): return (x+a)**2
>>> quad(h, 0, 1, args=5)[0]
30.33333333333333
>>> quad(lambda x: (x+5)**2, 0, 1)[0]
30.33333333333333

运行这个函数比我想象的要容易得多,只要在调用
quad
时省略Python中的
x
变量,它就会在其例程中自动传递它。即

args=(flag, F, K, vol, T2, T1))
它假定输入变量中的
x

def integrand(x, flag, F, K, vol, T2, T1):

语句,而无需通过
args=()

以比我想象的更简单的方式运行此函数,只需在调用
quad
时省略Python中的
x
变量,它就会在其例程中自动传递它。即

args=(flag, F, K, vol, T2, T1))
它假定输入变量中的
x

def integrand(x, flag, F, K, vol, T2, T1):

语句,而不通过
args=()

传递该参数,谢谢,我想我刚刚解决了这个问题-问题来自更长的函数。似乎在调用
quad
时,我所要做的就是从
args=
中省略
x
,一切正常……谢谢,我想我刚刚解决了这个问题——问题来自更长的函数。似乎我所要做的就是在调用
quad
时从
args=
中省略
x
,一切都正常了……尽管使用Python
lognorm.pdf(x,scale=np.exp(mu),s=sigma)来等效于MATLAB的
lognpdf(x,mu,sigma)
如果您希望在两种语言之间复制/粘贴我的代码,因为我已经将其绑定为100%准确。尽管使用Python
lognorm.pdf(x,scale=np.exp(mu),s=sigma)
相当于MATLAB的
lognpdf(x,mu,sigma)
如果您希望在两种语言之间复制/粘贴我的代码,因为我已将其绑定为100%准确。