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