matlab 递归二叉树代码,不能超过5步...为什么?

qncylg1j  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(245)
function [y]=AmericanPutClassic (St,t)
% S0 = 100;
K = 100;
r = 0.05;
sigma = 0.3;
T = 2;
nsteps = 5;
% St
dt = T / nsteps;
u=exp(sigma*sqrt(dt));
d=1/u;

Pu=(exp(r*dt)-d)/(u-d);
Pd=1-Pu;

if t==T
    y=max(K-St,0);
    return
elseif t<T
    upPrice=AmericanPutClassic(St*u,t+dt);
    downPrice=AmericanPutClassic(St*d,t+dt);
    PrevPrice=(Pu*upPrice+Pd*downPrice)*exp(-r*dt);
    if max(K-St,0) > PrevPrice
        y=max(K-St,0);
    else 
        y=PrevPrice;
    end
    return
end
end

我认为我的代码可以完成这项工作,但当我将‘nSteps’设置为大于5时,它就会崩溃……我一直收到不同的错误...现在它只是说我的代码有问题,当它高于5时…然后它会显示:“?已达到500的最大递归限制。使用Set(0,‘RecursionLimit’,N)更改限制。请注意,超过可用堆栈空间可能会使MATLAB和/或您的计算机崩溃。”
有人能发现问题所在吗?我首先给americanPutClassic(100,0)打电话...

qgelzfjb

qgelzfjb1#

我不知道你想做什么,但这个问题已经被描述了这么多次,所以它不再有趣了。
让我们画一幅画:
你一开始就是这样

dt = T / nsteps;

这是我的第一个危险信号。
然后,您需要:

if t==T

其中t = t + dt
这有什么不对的?因为有一种奇妙的东西叫做量子化。换句话说,总会有一段时间,因为超微小的微小差异,结果将不会正确。NSteps越大,情况就越糟糕。
然后雪上加霜的是,你把这行字

elseif t<T ... end

这意味着您的代码将跳过所有内容,并且不会返回任何内容,从而导致代码崩溃。
如何解决这个问题呢?如果您可以移动整数而不是浮点值,您将处于更有利的位置。因此,您可以使用currentStep来代替dt,这样:

function [y]=AmericanPutClassic (St, currentStep)
if nargin < 2
    currentStep = 0;
end
...
if currentStep>=nsteps % if t==T
...
else
...
    upPrice=AmericanPutClassic(St*u,currentStep+1);
...
end

相关问题