PHP迭代的割线法

PHP迭代的割线法,php,math,Php,Math,如何将正割迭代方法转换为php 席席公式为Xi+1=X-(F(XI)(席席+1))/f(XI)-F(XI-1) 其中f=函数,i是迭代 所以xi+1是xi之后的下一个迭代 到目前为止,我已经看到了这一点,但有一些地方是错误的,所以我想从头开始做一个,除非有人在这里可以看到什么是错误的呢 while ((abs($y0 - $y1) > FINANCIAL_ACCURACY) && ($i < FINANCIAL_MAX_ITERATIONS)) { $rat

如何将正割迭代方法转换为php

<席>席席公式为Xi+1=X-(F(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++;
  } 

首先,你确定这个公式吗?我觉得最合适的I+1应该是I-1。如果没有,您应该首先重写公式,使x[i+1]只显示在左侧


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

一直在尝试使用以下代码

<?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上,相同的值可以完美地工作

编辑:

问题是在顶部定义的财务预测。
对于某些数字,它的工作方式是08,对于其他数字,它需要03或04,问题是,如何使它作为正确的数字自动工作?

发布的代码基本上是我在这里发布的代码的一部分,我是为了回答一个关于在PHP中复制Excel的RATE()函数的问题而发布的。我很想知道它到底出了什么问题,但是OP没有给出任何错误的指示。顶部的I+1应该是-1对不起。通过查看您链接到的其他代码,我发现了错误:)define('FINANCIAL_accurity',1.0e-6);应定义(“财务准确性”,1.0e-8);
<?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);

?>