使用正割法(牛頓方法的有限差分近似)的MS Excel的RATE()函數的執行情況取自PHPExcel:
define('FINANCIAL_MAX_ITERATIONS', 128);
define('FINANCIAL_PRECISION', 1.0e-08);
function RATE($nper, $pmt, $pv, $fv = 0.0, $type = 0, $guess = 0.1) {
$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;
} // function RATE()
完美完美!只要記住人們爲FINANCIAL_PRECISION和FINANCIAL_MAX_ITERATIONS插入一些DEFINE語句 - 或者 - 分別用這些靜態值0.0000001和20替換它們。我在上面引用的MS網站上找到了這些值。 – Exit 2010-07-07 21:59:36
此方法有收斂問題,請參閱https://stackoverflow.com/questions/14031208/apache-po-rate-formula-inconsistency-with-long-periods – sled 2017-09-25 11:38:18
@Exit - 那麼也許您會考慮提供更好的解決方案,分享你的知識將有利於我們所有人 – 2017-09-25 11:39:59