alpha = $alpha;
$this->beta = $beta;
$this->gamma = $gamma;
$this->L = $L;
$this->series = $series;
$this->build_model();
}
// digunakan untuk perhitungan pemulusan, peramalan
private function build_model()
{
// Memanggil fungsi untuk menentukan nilai awal
$this->initialize_levels();
$this->initialize_trends();
$this->initialize_seasonals();
// fungsi untuk menghitung pemulusan dan peramalan
for ($i = $this->L; $i < count($this->series); $i++) {
$x = $this->series[$i];
$s0 = $this->seasonals[$i-$this->L];
$l0 = $this->levels[$i-1];
$t0 = $this->trends[$i-1];
// perhitungan rumus Lt, Bt, St
$l = $this->alpha * $x / $s0 + (1 - $this->alpha) * ($l0 + $t0);
$t = $this->beta * ($l - $l0) + (1 - $this->beta) * $t0;
$s = $this->gamma * ($x / $l) + (1 - $this->gamma) * $s0;
$this->levels[$i] = $l;
$this->trends[$i] = $t;
$this->seasonals[$i] = $s;
}
}
// digunakan untuk mengambil nilai dari perhitungan pemulusan tren
public function get_trens(){
return $this->trends;
}
// digunakan untuk mengambil nilai dari perhitungan pemulusan level
public function get_levels(){
return $this->levels;
}
// digunakan untuk mengambil nilai dari perhitungan pemulusan seasonal
public function get_seasonals(){
return $this->seasonals;
}
// fungsi digunakan untuk menginisialisasi nilai awal level
private function initialize_levels()
{
$this->levels = array();
$sum = 0;
for ($i = 0; $i < $this->L - 1; $i++) {
$this->levels[] = null;
$sum += $this->series[$i];
}
$sum += $this->series[$this->L-1];
$this->levels[] = $sum / $this->L;
// echo "
level". $sum / $this->L;
}
// fungsi digunakan untuk menginisialisasi nilai awal tren
private function initialize_trends()
{
$this->trends = array();
for ($i = 0; $i < $this->L - 1; $i++) {
$this->trends[] = null;
}
$y = 0;
$sum = 0;
for ($i = 0; $i < $this->L; $i++) {
$y = $this->L+$i;
$sum += ($this->series[$y]-$this->series[$i])/$this->L;
// echo "
series y".($y+1).": ". $this->series[$y];
// echo "
series i".($i+1).": ". $this->series[$i];
}
$nilaiAwal = $sum/$this->L;
$this->trends[] = $nilaiAwal;
}
// fungsi digunakan untuk menginisialisasi nilai awal seasonal
private function initialize_seasonals()
{
$this->seasonals = array();
for ($i = 0; $i < $this->L; $i++) {
$this->seasonals[] = $this->series[$i] / $this->levels[$this->L-1];
// echo "
sesional".$i .": ". $this->series[$i] / $this->levels[$this->L-1];
}
}
// Fungsi untuk mengolah peramalan periode bulan selanjutnya
public function forecast($k)
{
$m = $k - count($this->series) + 1;
if ($m <= 0) {
throw new Exception("Supposed to forecast future series");
}
// Rumus : (Lt+bt*m)*St-s+m
$i = count($this->series)-1;
$j = $i - $this->L + (($m-1) % $this->L) + 1;
// echo "
j : ". $j;
// echo "
m : ". $m . "
";
$forecast = ($this->levels[$i] + $m * $this->trends[$i]) * $this->seasonals[$j];
return $forecast;
}
// Fungsi ini digunakan untuk perhitungan peralaman pada data aktual bulan sebelumnya
public function get_forecast()
{
/*
Keterangan :
Lt = Pemulusan Level
Bt = Pemulusan Trend
St = Pemulusan Musiman
Ft+m = Peramalan untuk periode ke depan.
Rumus : (Lt+bt*m)*St-s+m
*/
$data = array();
$m = 1;
for ($i = 0; $i < count($this->series); $i++) {
$j = ($i)-$this->L;
if ($i>=$this->L) {
// echo "
lt".($i).": ". $this->levels[$i-1];
// echo "
btm".($i).": ". $this->trends[$i-1];
// echo "
sts".($i).": ". $this->seasonals[$j];
$forecast = ($this->levels[$i-1] + $m * $this->trends[$i-1]) * $this->seasonals[$j];
// echo "
ft".($i+1).": ". $forecast;
// echo "
";
$data[] = $forecast;
}else{
$data[] = null;
}
}
return $data;
}
}