class TrendLine {
private $arr;
private $k = 0;
private $b = 0;
private $num = 0;
public function __construct($arr) {
if(is_array($arr) && !empty($arr)) {
$this->num = count($arr);
foreach($arr as $k=>$v) {
$k = (string)($k+1);
$this->arr[$k] = $v;
}
}
}
private function squareSumX() {
$sum = 0;
foreach($this->arr as $k=>$v) {
$sum += pow($k, 2);
}
return $sum;
}
private function sumXY() {
$sum = 0;
foreach($this->arr as $k=>$v) {
$sum += $k * $v;
}
return $sum;
}
private function calculateKB() {
$sumx = array_sum(array_keys($this->arr));
$sumy = array_sum($this->arr);
$sumxy = $this->sumXY();
$sumxx = $this->squareSumX();
$this->k= round(($this->num*$sumxy-$sumx*$sumy)/($this->num*$sumxx-$sumx*$sumx), 4);
$this->b=round(($sumxx*$sumy-$sumx*$sumxy)/($this->num*$sumxx-$sumx*$sumx), 3);
return $this;
}
public function getKB() {
$this->calculateKB();
//趋势线 y=kx+b
return ['k'=>$this->k, 'b'=>$this->b];
}
}
$arr = [28.6,19.3,40.5,32.6,48.9,90,29.2,39.85,46.7,37.4];
$test = new TrendLine($arr);
var_dump($test->getKB());