同志们求一算法 越简单越好 同志们求一算法 已知以下数据x值 --> 结果(大于0)28 --> 10038 --> 7461 --> 46153 --> 18无限大-->无限接近0(但不等于0)求公式,越简单越好。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 曲线拟合?一次多项式 59.5-0.56241032998565*($x-70)二次多项式 33.830610871713-1.0629758193845*($x-70)+0.010522397675051*pow($x-70, 2)三次多项式 33.830598968073+0.7188289055967*($x-70)+0.038520039060206*pow($x-70, 2)-0.00058853890552343*pow($x-70, 3) 计算拟合参数,从C语言移植/** * ar 给定的数据点坐标,偶数下标为 x 坐标,奇数下标为 y 坐标。 * m 拟合多项式的项数,即拟合多项式的最高次数为 m-1。 * n 给定数据点的个数,缺省为数据的全部 **/function Iapcir($ar, $m=2) { for($i=0; $i<count($ar); $i+=2) { $x[] = $ar[$i]; $y[] = $ar[$i+1]; } $n = count($ar)/2; $m = min($m, $n, 20); $z = 0; $avg = 0; for($i=0; $i<$n; $i++) { $avg += $x[$i]; $z += $x[$i] / $n; } $avg /= $n; $p = $c = 0; $d1 = $n; for($i=0; $i<$n; $i++) { $p += $x[$i] - $z; $c += $y[$i]; } $c /= $d1; $p /= $d1; $b[0] = 1; $a[0] = $c * $b[0]; if($m > 1) { $t[0] = -$p; $t[1] = 1; $d2 = $c = $g = 0; for($i=0; $i<$n; $i++) { $q = $x[$i] - $z - $p; $d2 += $q * $q; $c += $y[$i] * $q; $g += ($x[$i] - $z) * $q * $q; } $c = $c / $d2; $p = $g / $d2; $q = $d2 / $d1; $d1 = $d2; $a[0] += $c * $t[0]; $a[1] = $c * $t[1]; } for($j=2; $j<$m; $j++) { $s[$j] = $t[$j-1]; $s[$j-1] = -$p * $t[$j-1] + $t[$j-2]; if($j >= 3) { for($k=$j-2; $k>=1; $k--) { $s[$k] = -$p * $t[$k] + $t[$k-1] - $q * $b[$k]; } } $s[0] = -$p * $t[0] - $q * $b[0]; $d2 = $c = $g = 0; for($i=0; $i<$n; $i++) { $q = $s[$j]; for($k=$j-1; $k>=0; $k--) { $q = $q * ($x[$i] - $z) + $s[$k]; } $d2 += $q * $q; $c += $y[$i] * $q; $g += ($x[$i] - $z) * $q *$q; } $c /= $d2; $p /= $d2; $q = $d2 / $d1; $d1 = $d2; $a[$j] = $c * $s[$j]; $t[$j] = $s[$j]; for($k=$j-1; $k>=0; $k--) { $a[$k] += $c * $s[$k]; $b[$k] = $t[$k]; $t[$k] = $s[$k]; } } $dt = array(0, 0, 0); for($i=0; $i<$n; $i++) { $q = $a[$m-1]; for($k=$m-2; $k>=0; $k--) { $q = $a[$k] + $q * ($x[$i] - $z); } $p = $q - $y[$i]; if(abs($p) > $dt[2]) $dt[2] = abs($p); $dt[0] += $p * $p; $dt[1] += abs($p); } return array( 'avg' => $avg, 'a' => $a, 'dt' => $dt, 'x' => $x, 'y' => $y, );}输出拟合多项式function Polynomial($a, $avg) { $r = array(); $v = "\$x-$avg"; foreach($a as $k=>$n) { if($k == 0) $r[] = $n; elseif($k == 1) $r[] = ($n > 0 ? '+' : '') . "$n*($v)"; else $r[] = ($n > 0 ? '+' : '') . "$n*pow($v, $k)"; } echo join('', $r);}对于你的题目有$ar = array( 28, 100, 38, 74, 61, 46, 153, 18 );$r = Iapcir($ar, 2);Polynomial($r['a'], $r['avg']); 求一段高难度PHP代码,高手帮忙下 php问题 菜鸟诚心求教! php如何获取flash中的Url(在线等待。。。。) 关于web编程问题,求救 SOS,急啊,大家帮帮忙看看怎么解决!高手们 thinkphp分页问题,怎样获取当前页是第几页? 一个是基于类OOP模型开发的网站,一个是不基于OOP开发的,速度明显OOP慢于非OOP,难道PHP的面向对象不中? 请各位高手进来看看 请教关于文件上传大小问题(S O S)在线关注! ajax回调函数返回值 处理时eval的问题 苦恼人啊 TP session多维数组什么格式?
一次多项式 59.5-0.56241032998565*($x-70)
二次多项式 33.830610871713-1.0629758193845*($x-70)+0.010522397675051*pow($x-70, 2)
三次多项式 33.830598968073+0.7188289055967*($x-70)+0.038520039060206*pow($x-70, 2)-0.00058853890552343*pow($x-70, 3)
* ar 给定的数据点坐标,偶数下标为 x 坐标,奇数下标为 y 坐标。
* m 拟合多项式的项数,即拟合多项式的最高次数为 m-1。
* n 给定数据点的个数,缺省为数据的全部
**/
function Iapcir($ar, $m=2) {
for($i=0; $i<count($ar); $i+=2) {
$x[] = $ar[$i];
$y[] = $ar[$i+1];
}
$n = count($ar)/2;
$m = min($m, $n, 20); $z = 0;
$avg = 0;
for($i=0; $i<$n; $i++) {
$avg += $x[$i];
$z += $x[$i] / $n;
}
$avg /= $n; $p = $c = 0;
$d1 = $n;
for($i=0; $i<$n; $i++) {
$p += $x[$i] - $z;
$c += $y[$i];
}
$c /= $d1;
$p /= $d1; $b[0] = 1;
$a[0] = $c * $b[0]; if($m > 1) {
$t[0] = -$p;
$t[1] = 1;
$d2 = $c = $g = 0;
for($i=0; $i<$n; $i++) {
$q = $x[$i] - $z - $p;
$d2 += $q * $q;
$c += $y[$i] * $q;
$g += ($x[$i] - $z) * $q * $q;
} $c = $c / $d2;
$p = $g / $d2;
$q = $d2 / $d1;
$d1 = $d2;
$a[0] += $c * $t[0];
$a[1] = $c * $t[1];
} for($j=2; $j<$m; $j++) {
$s[$j] = $t[$j-1];
$s[$j-1] = -$p * $t[$j-1] + $t[$j-2];
if($j >= 3) {
for($k=$j-2; $k>=1; $k--) {
$s[$k] = -$p * $t[$k] + $t[$k-1] - $q * $b[$k];
}
} $s[0] = -$p * $t[0] - $q * $b[0]; $d2 = $c = $g = 0;
for($i=0; $i<$n; $i++) {
$q = $s[$j];
for($k=$j-1; $k>=0; $k--) {
$q = $q * ($x[$i] - $z) + $s[$k];
}
$d2 += $q * $q;
$c += $y[$i] * $q;
$g += ($x[$i] - $z) * $q *$q;
}
$c /= $d2;
$p /= $d2;
$q = $d2 / $d1;
$d1 = $d2;
$a[$j] = $c * $s[$j];
$t[$j] = $s[$j]; for($k=$j-1; $k>=0; $k--) {
$a[$k] += $c * $s[$k];
$b[$k] = $t[$k];
$t[$k] = $s[$k];
}
}
$dt = array(0, 0, 0);
for($i=0; $i<$n; $i++) {
$q = $a[$m-1];
for($k=$m-2; $k>=0; $k--) {
$q = $a[$k] + $q * ($x[$i] - $z);
}
$p = $q - $y[$i];
if(abs($p) > $dt[2])
$dt[2] = abs($p);
$dt[0] += $p * $p;
$dt[1] += abs($p);
}
return array(
'avg' => $avg,
'a' => $a,
'dt' => $dt,
'x' => $x,
'y' => $y,
);
}输出拟合多项式function Polynomial($a, $avg) {
$r = array();
$v = "\$x-$avg";
foreach($a as $k=>$n) {
if($k == 0) $r[] = $n;
elseif($k == 1) $r[] = ($n > 0 ? '+' : '') . "$n*($v)";
else $r[] = ($n > 0 ? '+' : '') . "$n*pow($v, $k)";
}
echo join('', $r);
}对于你的题目有$ar = array( 28, 100, 38, 74, 61, 46, 153, 18 );
$r = Iapcir($ar, 2);
Polynomial($r['a'], $r['avg']);