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);
        }
    }
}