正确迭代到PHP的方法

时间:2010-08-23 14:14:19

标签: php math

我如何将割线方法转换为php?

公式为x i + 1 = x i - (f(x i )(x i -x <子> i + 1的))/ F(X <子> I ) - F(X <子> I-1

其中f = function,i是迭代。

所以x i + 1 是x i 之后的下一次迭代

到目前为止,我已经看到了这一点,但在某处有一些错误,所以我想从头开始制作一个,除非有人在这里看到它有什么问题?

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

一直在尝试使用以下代码

<?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的问题,问题是,如何制作它以便自动将其作为正确的数字?