毕设总结之绘制温度曲线图


需求:在ASP.NET中,从数据库中导出数据,规定时间内预测出下一个数据,然后蒋数据绘制折线图。

代码:

    public partial class Ware1 : System.Web.UI.Page
    {
        static string s = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["User"].ToString();
        DataClasses1DataContext ds = new DataClasses1DataContext(s);

        protected void Page_Load(object sender, EventArgs e)
        {//页面加载时,就开始显示该仓库中存在的货物信息
            DengJi DJ = new DengJi();
            WareHouse ware = new WareHouse();
            var num = from ware1 in ds.WareHouse where ware1.Wnumber == 1 && ware1.Snumber % 2 == 0 select ware1;
            if (num.Count() > 0)
            {
                    SqlConnection sd = new SqlConnection(s);
                    string str2 = "select Id,class,company,realnumber,accept_time,nphone,Snum,quality from Dengji where Wnum =" + 1+ " and Status = '在库'";
                    SqlDataAdapter sda = new SqlDataAdapter(str2, sd);
                    DataSet ds = new DataSet();
                    sda.Fill(ds, "DengJi");
                    GridView1.DataSource = ds.Tables[0].DefaultView;
                    GridView1.DataBind();
                    GridView1.HeaderRow.Cells[0].Text = "ID";
                    GridView1.HeaderRow.Cells[1].Text = "种类";
                    GridView1.HeaderRow.Cells[2].Text = "公司名称";
                    GridView1.HeaderRow.Cells[3].Text = "入库数量";
                    GridView1.HeaderRow.Cells[4].Text = "入库时间";
                    GridView1.HeaderRow.Cells[5].Text = "客户电话";
                    GridView1.HeaderRow.Cells[6].Text = "货架号";
                    GridView1.HeaderRow.Cells[7].Text = "货损率";

            }
            else
            {
                
            }
            
        }

        protected void Button1_Click(object sender, EventArgs e)//更改温度 、湿度、风速的值
        {
            Temple temple = new Temple();
            var num1 = ds.Temple.Count();
            temple.Id = num1 + 1;
            temple.xname = System.DateTime.Now;
            temple.ytem = double.Parse(DropDownList1.SelectedItem.Text);
            temple.yhumidity = double.Parse(DropDownList2.SelectedItem.Text);
            temple.ywind = double.Parse(DropDownList3.SelectedItem.Text);
            ds.Temple.InsertOnSubmit(temple);
            ds.SubmitChanges();
        }

        public class GrayModel//灰色预测模型
        {
            private double a0, a1, a2;
            private int size;//定义数组长度
            private double error;
            public GrayModel()
            {

            }
            public void build(double[] Str)
            {
                size = Str.Length;//获取数组Str长度
                double[] Str1 = new double[size];//新建一个长度与以知数组长度一致的数组Str1
                Str1[0] = Str[0];//把给定数组的第一个元素赋给数组Str1
                for (int i = 1; i < size; i++)
                {
                    Str1[i] = Str[i] + Str1[i - 1];//获取新的数组值,也就是AGO计算
                }
                double[,] a = new double[size - 1, 2];//生成二维数组a
                double[,] bt = new double[2, size - 1];//生成二维数组bt
                double[,] y = new double[size - 1, 1];//生成一维数组y
                for (int i = 0; i < a.GetLength(0); i++)//GetLength(0)是获取行数
                {
                    a[i, 0] = -(Str1[i] + Str1[i + 1]) / 2;
                    a[i, 1] = 1;
                    bt[0, i] = a[i, 0];
                    bt[1, i] = 1;
                    y[i, 0] = Str[i + 1];
                }
                double[,] t = new double[2, 2];//新建矩阵t
                multiply(bt, a, t);//矩阵bt,a相乘,最后返回矩阵t
                t = inverse(t);//获取矩阵t的转置矩阵
                double[,] t1 = new double[2, size - 1];//新建矩阵t1
                multiply(t, bt, t1);
                double[,] t2 = new double[2, 1];//新建矩阵t2
                multiply(t1, y, t2);
                a0 = t2[0, 0];
                double u = t2[1, 0];
                a2 = u / a0;
                a1 = Str[0] - a2;
                a0 = -a0;

                error = 0;
                for (int i = 0; i < Str.Length; i++)
                {
                    double d = (Str[i] - GetStr(i));
                    error += d * d;
                }
                error /= Str.Length;
            }

            public double GetError()//误差
            {
                return error;
            }

            double GetStr1(int k)
            {
                return a1 * Math.Exp(a0 * k) + a2;
            }

            double GetStr(int k)//返回a0 * a1 * Math.exp(a0 * k);
            {   
                if (k == 0)
                    return double.Parse((a1 * Math.Exp(a0 * k) + a2).ToString("0.0"));
                else
                    return double.Parse((a1 * (Math.Exp(a0 * k) - Math.Exp(a0 * (k - 1)))).ToString("0.0"));
            }

            public double NextValue(int index)//预测后续的值
            {
                if (index < 0)
                    throw new Exception("超出索引范围");
                return GetStr(size + index);
            }

            public double nextValue()//返回预测值
            {
                return NextValue(0);
            }

            static double[,] inverse(double[,] t)//求矩阵t的逆矩阵
            {
                double[,] a = new double[2, 2];
                double det = t[0, 0] * t[1, 1] - t[0, 1] * t[1, 0];
                a[0, 0] = t[1, 1] / det;
                a[0, 1] = -t[1, 0] / det;
                a[1, 0] = -t[0, 1] / det;
                a[1, 1] = t[0, 0] / det;
                return a;
            }

            static void multiply(double[,] left, double[,] right, double[,] dest)//两个矩阵相乘
            {
                int first1 = left.GetLength(0);//获取第一个数组的第一维长度,也就是行数
                int first2 = left.GetLength(1);//获取第一个数组的二维长度,也就是列数
                int second1 = right.GetLength(1);//获取第二个数组的列数
                for (int k = 0; k < first1; k++)
                {
                    for (int j = 0; j < second1; j++)
                    {
                        dest[k, j] = 0;
                        for (int i = 0; i < first2; i++)
                        {
                            dest[k, j] += left[k, i] * right[i, j];
                        }
                    }
                }
            }
        }

        protected void Timer1_Tick(object sender, EventArgs e)
        {
            //绘制图表
            Chart1.ChartAreas["ChartArea1"].AxisY.Maximum = System.Double.NaN;
            Chart1.ChartAreas["ChartArea1"].AxisY.Minimum = System.Double.NaN;
            //Chart1.ChartAreas["ChartArea1"].AxisX.Interval = 5;
            Series series = new Series("温度");//设置图表类型,绘制温度表
            series.ChartType = SeriesChartType.Line;//设置曲线样式
            Temple temple = new Temple();
            series.BorderWidth = 1;//线粗
            series.ShadowOffset = 1;
            int i = 0;
            int j = 0;
            var temple1 = from r in ds.Temple
                          where r.Id > ds.Temple.Max(p => p.Id) - 10
                          //orderby r.Id descending
                          select r.ytem;
            //从数据库中获取10个数字
            //var tem = from r in ds.Temple select r.ytem;//查找温度值,在点上表明数字
            foreach (var templ1 in temple1)
            {
                series.Points.AddY(templ1);
                series.Points[i].Label = templ1.ToString();
                i++;
            }//将温度值作为y值,并且在该点标识出温度值
            var xna = from r in ds.Temple
                      where r.Id > ds.Temple.Max(p => p.Id) - 10
                      //orderby r.Id descending
                      select r.xname;//查找时间值
            foreach (var xna12 in xna)
            {
                series.Points[j].AxisLabel = xna12.ToString(); ;
                j++;
            }//将时间值作为x轴的值

            Series series1 = new Series("风速");//绘制风速图
            series1.ChartType = SeriesChartType.Spline;//曲线样式
            series1.BorderWidth = 1;
            series1.ShadowOffset = 1;
            int a = 0;
            var wind = from r in ds.Temple
                       where r.Id > ds.Temple.Max(p => p.Id) - 10
                       //orderby r.Id descending
                       select r.ywind;

            //var win = from r in ds.Temple select r.ywind;//y的值
            foreach (var wind1 in wind)
            {
                series1.Points.AddY(wind1);
                series1.Points[a].Label = wind1.ToString();
                a++;
            }//获取y的值,并显示出y值

            Series series2 = new Series("湿度");//绘制湿度图
            series2.ChartType = SeriesChartType.Spline;
            series2.BorderWidth = 1;
            series2.ShadowOffset = 1;
            int c = 0;
            var humity1 = from r in ds.Temple
                          where r.Id > ds.Temple.Max(p => p.Id) - 10
                          //orderby r.Id descending
                          select r.yhumidity;

            //var hum1 = from h in ds.Temple select h.yhumidity;//y的值
            foreach (var h1 in humity1)
            {
                series2.Points.AddY(h1);
                series2.Points[c].Label = h1.ToString();
                c++;
            }


            series1.YAxisType = AxisType.Primary;
            Chart1.Series.Add(series);
            Chart1.Series.Add(series1);
            Chart1.Series.Add(series2);//在图表中显示出曲线

            //进行预测数据的前期获取
            Temple tem1 = new Temple();
            var temp1 = from r in ds.Temple
                        where r.Id > ds.Temple.Max(p => p.Id) - 20
                        select new
                        {
                            ytem1=r.ytem,
                            win1=r.ywind,
                            hum1=r.yhumidity
                        };
            

            //List array = new List();
            double[] array = new double[0];//新建数组
            foreach (var num1 in temp1)
            {
                double p = num1.ytem1;
                array = array.Concat(new double[] { p }).ToArray();
                                
            }//将获取的数据保存在array中

            double[] array1 = new double[0];
            foreach (var num2 in temp1)
            {
                array1 = array1.Concat(new double[] { num2.win1 }).ToArray();

            }

            double[] array2 = new double[0];
            foreach(var num3 in temp1)
            {
                array2 = array2.Concat(new double[] { num3.hum1 }).ToArray();
            }

            //预测数据的计算
            GrayModel gm = new GrayModel();//调用灰色预测模型进行温度数据预测
            gm.build(array);
            tem1.ytem = gm.nextValue();
            GrayModel gm1 = new GrayModel();
            gm1.build(array1);
            tem1.ywind = gm1.nextValue();
            GrayModel gm2 = new GrayModel();
            gm2.build(array2);
            tem1.yhumidity = gm2.nextValue();
            var q = ds.Temple.Count();
            tem1.Id = q + 1;
            tem1.xname = System.DateTime.Now;
            ds.Temple.InsertOnSubmit(tem1);//将时间,学列,温度,湿度,风速数据保存在数据库中
            ds.SubmitChanges();
            
           // this.Label1.Text = System.DateTime.Now.ToString();
        }

上面代码的说明:从数据库中获取了指定数量 的数据,然后使用灰色预测模型预测出新的数据,最后将显示出10个数据的折线图。