Php 速率函数问题 简要说明:

Php 速率函数问题 简要说明:,php,Php,rate函数计算达到未来值所需的速率 nper-期间数(期间数) 付款-付款(每月或每年) pv-现值(初始金额) fv-未来价值(达到的金额) 问题: 我使用了Function Rate(下面的php代码),但我遇到了一些问题。我将其与以下值一起使用: 错 好 看起来,当$nper、$pv、$pmt和$fv之间的差异变大时,代码就会出错 有人知道问题出在哪里吗?提前谢谢 define('FINANCIAL_MAX_ITERATIONS', 128); define('FINANCIAL_PRE

rate函数计算达到未来值所需的速率

nper-期间数(期间数) 付款-付款(每月或每年) pv-现值(初始金额) fv-未来价值(达到的金额)

问题: 我使用了Function Rate(下面的php代码),但我遇到了一些问题。我将其与以下值一起使用:

错 好 看起来,当
$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;
} 
define('FINANCIAL\u MAX\u ITERATIONS',128);
定义('FINANCIAL_PRECISION',1.0e-08);
功能费率($nper、$pmt、$pv、$fv、$type、$guess)
{
$rate=$guess;
if(资产支持率($rate)<财务精度){
$y=$pv*(1+$nper*$rate)+$pmt*(1+$rate*$type)*$nper+$fv;
}否则{
$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;
//用割线法求根
$i=$x0=0.0;
$x1=$rate;
而((abs($y0-$y1)>财务精度)和($i<财务最大迭代次数)){
美元汇率=($y1*$x0-$y0*$x1)/($y1-$y0);
$x0=$x1;
$x1=$rate;
if(资产支持率($rate)<财务精度){
$y=$pv*(1+$nper*$rate)+$pmt*(1+$rate*$type)*$nper+$fv;
}否则{
$f=exp($nper*log(1+$rate));
$y=$pv*$f+$pmt*(1/$rate+$type)*($f-1)+$fv;
}
$y0=$y1;
$y1=$y;
++$i;
}
回报率:$;
} 

代码使用割线法来计算回报率,我不知道为什么代码不能正常工作,但实现Excel比率函数的更好方法是使用牛顿-拉斐逊法

我将给你们Excel用于TVM函数的方程,你们可以通过从这个方程中生成函数f(x)来实现牛顿-拉斐逊方法

从那里你需要得到f(x)的导数,即f'(x),并按照本页关于的说明进行操作。这一页描述了用牛顿-拉斐逊方法寻找IRR,但您可以用以下函数替换本文中的函数f(x)和f'(x

f(x) = PV (1+RATE)^NPER + PMT(1+RATE*TYPE)[{(1+RATE)^NPER-1}/RATE] + FV
现在,您可以找到f'(x)并使用步骤大纲来使用牛顿-拉斐逊方法


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

我认为您最好提供一些简短的说明,说明您的速率函数的用途。很难从代码中分辨出来。另外,可能会有帮助。可以让你对这个问题有所了解你是对的。下次我会这么做。我不知道如何编辑这个电话。HansIs认为
Rate
函数是特定于域的,或者有一些广泛使用的算法?这是一种广泛使用的算法。我在这个网站上找到了这个版本。
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;
} 
f(x) = PV (1+RATE)^NPER + PMT(1+RATE*TYPE)[{(1+RATE)^NPER-1}/RATE] + FV