132 lines
3.3 KiB
C#
132 lines
3.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace YOMIFrameWork.Common
|
|
{
|
|
/// <summary>
|
|
/// 灰色预测
|
|
/// </summary>
|
|
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<double> 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);
|
|
}
|
|
}
|
|
|
|
} |