这些迭代的循环

时间:2010-09-10 10:15:04

标签: php loops for-loop while-loop

我正在尝试循环下面的迭代,代码在下面,我会尝试将其分解。

<?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,因为它们是两个静态的公式)如果结果结果为&lt; 1或&gt; -1,则整个过程停止p>

如果前两个静态猜测不符合标准则需要执行此操作

循环中

$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等,具体取决于哪个值为&lt; 1和&gt; -1。

我试图把它放到while循环中,(或任何循环),但有一些困难。

1 个答案:

答案 0 :(得分: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&lt; = -1 || $ i2&amp; 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浮点数一起使用(我的猜测是不是)。