2010-07-07 4 views
6

Je travaille sur la conversion d'une calculatrice hypothécaire en PHP, mais je n'ai pas nécessairement besoin d'une solution PHP. Je suis à la recherche de la logique nécessaire pour répliquer la fonction Excel RATE. J'ai trouvé une solution qui utilise la bissection, et si pire, elle se détériore, je l'utilise.Recréer la fonction Excel RATE à l'aide de la méthode de Newton

Je sais que quelqu'un dans le monde interwebs a la connaissance d'une telle fonction, donc j'aimerais avoir une réponse facile au lieu de créer une solution à partir de zéro.

Références: fonction

Merci

Répondre

8

mise en œuvre du taux MS Excel() en utilisant la méthode de la sécante (une approximation de différence finie de la méthode de Newton) extrait de 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() 
+2

parfaitement parfait! Rappelez-vous juste les gens à brancher soit des déclarations DEFINE pour FINANCIAL_PRECISION et FINANCIAL_MAX_ITERATIONS - ou - les remplacer par ces valeurs statiques 0.0000001 et 20 respectivement. J'ai trouvé ces valeurs sur le site MS mentionné ci-dessus. – Exit

+0

Cette méthode a des problèmes de convergence, voir https://stackoverflow.com/questions/14031208/apache-poi-rate-formula-inconsistency-with-long-periods – sled

+0

@Exit - Alors peut-être que vous voudriez fournir une meilleure solution , partager vos connaissances serait bénéfique pour tous –

0

J'ai essayé d'utiliser le code ci-dessus, mais les résultats ne sont tout simplement pas les mêmes qu'Excel (ou Google Spreadsheet). Je ne sais pas si vous devez implémenter cette fonction pour le moment, mais en tout cas, j'ai regardé comment cet algorithme a été construit et même si je n'ai pas pu accéder au code source d'Excel (ou à la feuille de calcul google) j'ai trouvé que ce n'est pas un calcul simple. A propos de ce calcul, plus peut être lu ici:

https://brownmath.com/bsci/loan.htm#Eq8

La fonction, en PHP, peut-être quelque chose comme ceci:

function rate($nprest, $vlrparc, $vp, $guess = 0.25) { 
    $maxit = 100; 
    $precision = 14; 
    $guess = round($guess,$precision); 
    for ($i=0 ; $i<$maxit ; $i++) { 
     $divdnd = $vlrparc - ($vlrparc * (pow(1 + $guess , -$nprest))) - ($vp * $guess); 
     $divisor = $nprest * $vlrparc * pow(1 + $guess , (-$nprest - 1)) - $vp; 
     $newguess = $guess - ($divdnd/$divisor); 
     $newguess = round($newguess, $precision); 
     if ($newguess == $guess) { 
      return $newguess; 
     } else { 
      $guess = $newguess; 
     } 
    } 
    return null; 
} 
Questions connexes