【问题标题】:Secant method of iteration into PHP迭代到PHP的正割方法
【发布时间】:2010-08-23 14:14:18
【问题描述】:

我如何将正割法迭代成php?

公式为 xi+1= xi - (f(xi) (xi-xi+1))/f(xi)-f(xi-1)

其中 f = 函数,i 是迭代。

所以 xi+1 是 xi

之后的下一次迭代

到目前为止,我已经看到了这个,但是其中某处有问题,所以我想从头开始制作一个,除非这里有人能看出它有什么问题?

while ((abs($y0 - $y1) > FINANCIAL_ACCURACY) && ($i < FINANCIAL_MAX_ITERATIONS))
  {
   $rate = ($y1 * $x0 - $y0 * $x1) / ($y1 - $y0);
   $x0 = $x1;
   $x1 = $rate;

   if (abs($rate) < FINANCIAL_ACCURACY) {
    $y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv;
   } else {
    $f = exp($nper * log(1 + $rate));
    $y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;
   }

   $y0 = $y1;
   $y1 = $y;
   $i++;
  } 

谢谢

忘了补充,FINANCIAL_ACCURACY定义为

define('FINANCIAL_ACCURACY', 1.0e-6);

【问题讨论】:

    标签: php math


    【解决方案1】:

    首先,您确定公式吗?我有一种感觉,最右边的 i+1 应该是 i-1。如果没有,您应该首先重写公式,使 x[i+1] 只显示在左侧。

    其次,我无法看到您发布的代码如何实现给定的公式。 This page 包含许多割线方法实现,您可以轻松移植到 php。

    【讨论】:

    • 发布的代码基本上是我在此处发布的代码的一部分stackoverflow.com/questions/3198939/…,以回答有关在 PHP 中复制 Excel 的 RATE() 函数的问题。我有兴趣知道它有什么问题,但 OP 并没有给出任何错误的指示
    • 顶部的 i+1 应该是 -1 抱歉。通过查看您链接到的其他代码,我发现了错误:) define('FINANCIAL_ACCURACY', 1.0e-6);应该定义('FINANCIAL_ACCURACY', 1.0e-8);
    【解决方案2】:

    一直在尝试使用下面的代码

    <?php
    define('FINANCIAL_MAX_ITERATIONS', 20); 
    define('FINANCIAL_PRECISION', 1.0e-08); 
    
    
    function RATE($nper, $pmt, $pv, $fv = 0.0, $type = 0, $guess = 0.1) { 
    
        $rate = $guess; 
        if (abs($rate) < FINANCIAL_PRECISION) { 
            $y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv; 
        } else { 
            $f = exp($nper * log(1 + $rate)); 
            $y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv; 
        } 
        $y0 = $pv + $pmt * $nper + $fv; 
        $y1 = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv; 
    
        // find root by secant method 
        $i  = $x0 = 0.0; 
        $x1 = $rate; 
        while ((abs($y0 - $y1) > FINANCIAL_PRECISION) && ($i < FINANCIAL_MAX_ITERATIONS)) { 
            $rate = ($y1 * $x0 - $y0 * $x1) / ($y1 - $y0); 
            $x0 = $x1; 
            $x1 = $rate; 
    
            if (abs($rate) < FINANCIAL_PRECISION) { 
                $y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv; 
            } else { 
                $f = exp($nper * log(1 + $rate)); 
                $y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv; 
            } 
    
            $y0 = $y1; 
            $y1 = $y; 
            ++$i; 
        } 
        return $rate; 
    }   //  function RATE()
    
    $rate = RATE(120,-331.09,20000);
    
    print_r($rate);
    
    ?>
    

    很奇怪,如果你把一些值作为每月支付它工作得很好,但是当你把其他值放进去时它就不起作用了。

    -331.09 不起作用

    我试图弄清楚为什么它适用于某些但不是所有数字,当在 excel 上相同的值完美地工作时

    编辑:

    问题是在顶部定义的 FINANCIAL_PRESICION。 对于某些数字,它可以作为 08,对于其他数字,它需要 03 或 04,问题是,如何使其自动作为正确的数字?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      相关资源
      最近更新 更多