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

函数fzero,matlab,内部收益率,复数根,matlab,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] 我想这与复杂的根有关。在指南中搜索时,我找不到如何将结果限制为实际根(承认这实际上是个问

我试图在不使用“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]

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


有人知道发生了什么以及如何得到预期的结果吗?

将一个值取为负幂肯定会返回复杂的值,你不这么认为吗?您可以尝试使用包装函数,以强制结果为实值:

A = [-1000 100 900 100 -100 -400];
[xval,fval] = fzero(@(x)real(A*(1+x).^-(0:length(A)-1).'), 0);
它返回
-1.000000000000000
。此函数有多个根。如果您想要
-2
根,您必须选择一个靠近
-2
或位于
-2
另一侧的初始猜测,例如

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

将一个值取为负幂几乎可以保证返回复杂的值,你不这么认为吗?您可以尝试使用包装函数,以强制结果为实值:

A = [-1000 100 900 100 -100 -400];
[xval,fval] = fzero(@(x)real(A*(1+x).^-(0:length(A)-1).'), 0);
它返回
-1.000000000000000
。此函数有多个根。如果您想要
-2
根,您必须选择一个靠近
-2
或位于
-2
另一侧的初始猜测,例如

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

将一个值取为负幂几乎可以保证返回复杂的值,你不这么认为吗?您可以尝试使用包装函数,以强制结果为实值:

A = [-1000 100 900 100 -100 -400];
[xval,fval] = fzero(@(x)real(A*(1+x).^-(0:length(A)-1).'), 0);
它返回
-1.000000000000000
。此函数有多个根。如果您想要
-2
根,您必须选择一个靠近
-2
或位于
-2
另一侧的初始猜测,例如

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

将一个值取为负幂几乎可以保证返回复杂的值,你不这么认为吗?您可以尝试使用包装函数,以强制结果为实值:

A = [-1000 100 900 100 -100 -400];
[xval,fval] = fzero(@(x)real(A*(1+x).^-(0:length(A)-1).'), 0);
它返回
-1.000000000000000
。此函数有多个根。如果您想要
-2
根,您必须选择一个靠近
-2
或位于
-2
另一侧的初始猜测,例如

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

fzero查找符号反转,而不是精确的0。如果绘制函数:

您可以看到符号反转发生在-1附近,您要求函数查看0

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

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


然后,您将使用xval=-2

fzero查找符号反转,而不是精确的0。如果绘制函数:

您可以看到符号反转发生在-1附近,您要求函数查看0

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

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


然后,您将使用xval=-2

fzero查找符号反转,而不是精确的0。如果绘制函数:

您可以看到符号反转发生在-1附近,您要求函数查看0

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

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


然后,您将使用xval=-2

fzero查找符号反转,而不是精确的0。如果绘制函数:

您可以看到符号反转发生在-1附近,您要求函数查看0

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

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


然后您将得到xval=-2

谢谢大家的回答。你能提出一个识别多个根的策略吗?使用符号计算来避免此类问题是否有用?谢谢大家的回答。你能提出一个识别多个根的策略吗?使用符号计算来避免此类问题是否有用?谢谢大家的回答。你能提出一个识别多个根的策略吗?使用符号计算来避免此类问题是否有用?谢谢大家的回答。你能提出一个识别多个根的策略吗?使用符号计算来避免此类问题是否有用?