2010-09-10 4 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; 

в этой функции $ скорости становится $ х0 сначала, то $ 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» (например, «подразделение Ньютона-Рафсона»)? – VolkerK

+0

Это называется секущий метод – James

+0

Забавный, поэтому я случайно догадался, что он почти прав :) Но не должно быть вашего условия 'while ($ intr <= - 1 || $ intr> = 1)' для запуска этого цикла до тех пор, пока f (x2) находится внутри вашего эпсилон? – VolkerK

ответ

2

Начнем с установки

$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/ WHe Этот метод безопасен для использования с поплавками IEEE (мой догадка это не так).

+0

Спасибо! отлично работает – James

Смежные вопросы