首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言實現一階與二階指數平滑法預測

     編輯:C 語言問答

數學公式直接翻譯為 C 代碼

一階指數平滑 (SES)

平滑值:S_t = α·Y_t + (1-α)·S_{t-1}
預測:Ŷ_{t+1} = S_t

二階指數平滑 (DES / Holt 線性趨勢)

水平: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

C 結構體封裝

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;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved