2010-08-23 2 views
1

Comment devrais-je transformer la méthode d'itération sécante en PHP?Méthode d'itération sécante dans PHP

La formule est x i + 1 = x i - (f (x i ) (x i -x i + 1))/f (x i ) - f (x i-1)

où f = fonction et i est une itération.

SOx i + 1 est la prochaine itération après x i

Jusqu'à présent, j'ai vu, mais il est somethning mal quelque part si je veux faire un à partir de zéro, à moins que quelqu'un ici peut voir ce qui ne va pas avec cela?

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++; 
    } 

Merci

oublié d'ajouter, FINANCIAL_ACCURACY est défini comme

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

Répondre

0

Tout d'abord, êtes-vous sûr de la formule? J'ai le sentiment que le i + 1 le plus à droite devrait être i-1. Sinon, vous devriez commencer par réécrire la formule de sorte que x [i + 1] n'apparaisse que sur la gauche. Deuxièmement, je ne peux pas voir comment le code que vous avez posté implémente la formule donnée. This page contient un certain nombre d'implémentations de la méthode sécante que vous pouvez facilement transférer sur php.

+0

Le code affiché est essentiellement une partie du code que j'ai posté ici http://stackoverflow.com/questions/3198939/recreate-excel-rate-function-using-newtons-method en réponse à une question sur la réplication d'Excel Fonction RATE() en PHP. Je suis intéressé à savoir ce qui ne va pas avec, mais l'OP ne donne pas beaucoup d'indication d'une erreur –

+0

le i + 1 dans la partie supérieure devrait être -1 désolé. En regardant l'autre code que vous avez lié à l'erreur, j'ai trouvé l'erreur suivante: define ('FINANCIAL_ACCURACY', 1.0e-6); devrait être define ('FINANCIAL_ACCURACY', 1.0e-8); – Jamie

0

ont essayé d'utiliser le code suivant

<?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); 

?> 

très étrange, si vous mettez des valeurs comme le paiement mensuel, il fonctionne parfaitement, mais quand vous mettez les autres en elle ne fonctionne pas.

le -331,09 ne fonctionne pas

je suis en train de comprendre pourquoi cela fonctionnerait pour certains, mais pas tous les chiffres, quand sur Excel les mêmes valeurs fonctionnent parfaitement

modifier:

la Le problème est le FINANCIAL_PRESICION qui est défini en haut. pour certains nombres, cela fonctionne comme 08, pour d'autres, il faut 03 ou 04, le problème est, comment faire pour que ça fasse automatiquement le bon numéro?