我试图计算内部收益率而不使用" 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]
我想这与复杂的根源有关。在指南中搜索我找不到如何将结果限制在真正的根源(承认这实际上是问题)。
有谁知道发生了什么以及如何获得结果?
答案 0 :(得分:2)
fzero寻找符号反转而不是完全为0.如果你绘制函数:
你看到符号反转发生在-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);