指数平滑法预测二次指数平滑 C++代码
时间: 2023-09-14 17:12:03 浏览: 161
二次指数平滑及其时间序列预测代码.txt
以下是C++实现的二次指数平滑预测算法:
```c++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
double alpha = 0.2; // 一次平滑系数
double beta = 0.2; // 二次平滑系数
double gamma = 0.2; // 季节性指数平滑系数
int m = 4; // 季节性周期
vector<double> double_exponential_smoothing(vector<double>& data) {
int n = data.size();
vector<double> s(n, 0); // 一次平滑序列
vector<double> b(n, 0); // 二次平滑序列
vector<double> i(n, 0); // 季节性指数序列
vector<double> yhat(n, 0); // 预测序列
// 初始化
s[0] = data[0];
for (int j = 1; j < m + 1; j++) {
i[0] += data[j] - data[j - 1];
}
i[0] /= m;
for (int t = 1; t < n; t++) {
// 一次平滑
if (t < m) {
s[t] = (data[t] + data[t - 1]) / 2;
} else {
s[t] = alpha * data[t] + (1 - alpha) * (s[t - 1] + i[t - m]);
}
// 二次平滑
if (t == 1) {
b[1] = s[1] - s[0];
} else {
b[t] = beta * (s[t] - s[t - 1]) + (1 - beta) * b[t - 1];
}
// 季节性指数
if (t < m + 1) {
i[t] = (data[t] - data[t - 1]) / s[t];
} else {
i[t] = gamma * (data[t] - s[t - 1] - b[t - 1]) + (1 - gamma) * i[t - m];
}
// 预测
yhat[t] = s[t - 1] + b[t - 1] + i[t - m];
}
return yhat;
}
int main() {
vector<double> data = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300};
vector<double> yhat = double_exponential_smoothing(data);
for (int i = 0; i < yhat.size(); i++) {
cout << "yhat[" << i << "] = " << yhat[i] << endl;
}
return 0;
}
```
其中,`data`是原始数据序列,`alpha`、`beta`和`gamma`分别是一次平滑系数、二次平滑系数和季节性指数平滑系数,`m`是季节性周期。
函数`double_exponential_smoothing`返回预测序列`yhat`。
阅读全文