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