2010-08-23 10 views
1

어떻게 반복의 secant 방법을 PHP로 바꿀까요? (F (X I에게) (X I -x I + 1))/F (X I에게) -Secant 반복 방법 PHP로

수식 I + 1 = X I X 인 - f (xi-1)

여기서 f = 함수이고 i는 반복이다.

그래서 X 나는 + 1

지금까지 내가 이것을 본 나는 X 후 다음 반복하지만, 사람이하지 않는, 어딘가 잘못 somethning 그래서 난 처음부터 일을 만들고 싶어 거기 여기에 무엇이 잘못되었는지 볼 수 있습니까?

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

답변

0

첫째로 정의 추가 잊으 셨나요? 가장 오른쪽에있는 i + 1이 i-1이어야한다고 생각합니다. 그렇지 않다면 x [i + 1]이 왼쪽에 표시되도록 수식을 다시 작성해야합니다.

두 번째로, 내가 게시 한 코드가 주어진 수식을 구현하는 방법을 볼 수 없습니다. This page에는 PHP로 쉽게 포팅 할 수있는 많은 세컨드 메소드 구현이 포함되어 있습니다.

+0

게시 된 코드는 기본적으로 여기에 게시 된 코드의 일부입니다. Excel의 복제에 대한 질문에 대한 응답으로 http://stackoverflow.com/questions/3198939/recreate-excel-rate-function-using-newtons-method PHP의 RATE() 함수. 나는 무엇이 잘못 되었는가에 관심이있다. 그러나 OP는 어떤 에러에 대해서도 많은 것을 알려주지 않는다. –

+0

윗부분의 i + 1은 -1이되어야한다. 내가 링크 된 다른 코드를보고 오류가 있음을 확인했습니다.) define ('FINANCIAL_ACCURACY', 1.0e-6); 은 이어야합니다. define ('FINANCIAL_ACCURACY', 1.0e-8); – Jamie

0

는 당신이 완벽하게 작동 월부금으로 일부 값을 넣을 경우,

<?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 내가 엑셀에서 같은 값이 완벽하게

편집 작업 할 때, 일부가 아닌 모든 숫자 작동 이유를 해결하려고 노력하고

작동하지 않습니다 문제는 맨 위에 정의 된 FINANCIAL_PRESICION입니다. 일부 숫자는 08로, 다른 숫자는 03 또는 04가 필요합니다. 문제는 어떻게 자동으로 올바른 번호로 처리 할 수 ​​있습니까?