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