同志们求一算法 
已知以下数据
x值  -->   结果(大于0)
28   -->    100
38   -->    74
61   -->    46
153  -->    18
无限大-->无限接近0(但不等于0)
求公式,越简单越好。

解决方案 »

  1.   

    曲线拟合?
    一次多项式 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)
      

  2.   

    计算拟合参数,从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']);