Секретный метод итерации в PHP - PullRequest
1 голос
/ 23 августа 2010

Как бы я превратил секущий метод итерации в php?

Формула: x i + 1 = x i - (f (x * 1007)* i ) (x i -x i + 1 )) / f (x i ) - f (x i-1)

, где f = функция, а i - итерация.

, поэтому x i + 1 - следующая итерация после x i

До сих пор я видел это, но где-то в нем что-то не так, поэтому я хочу сделать это с нуля, если кто-то здесь не может понять, что с ним не так?

while ((abs($y0 - $y1) > FINANCIAL_ACCURACY) && ($i < FINANCIAL_MAX_ITERATIONS))
  {
   $rate = ($y1 * $x0 - $y0 * $x1) / ($y1 - $y0);
   $x0 = $x1;
   $x1 = $rate;

   if (abs($rate) < FINANCIAL_ACCURACY) {
    $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++;
  } 

Спасибо

забыл добавить, FINANCIAL_ACCURACY определяется как

define('FINANCIAL_ACCURACY', 1.0e-6);

Ответы [ 2 ]

0 голосов
/ 24 августа 2010

Попытка использовать следующий код

<?php
define('FINANCIAL_MAX_ITERATIONS', 20); 
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()

$rate = RATE(120,-331.09,20000);

print_r($rate);

?>

очень странно, если вы вводите некоторые значения в качестве ежемесячного платежа, он работает отлично, но тогда, когда вы вводите другие значения, он не работает.

-331.09 не работает

Я пытаюсь понять, почему он будет работать для некоторых, но не для всех чисел, когда в Excel одинаковые значения работают идеально

edit:

проблема в FINANCIAL_PRESICION, который определен вверху.для некоторых чисел он работает как 08, для других ему нужно 03 или 04, проблема в том, как сделать так, чтобы он делал это автоматически как правильный номер?

0 голосов
/ 23 августа 2010

Прежде всего, вы уверены в формуле?У меня есть ощущение, что самый правый i + 1 должен быть i-1.Если нет, вам следует начать с переписывания формулы, чтобы x [i + 1] отображался только слева.

Во-вторых, я не вижу, как опубликованный вами код реализует данную формулу. Эта страница содержит ряд секулярных реализаций методов, которые вы легко можете перенести на php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...