速率功能问题

时间:2011-08-15 12:13:32

标签: php

简短说明:

费率函数计算达到未来价值所需的费率。

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;
} 

1 个答案:

答案 0 :(得分:0)

代码使用割线方法来查找返回率,我不确定为什么代码不能正常工作但是使用Newton Raphson方法实现Excel RATE函数的更好方法

我将为您提供Excel用于TVM函数的等式,您可以通过使函数f(x)超出此等式来实现Newton Raphson方法

从那里你需要得到f(x)的导数,即f'(x),并按照本页中有关IRR的说明进行操作。该页面描述了使用Newton Raphson方法查找IRR,但您可以使用以下函数替换文章中的函数f(x)和f'(x)

f(x) = PV (1+RATE)^NPER + PMT(1+RATE*TYPE)[{(1+RATE)^NPER-1}/RATE] + FV

现在由你来找到f'(x)并使用步骤大纲来使用Newton Raphson方法

此Excel RATE calculator使用Newton Raphson方法在PHP中实现,因此您可以使用测试数据来查看是否获得了所需的结果。请注意,此计算器遵循美国和英国的数字和句点表示法用于表示小数点,与欧洲使用的逗号不同