tripleExponentialSmoothingService.java
//一次指数平滑 y[]:待预测时间序列 n:取序列前n个数据平均数作为第一次平滑值 a:平滑因子 double[] onesExponentialSmoothingFunction(double y[], int n, double a) { double[] predictSeriesList = new double[17]; double s0 = 0.0; double si; for (int i = 0; i < n; i++) { s0 += y[i]; } s0 = s0/n; predictSeriesList[0] = s0; for (int i = 1; i < y.length; i++) { si = a * y[i] +(1-a) *s0; predictSeriesList[i] = si; s0 = si; } return predictSeriesList; } //三次指数平滑 public double[][] tripleExponentialSmoothingFunction(double y[],int n,double a) { //平滑函数列表 double[][] SmoothList = new double[3][y.length]; //一次平滑 double[] onesPredict = onesExponentialSmoothingFunction(y, n, a); //二次平滑:在一次平滑基础上再一次平滑 double[] twicePredict = onesExponentialSmoothingFunction(onesPredict, n, a); //三次平滑:在二次平滑基础上再一次平滑 double[] triplePredict = onesExponentialSmoothingFunction(twicePredict, n, a); //存进二维平滑值列表 SmoothList[0] = onesPredict; SmoothList[1] = twicePredict; SmoothList[2] = triplePredict; //返回平滑值列表 return SmoothList; }
triplePredictService.java
//三次指数平滑预测函数 ones[]:一次平滑结果 twice[]:二次平滑结果 triple[]三次平滑结果 // a 平滑因子 t 预测时间点 T 周期 public double TriplePredict(double ones[],double twice[],double triple[],double a,int t, int T){ //求t时刻的预测值应代入t-1时刻的平滑数 t = t - 1; //预测结果列表 double ytT ; //定义三次指数平滑预测公式的三个系数 double at,bt,ct; at = 3*ones[t] -3*twice[t]+ triple[t]; bt = a/(2*Math.sqrt(1-a))*((6-5*a)*ones[t]-2*(5-4*a)*twice[t]+(4-3*a)*triple[t]); ct = a*a/(2*Math.sqrt(1-a))*(ones[t]-2*twice[t]+triple[t]); //三次指数平滑预测 ytT = at + bt*T +ct*Math.sqrt(T); return ytT; }
testTripleFunction.java
public static void main(String[] args) { // tripleExponentialSmoothingService t = new tripleExponentialSmoothingService(); // triplePredictService p = new triplePredictService(); // double[] y = new double[]{4,6.4,8,9.22,9.5,9.7,9.86,10,10.32,10.42,10.5,10.55,10.58,10.6,10.1,10.34,10.2}; // double[][] predictList = t.tripleExponentialSmoothingFunction(y, 3, 0.8); // double predict = p.TriplePredict(predictList[0], predictList[1], predictList[2], 0.8, 10, 1); System.out.println(String.format("%.2f",predict));