平滑值:S_t = α·Y_t + (1-α)·S_{t-1}
預測:Ŷ_{t+1} = S_t
水平:S_t = α·Y_t + (1-α)·(S_{t-1} + b_{t-1})
趨勢:b_t = β·(S_t - S_{t-1}) + (1-β)·b_{t-1}
預測:Ŷ_{t+m} = S_t + m·b_t
typedef struct {
double alpha, beta; // 平滑參數 0~1
double level, trend; // 狀態變數
int initialized;
} DES_Model;
void des_init(DES_Model *m, double alpha, double beta, double y0, double y1)
{
m->alpha = alpha; m->beta = beta;
m->level = y0;
m->trend = y1 - y0;
m->initialized = 1;
}
double des_update(DES_Model *m, double y)
{
if (!m->initialized) return 0;
double prev_level = m->level;
m->level = m->alpha * y + (1 - m->alpha) * (m->level + m->trend);
m->trend = m->beta * (m->level - prev_level) + (1 - m->beta) * m->trend;
return m->level; // 一步預測值
}
double des_forecast(const DES_Model *m, int h)
{
return m->level + h * m->trend;
}
int main()
{
double data[] = {100, 105, 103, 110, 108, 115};
DES_Model m;
des_init(&m, 0.3, 0.1, data[0], data[1]);
for (size_t i = 0; i < sizeof(data)/sizeof(double); i++) {
double pred = des_update(&m, data[i]);
printf("t=%zu 實際=%.1f 平滑=%.1f 趨勢=%.1f\n", i, data[i], m.level, m.trend);
}
printf("下一期預測: %.1f\n", des_forecast(&m, 1));
return 0;
}