php - 速率函数的问题

简短描述:

速率函数计算达到 future 值所需的速率。

nper - 周期数(周​​期数) pmt - 付款(每月或每年) pv - 现值(初始金额) fv - future 值(value)(达到的金额)

问题:

我使用了 Rate 函数(下面的 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;
} 

最佳答案

代码使用正割法求 yield ,我不确定为什么代码不能正常工作,但实现 Excel RATE 函数的更好方法是使用 Newton Raphson 方法

我会给你 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) 并使用牛顿拉夫森法的步骤概述

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

https://stackoverflow.com/questions/7064753/

相关文章:

django - 在 Django 中动态设置默认表单值

android - 向 RadioGroup 和 Radiobutton 添加过渡动画

objective-c - 如何在 Objective-C 中调试单例

php - 在 ImageMagick 中量化图像时保留 alpha channel ?

php - php中DOMDocument的编码问题

php - PEAR 邮件连接拒绝 smtp.gmail.com

iphone - 在 iOS 上捕获视频时查询最佳像素格式?

algorithm - 关系型数据库是否可以利用一致性哈希的方式来做分区表?

visual-studio-2010 - 无法调试 T-SQL 或存储过程

visual-studio - Visual Studio 安装项目预生成事件