2010-09-10 79 views
0

我想循環下面的迭代,代碼在下面,我會嘗試並將其分解。循環這些迭代

<?php 

    function intr($LoanRequired, $TermMonths, $MonthlyPayment, $rate) { 
    $intr= $LoanRequired * pow((1 + $rate), $TermMonths) + $MonthlyPayment * ((pow((1 + $rate), $TermMonths) - 1)/$rate); 
    return $intr; 
    } 
    $x0=0.008; 
    $x1=0.025; 
    $LoanRequired=20000; 
    $TermMonths=120; 
    $MonthlyPayment=-271.09; 
    $x2=$x0-(((intr($LoanRequired,$TermMonths,$MonthlyPayment,$x0))*($x0-$x1))/(intr($LoanRequired,$TermMonths,$MonthlyPayment,$x0)-intr($LoanRequired,$TermMonths,$MonthlyPayment,$x1))); 
    print_r($x2); 
    $intr = $LoanRequired * pow((1 + $x2), $TermMonths) + $MonthlyPayment * ((pow((1 + $x2), $TermMonths) - 1)/$x2); 
    while($intr>=-1 || $intr<=1) { 

    return ; 
    } 
    ?> 

$x0=0.008;這並沒有改變,$ X0是第一個猜測 $x1=0.025;這並不會改變$ X1爲第二猜測

$LoanRequired=20000; 
$TermMonths=120; 
$MonthlyPayment=-271.09; 

所有變量將來自於形式(全這些都將取決於什麼用戶輸入)

function intr($LoanRequired, $TermMonths, $MonthlyPayment, $rate) { 
     $intr= $LoanRequired * pow((1 + $rate), $TermMonths) + $MonthlyPayment * ((pow((1 + $rate), $TermMonths) - 1)/$rate); 
     return $intr; 

在這個函數$率變化成爲$ X0在第一,然後$ X1和X2 $Ë tc。

$ intr = $ LoanRequired * pow((1+ $ x0),$ TermMonths)+ $ MonthlyPayment *((pow((1 + $ x0),$ TermMonths) - 1)/ $ x0);

第一它需要進入上述這個公式,($ X0第一然後$ X1,它們都在兩個靜態的),如果結果證明是< 1或> -1

整個過程停止

如果前兩個靜態猜測不符合標準,則需要執行此操作。

$x2=$x0-(((intr($LoanRequired,$TermMonths,$MonthlyPayment,$x0))*($x0-$x1))/(intr($LoanRequired,$TermMonths,$MonthlyPayment,$x0)-intr($LoanRequired,$TermMonths,$MonthlyPayment,$x1)));在循環中。 在這種情況下$ X2將= 0.0082002592938519這將被投入再次 $intr = $LoanRequired * pow((1 + $x0), $TermMonths) + $MonthlyPayment * ((pow((1 + $x0), $TermMonths) - 1)/$x0);,如果不符合標準,它繼續循環,直到它之後,它需要去$ X3,$ X4等

做到這個公式$apr=((pow(($x0+1),12))-1)*100;($ x0顯然會變爲$ x1,$ x2,$ x3等,具體取決於哪個值是< 1和> -1。

我試圖把它放到while循環中,(或任何循環)但有一定難度。

+0

這個東西是否有名稱,比如「NameA-NameB方法」(例如「Newton-Raphson division」)? – VolkerK 2010-09-10 10:36:59

+0

它被稱爲割線方法 – James 2010-09-10 10:44:57

+0

有趣,所以我隨機猜對它幾乎正確:)但不應該你的條件是'while($ intr <= - 1 || $ intr> = 1)'運行這個循環直到f (x2)是否在你的epsilon? – VolkerK 2010-09-10 11:05:35

回答

2

讓我們從設置

開始3210
$i0 = intr($LoanRequired,$TermMonths,$MonthlyPayment,$x0); 
$i1 = intr($LoanRequired,$TermMonths,$MonthlyPayment,$x1); 

然後X2成爲

$x2=$x0-($i0*($x0-$x1)/($i0-$i1)); 

$i2 = intr($LoanRequired,$TermMonths,$MonthlyPayment,$x2); 

現在,如果你不需要當前$ X0/$ I0更多的下一個步驟。當前$ X1/$ I1成爲$ X0/$ i0和$ X2/$ I2成爲$ X1/$ I1

$x0 = $x1; $i0=$i1; 
$x1 = $x2; $i1=$i2; 

而且你這樣做,雖然($ I2 < = -1 || $ I2 & GT = 1),即while (abs($i2) >= 1)

<?php 
function intr($LoanRequired, $TermMonths, $MonthlyPayment, $rate) { 
    $intr= $LoanRequired * pow((1 + $rate), $TermMonths) + $MonthlyPayment * ((pow((1 + $rate), $TermMonths) - 1)/$rate); 
    return $intr; 
} 

$LoanRequired=20000; 
$TermMonths=120; 
$MonthlyPayment=-271.09; 
$x0=0.008; 
$x1=0.025; 
$i0 = intr($LoanRequired,$TermMonths,$MonthlyPayment,$x0); 
$i1 = intr($LoanRequired,$TermMonths,$MonthlyPayment,$x1); 

echo "f($x0)=", $i0, "\n"; 
echo "f($x1)=", $i1, "\n"; 

$dbgcnt = 0; 
do { 
    if (100 < ++$dbgcnt) { 
    die('bailout'); 
    } 

    $x2=$x0-($i0*($x0-$x1)/($i0-$i1)); 
    $i2 = intr($LoanRequired,$TermMonths,$MonthlyPayment,$x2); 
    echo "f($x2)=", $i2, "\n"; 

    $x0 = $x1; $i0=$i1; 
    $x1 = $x2; $i1=$i2; 
} while (abs($i2) > 1); 

echo "----\nx=$x2"; 

打印

f(0.008)=-2242.1586767476 
f(0.025)=188094.563138 
f(0.0082002592938519)=-1736.2922063647 
f(0.0083539185016984)=-1336.4282682791 
f(0.0088674794645362)=76.76523796426 
f(0.0088395826270916)=-3.1241157534314 
f(0.0088406735477872)=-0.0068921130805393 
---- 
x=0.0088406735477872 

但是,如果這是任何重要性,你應該在https://mathoverflow.net/磨片上問這種方法是安全的使用IEEE浮點數(我的猜測是不是)。

+0

謝謝!作品完美 – James 2010-09-10 11:27:11