2010-07-07 2 views
6

저는 PHP로 모기지 계산기를 변환하려고 합니다만, PHP 솔루션이 반드시 필요한 것은 아닙니다. Excel RATE 기능을 복제하는 데 필요한 논리를 찾고 있습니다. 나는 이분법을 사용하는 해결책을 찾았고, 더 나 빠지면 그것을 사용합니다.Newton의 방법을 사용하여 Excel RATE 함수를 다시 작성하십시오.

나는 interwebs 세계에있는 사람들이 그런 기능에 대한 지식을 가지고 있다는 것을 알고 있으므로 처음부터 해결책을 만드는 대신 쉬운 대답을하고 싶습니다.

참조 :

감사

할선 법 (뉴턴 방법의 유한 차분 근사)를 사용하여 MS 엑셀 RATE() 함수

답변

8

구현 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

:

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

기능은, PHP,이 같은하실 수 있습니다! 사람들이 FINANCIAL_PRECISION 및 FINANCIAL_MAX_ITERATIONS에 대한 일부 DEFINE 문을 연결하는 것을 기억하십시오. 또는 이들 정적 값을 각각 0.0000001 및 20으로 대체하십시오. 위에서 언급 한 MS 웹 사이트에서이 값을 찾았습니다. – Exit

+0

이 방법은 수렴성 문제가 있습니다. https://stackoverflow.com/questions/14031208/apache-poi-rate-formula-inconsistency-with-long-periods – sled

+0

@ 종료 - 그러면 더 나은 해결책을 제공하는 데 도움이 될 수 있습니다. , 지식을 공유하면 우리 모두에게 도움이 될 것입니다 –

0

위 코드를 사용하려고했지만 결과가 Excel (또는 Google 스프레드 시트)과 동일하지 않습니다.

아직이 기능을 구현해야하는지는 모르겠지만이 알고리즘이 어떻게 구현되었는지, 그리고 내가 찾은 Excel 소스 코드 (또는 Google 워크 시트)에 액세스 할 수없는 경우에도 살펴 보았습니다. 이것은 단순한 계산이 아니라는 것입니다. 이 수학에 대해 더 여기 읽을 수 있습니다 : 완벽 완벽한

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; 
} 
관련 문제