using System; using System.Collections.Generic; using System.Text; namespace YOMIFrameWork.Common { /// /// 灰色预测 /// public class GrayModel { private static GrayModel _Instrance = null; public static GrayModel Instrance { get { if (_Instrance == null) return new GrayModel(); else return _Instrance; } } public double GetNext(List data) { //开始计算 //一次累加begin int number = data.Count; double[] aArray = new double[number];//原始数据 double[] bArray = new double[number];//一次累加的结果 for (int i = 0; i < number; i++) { aArray[i] = data[i]; } bArray[0] = aArray[0]; for (int x = 1; x < number; x++) { bArray[x] = bArray[x - 1] + aArray[x]; } //end //计算均值系列begin double[] cArray = new double[number]; //均值计算的结果 cArray[0] = 0.0; for (int x = 1; x < number; x++) { cArray[x] = bArray[x - 1] / 2 + bArray[x] / 2; } //end //计算C,D,E,F //计算C double[] dArray = new double[number]; dArray[1] = cArray[1]; for (int x = 1; x < number; x++) { dArray[x] = cArray[x] + dArray[x - 1]; } double C; C = dArray[number - 1]; //end //计算D double[] fArray = new double[number]; fArray[1] = aArray[1]; for (int x = 1; x < number; x++) { fArray[x] = aArray[x] + fArray[x - 1]; } double D; D = fArray[number - 1]; //end //计算E double[] gArray = new double[number]; gArray[1] = aArray[1] * cArray[1]; for (int x = 1; x < number; x++) { gArray[x] = aArray[x] * cArray[x] + gArray[x - 1]; } double E; E = gArray[number - 1]; //end //计算F double[] hArray = new double[number]; hArray[1] = cArray[1] * cArray[1]; for (int x = 1; x < number; x++) { hArray[x] = cArray[x] * cArray[x] + hArray[x - 1]; } double F; F = hArray[number - 1]; //end //计算a,b //计算发展系数a begin //textBox2.Text = ""; double a; a = (C * D - (number - 1) * E) / ((number - 1) * F - C * C); //textBox2.Text = a.ToString(); //end //计算灰作用量b begin //textBox3.Text = ""; double b; b = (D * F - C * E) / ((number - 1) * F - C * C); //textBox3.Text = b.ToString(); //end //计算q double q; q = b / a; //end //istBox4.Items.Clear(); double ssn1 = (aArray[0] - q) * Math.Exp(-a * (number)) + q; double ssn = (aArray[0] - q) * Math.Exp(-a * (number - 1)) + q; return (ssn1 - ssn); } } }