将matlabquadgk积分转换为Scipy四元组,其中包含要积分的长函数(传递lambda函数的任何替代方法?)

2024-09-30 05:15:03 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,我有一个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的了解如下:

^{pr2}$

感谢你的帮助!在


Tags: 函数logvaluesqrtsigmaflagd2d1
2条回答

SciPy shows that the function quad has to take a lambda function - how the heck can I put that long integrand function into that format (or some other way to make it work)?

我希望我们不要把它们称为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

或者,也许更像你的情况

^{pr2}$

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

args=(flag, F, K, vol, T2, T1))

它假定x输入变量位于:

^{pr2}$

语句中没有通过args=()传递该参数

相关问题 更多 >

    热门问题