цикл для этих итераций - PullRequest
       10

цикл для этих итераций

0 голосов
/ 10 сентября 2010

Я пытаюсь выполнить цикл нижеприведенной итерации, код приведен ниже, и я постараюсь также разбить его.

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

в этой функции $ rate сначала становится $ x0, затем $ x1 и $ x2 и т. Д.

$ 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 (или любой цикл в этом отношении), но испытываю некоторые трудности.

1 Ответ

2 голосов
/ 10 сентября 2010

Давайте начнем с настройки

$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), т. Е. <code>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 (мое предположение не так ли) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...