我正在尝试循环下面的迭代,代码在下面,我会尝试将其分解。
<?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循环中,(或任何循环),但有一些困难。
答案 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浮点数一起使用(我的猜测是不是)。