예제 #1
0
        /// <summary>
        /// Сравнение измерений
        /// </summary>
        /// <param name="baseData">базовое, статистически усреднённое измерение, содержащее данные о доверительном интервале</param>
        /// <param name="compared">сравниваемое измерение</param>
        /// <param name="timeCorrection">коррекция времени сравниваемого измерения</param>
        /// <returns>набор данных с некоторыми результатами</returns>
        public static Dictionary <string, object> Correspondence(MeasureData baseData, MeasureData compared, double timeCorrection)
        {
            Dictionary <string, object> result = new Dictionary <string, object>();
            string errorlog = "";

            if (baseData.IsMeasured || baseData.DispData == null)
            {
                errorlog += "Базовое измерение не является статистическим средним.";
                result.Add("ok", false);
                result.Add("errorlog", errorlog);
                return(result);
            }

            Dictionary <Sensor, List <double> > inSigma     = new Dictionary <Sensor, List <double> >();
            Dictionary <Sensor, List <double> > in3Sigma    = new Dictionary <Sensor, List <double> >();
            Dictionary <Sensor, List <double> > outOf3Sigma = new Dictionary <Sensor, List <double> >();

            foreach (Sensor sensor in baseData.Data.Keys)
            {
                if (compared.Data.ContainsKey(sensor))
                {
                    inSigma.Add(sensor, new List <double>());
                    in3Sigma.Add(sensor, new List <double>());
                    outOf3Sigma.Add(sensor, new List <double>());



                    foreach (PointD point in baseData.Data[sensor])
                    {
                        double time = point.X;
                        if (time >= 0d)
                        {
                            double value         = point.Y;
                            double dX            = baseData.DispData[sensor][time];
                            double comparedvalue = compared.GetDataAtTheMoment(compared.StartTime.AddSeconds(time - timeCorrection))[sensor];


                            if (Math.Abs(comparedvalue - value) < dX)
                            {
                                inSigma[sensor].Add(time);
                            }
                            else if (Math.Abs(comparedvalue - value) < 3 * dX)
                            {
                                in3Sigma[sensor].Add(time);
                            }
                            else
                            {
                                outOf3Sigma[sensor].Add(time);
                            }
                        }
                    }
                }
                else
                {
                    errorlog += "<<" + sensor.ToString() + ">> : не найден в измерении <<" + compared.ToString() + ">>";
                }
            }
            result.Add("ok", true);
            result.Add("errorlog", errorlog);
            result.Add("sigma", inSigma);
            result.Add("3sigma", in3Sigma);
            result.Add("unstable", outOf3Sigma);

            return(result);
        }
예제 #2
0
        /// <summary>
        /// отобразить сводку по измерению
        /// </summary>
        public void ShowReport()
        {
            string name = "Название: " + measureData.Name + "\r\n";

            richTextBox.Text          = "";
            richTextBox.SelectionFont = labelbld.Font;
            richTextBox.AppendText("Название: ");
            richTextBox.SelectionFont = labelnobld.Font;
            richTextBox.AppendText(measureData.Name + "\r\n");

            richTextBox.SelectionFont = labelbld.Font;
            richTextBox.AppendText("Начало измерения: ");
            richTextBox.SelectionFont = labelnobld.Font;
            richTextBox.AppendText(measureData.StartTime.ToString("dd/MM/yyyy HH:mm:ss") + "\r\n");
            richTextBox.AppendText("-------------------\r\n");

            Dictionary <Sensor, double> st = measureData.StartValues;

            foreach (Sensor sen in measureData.AllData.Keys)
            {
                richTextBox.SelectionFont = labelbld.Font;
                richTextBox.AppendText(sen.ToString() + ": \r\n");
                richTextBox.SelectionFont = labelnobld.Font;


                double max, maxt, min, mint, maxa, maxat;
                mint = maxt = maxat = -1d;

                min  = double.MaxValue;
                max  = double.MinValue;
                maxa = 0d;

                foreach (PointD p in measureData.AllData[sen])
                {
                    if (st[sen] - p.Y < min)
                    {
                        min = st[sen] - p.Y; mint = p.X;
                    }
                    if (st[sen] - p.Y > max)
                    {
                        max = st[sen] - p.Y; maxt = p.X;
                    }
                    if (Math.Abs(p.Y - st[sen]) > Math.Abs(maxa))
                    {
                        maxa = st[sen] - p.Y; maxat = p.X;
                    }
                }

                richTextBox.AppendText("    Базовая частота ν: " + st[sen].ToString("0.00") + " Гц\r\n");
                richTextBox.AppendText("    Минимум Δ: (" + mint.ToString("0.00") + " с; " + min.ToString("0.00") + " Гц)\r\n");
                richTextBox.AppendText("    Максимум Δ: (" + maxt.ToString("0.00") + " с; " + max.ToString("0.00") + " Гц)\r\n");
                richTextBox.AppendText("    Абс. максимум Δ: (" + maxat.ToString("0.00") + " с; " + maxa.ToString("0.00") + " Гц)\r\n");
            }

            if (measureData.DispData != null && measureData.DispData.Count > 0)
            {
                richTextBox.SelectionFont = labelbld.Font;
                richTextBox.AppendText("---------------------------\r\nЗначения доверительных интервалов:\r\n");
                richTextBox.SelectionFont = labelnobld.Font;

                Dictionary <Sensor, double> str = measureData.StartValues;

                foreach (Sensor s in measureData.DispData.Keys)
                {
                    richTextBox.SelectionFont = labelbld.Font;

                    richTextBox.AppendText(s.ToString() + ":\r\n");


                    double min = double.MaxValue;
                    double max = 0d;
                    double avg = 0d;

                    foreach (double d in measureData.DispData[s].Values)
                    {
                        if (max < d)
                        {
                            max = d;
                        }
                        if (min > d)
                        {
                            min = d;
                        }
                        avg += d;
                    }

                    avg /= measureData.DispData[s].Values.Count;
                    richTextBox.SelectionFont = labelbld.Font;
                    richTextBox.AppendText("  [минимум; ± " + min.ToString("0.00") + "]\r\n");
                    richTextBox.SelectionFont = labelbld.Font;
                    richTextBox.AppendText("  [максимум; ± " + max.ToString("0.00") + "]\r\n");
                    richTextBox.SelectionFont = labelbld.Font;
                    richTextBox.AppendText("  [среднее; ± " + avg.ToString("0.00") + "]\r\n");
                    richTextBox.SelectionFont = labelnobld.Font;

                    foreach (double d in measureData.DispData[s].Keys)
                    {
                        Dictionary <Sensor, double> di = measureData.GetDataAtTheMoment(measureData.StartTime.AddSeconds(d));

                        if (di.ContainsKey(s) && st.ContainsKey(s))
                        {
                            richTextBox.AppendText("    [" + d.ToString("0.00") + "; " + (str[s] - di[s]).ToString("0.00") + " ± " + measureData.DispData[s][d].ToString("0.00") + "]\r\n");
                        }
                    }
                }
            }
        }