函数fzero,matlab,内部收益率,复杂根

时间:2014-09-15 10:40:28

标签: matlab

我试图计算内部收益率而不使用" irr"功能:A是现金流量,我试图找到使净现值= 0的x值。

A = [-1000 100 900 100 -100 -400];
[xval, fval]=fzero(@(x) A*((1+x).^-(0:length(A)-1))'  , 0 )  ;

正确的结果应该是x = -2,而fzero返回[xval,fval] = [ - 1,2.315841784746324e + 79]

我想这与复杂的根源有关。在指南中搜索我找不到如何将结果限制在真正的根源(承认这实际上是问题)。

有谁知道发生了什么以及如何获得结果?

2 个答案:

答案 0 :(得分:2)

fzero寻找符号反转而不是完全为0.如果你绘制函数: plot of your function

你看到符号反转发生在-1左右,你要求函数查看0。

如果您将X0的值从0更改为-5,例如:

[xval,fval] = fzero(@(x)A *((1 + x)。^ - (0:length(A)-1))', - 5);

那么你将得到xval = -2

答案 1 :(得分:1)

将价值赋予负值几乎可以保证返回复杂的价值,你认为不是吗?您可以尝试使用real包装函数以强制结果为实值:

A = [-1000 100 900 100 -100 -400];
[xval,fval] = fzero(@(x)real(A*(1+x).^-(0:length(A)-1).'), 0);

返回-1.000000000000000。这个函数有多个根。如果您需要-2根,则必须选择接近-2另一侧的初始猜测,例如,

[xval,fval] = fzero(@(x)real(A*(1+x).^-(0:length(A)-1).'), -3);