Воссоздайте функцию Excel RATE использование Метода Ньютона

Я работаю над преобразованием ипотечного калькулятора в PHP, но мне не обязательно нужно решение PHP. Я ищу логику, должен был копировать Excel RATE функция. Я нашел решение, которое использует деление пополам и, если хуже прибывает в худший, я использую это.

Я знаю, что у кого-то там в межвеб-мире есть знание такой функции, таким образом, я хотел бы иметь легкий ответ вместо того, чтобы создать решение с нуля.

Ссылки:

Спасибо

7
задан Yi Jiang 16 November 2010 в 16:07
поделиться

1 ответ

Реализация функции 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()
9
ответ дан 7 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: