简要说明:
rate函数计算达到未来值所需的rate。
nper -期间数(期间数) pmt -付款(每月或每年) pv -现值(初始金额) fv -未来值(要达到的金额)
问题:
我已经使用了函数率(php代码如下),我有一些问题。我将它与以下值一起使用:
不对
Excel - RATE(228;-196,02;-49005;961546,464646;1;0,05) gives: 0,0119
Php - RATE(228,-196.02,-49005,961546.464646,1,0.05) gives: 0.0022好的
Excel - RATE(228;-196,02;-49005;161546,464646;1;0,05) gives:0,003
Php - RATE(228,-196.02,-49005,161546.464646,1,0.05) gives:0.003看起来,当$nper、$pv、$pmt和$fv之间的差异变得更大时,代码就会出错。
有人知道问题出在哪里吗?提前谢谢。
define('FINANCIAL_MAX_ITERATIONS', 128);
define('FINANCIAL_PRECISION', 1.0e-08);
function rate($nper, $pmt, $pv, $fv, $type, $guess)
{
$rate = $guess;
if (abs($rate) < FINANCIAL_PRECISION) {
$y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv;
} else {
$f = exp($nper * log(1 + $rate));
$y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;
}
$y0 = $pv + $pmt * $nper + $fv;
$y1 = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;
// find root by secant method
$i = $x0 = 0.0;
$x1 = $rate;
while ((abs($y0 - $y1) > FINANCIAL_PRECISION) && ($i < FINANCIAL_MAX_ITERATIONS)) {
$rate = ($y1 * $x0 - $y0 * $x1) / ($y1 - $y0);
$x0 = $x1;
$x1 = $rate;
if (abs($rate) < FINANCIAL_PRECISION) {
$y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv;
} else {
$f = exp($nper * log(1 + $rate));
$y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;
}
$y0 = $y1;
$y1 = $y;
++$i;
}
return $rate;
} 发布于 2011-08-20 01:39:22
代码使用割线方法来计算收益率,我不确定为什么代码不能正常工作,但实现Excel利率函数的更好方法是使用牛顿·拉夫森方法
我将给出Excel用于TVM函数的方程式,您可以从这个方程式中生成函数f(x)来实现牛顿-拉夫森方法
从那里你需要得到f(x)的导数,即f'(x),然后按照本页上关于IRR的说明进行操作。该页介绍了使用牛顿Raphson方法查找IRR,但您可以将本文中的函数f(x)和f'(x)替换为以下函数
f(x) = PV (1+RATE)^NPER + PMT(1+RATE*TYPE)[{(1+RATE)^NPER-1}/RATE] + FV现在,您需要找到f'(x)并使用牛顿Raphson方法的步骤轮廓
这个Excel RATE calculator是用PHP语言实现的,使用了牛顿·拉夫森方法,因此您可以使用您的测试数据来查看是否获得了所需的结果。请注意,此计算器遵循美国和英国的数字表示法,句点用于表示小数点,而不同于欧洲使用的逗号
https://stackoverflow.com/questions/7064753
复制相似问题