输入0在Matlab中返回NaN

时间:2014-03-19 02:58:53

标签: matlab

Nelson-Siegel是一种用于模拟利率的方法。有关Nelson-Siegel的更多信息:http://en.wikipedia.org/wiki/Fixed-income_attribution

我写了这样的代码:

function [ interest ] = Nelson_Siegel(s)
 beta0 = 0.0408; beta1 = -0.0396; beta2 = -0.0511; tau= 1.614;
 interest = beta0 + beta1*(tau/s)*(1-exp(-s/tau))+beta2*((tau/s)*(1-exp(-s/tau))-exp(-s/tau));
end

问题是当我输入值0时,它给我一个NaN值。它应该等于0。不知道哪里出错了。

2 个答案:

答案 0 :(得分:3)

这是因为这个词:

T = beta1*(tau/s)*(1-exp(-s/tau))

作为s ⇒ 0τ/s ⇒ ∞

1-exp(-s/τ) ⇒ 1-e⁰ = 1-1 = 0

因此:

s ⇒ 0 ∴ T ⇒ β₁·∞·0 ⇒ NaN

因为∞·0不是正确的数字。

答案 1 :(得分:2)

您的除零问题的解决方案可能是与eps进行比较,并将其视为特例:

function [ interest ] = Nelson_Siegel(s)
  beta0 = ...
  if abs(s)<eps,
    interest = 0;
  else
    interest = beta0 + beta1*(tau/s)*...
  end
end