2010-07-07 2 views
6

Ich arbeite an der Konvertierung eines Hypothekenrechners in PHP, aber ich brauche nicht unbedingt eine PHP-Lösung. Ich suche nach der Logik, die benötigt wird, um die Excel RATE Funktion zu replizieren. Ich habe eine Lösung gefunden, die halbiert, und wenn es schlimmer wird, benutze ich das.Erstellen Sie Excel RATE-Funktion mit Newtons Methode

Ich kenne jemanden da draußen in der Interweb-Welt hat Wissen über eine solche Funktion, so würde ich gerne eine einfache Antwort haben, anstatt eine Lösung von Grund auf neu zu erstellen.

Referenzen:

Dank

Antwort

8

Umsetzung der MS Excel RATE() gibt die Sekanten-Verfahren (ein Finite-Differenzen-Approximation des Newton-Verfahrens) unter Verwendung von entnommen aus 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

Perfekt perfekt Über diese Mathe, können Sie hier mehr lesen! Denken Sie daran, dass die Leute entweder einige DEFINE-Anweisungen für FINANCIAL_PRECISION und FINANCIAL_MAX_ITERATIONS einfügen - oder - ersetzen Sie sie durch diese statischen Werte 0.0000001 und 20. Ich habe diese Werte auf der oben genannten MS-Website gefunden. – Exit

+0

Diese Methode hat Konvergenzprobleme, siehe https://stackoverflow.com/questions/14031208/apache-po-irate-formula-inconsistency-with-long-periods – sled

+0

@Exit - Dann möchten Sie vielleicht eine bessere Lösung bieten , teilen Ihr Wissen würde uns alle profitieren –

0

Ich habe versucht, den obigen Code zu verwenden, aber die Ergebnisse sind einfach nicht dasselbe wie Excel (oder Google Spreadsheet).

Ich weiß nicht, ob Sie diese Funktion noch implementieren müssen, aber in jedem Fall habe ich untersucht, wie dieser Algorithmus erstellt wurde und obwohl ich nicht auf den Excel-Quellcode (oder das Google-Arbeitsblatt) zugreifen konnte Das ist keine einfache Berechnung. https://brownmath.com/bsci/loan.htm#Eq8

Die Funktion, in PHP, kann so etwas wie dieses

:

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; 
} 
Verwandte Themen