【问题标题】:loop for these iterations这些迭代的循环
【发布时间】:2010-09-10 10:15:03
【问题描述】:

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

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

,整个过程就会停止

如果前两个静态猜测不符合标准,则需要这样做

$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 显然会根据 -1 的值更改为 $x1、$x2、$x3 等。

我正在尝试将其放入 while 循环(或任何循环),但遇到了一些困难。

【问题讨论】:

  • 这个东西有名字吗,比如“NameA-NameB 方法”(例如“Newton-Raphson Division”)?
  • 称为割线法
  • 很有趣,所以我随机猜测它几乎是正确的 :) 但是你的条件不应该是 while( $intr&lt;=-1 || $intr&gt;=1 ) 来运行这个循环直到 f(x2) 在你的 epsilon 内吗?

标签: php loops for-loop while-loop


【解决方案1】:

让我们从设置开始

$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 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 浮点数一起使用(我的 猜测 是不是)。

【讨论】:

    猜你喜欢
    • 2021-02-18
    • 2018-03-16
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2017-06-25
    相关资源
    最近更新 更多