/// <summary> /// получить статистический ряд по заданным значениям и заданным градациям /// </summary> /// <param name="tempr"></param> /// <param name="rhumb8Gradations"></param> /// <returns></returns> public static StatisticalRange <WindDirections8> GetDirectionExpectancy(RawRange tempr, GradationInfo <WindDirections8> rhumb8Gradations) { List <double> spds = new List <double>(from t in tempr select t.Direction); StatisticalRange <WindDirections8> r = new StatisticalRange <WindDirections8>(spds, rhumb8Gradations); return(reorganizeCalm(r)); }
/// <summary> /// обработать ряд и получить характеристики по всему ряду /// </summary> /// <param name="range"></param> /// <param name="totalRange"></param> /// <returns></returns> public static EnergyInfo ProcessRange(RawRange range, RawRange totalRange = null) { double density = range.AirDensity; totalRange = totalRange ?? range; if (range.Count == 0) { return(null); } EnergyInfo res = new EnergyInfo(); res.FromDate = range[0].Date; res.ToDate = range.Last().Date; res.PowerDensity = getAveragePower(range, density); res.V0 = getAverageSpeed(range); res.StandardDeviationSpeed = getSigmV(res.V0, range); res.Vmax = getMaxSpeed(range); res.Vmin = getMinSpeed(range); res.EnergyDensity = res.PowerDensity * 8760d; res.Cv = res.StandardDeviationSpeed / res.V0; res.VeybullGamma = getVeybullGamma(res.Cv); res.VeybullBeta = getVeybullBeta(res.V0, res.VeybullGamma); res.ExtremalSpeed = getExtremalSpeed(res.V0, res.VeybullGamma); res.ExpectancyDeviation = getExpectancyDeviation(range, totalRange); return(res); }
/// <summary> /// выбор расчетного года /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void toolStripMenuItemCalcYear_Click(object sender, EventArgs e) { RawRange rang = (mainTabControl.SelectedTab as TabPageExt).Range; FormCalcYear fei = new FormCalcYear(rang); fei.Show(this); }
/// <summary> /// обновление информации в статусной строке в соответствии с выбранной вкладкой /// </summary> internal void RefreshStatusBar() { if (f.mainTabControl.SelectedTab != null) { RawRange rang = (f.mainTabControl.SelectedTab as TabPageExt).Range; if (rang.Quality != null) { f.toolStripStatusLabelRangeCount.Text = "Количество измерений: " + rang.Count; f.toolStripStatusLabelCompletness.Text = "Полнота ряда: " + (rang.Quality.Completeness * 100).ToString("0.00") + "%"; f.toolStripStatusLabelInterval.Text = "Интервал: " + (rang.Quality.Intervals.Count == 1 ? rang.Quality.Intervals[0].Interval.Description() : "Неоднородный ряд"); } else { f.toolStripStatusLabelRangeCount.Text = ""; f.toolStripStatusLabelCompletness.Text = ""; f.toolStripStatusLabelInterval.Text = ""; } } else { f.toolStripStatusLabelRangeCount.Text = ""; f.toolStripStatusLabelCompletness.Text = ""; f.toolStripStatusLabelInterval.Text = ""; } }
private void gmapControlMap_OnMarkerClick(GMapMarker item, MouseEventArgs e) { item = item ?? throw new ArgumentNullException(nameof(item)); if (item.Tag.GetType() != typeof(RP5MeteostationInfo)) { return; } RP5MeteostationInfo mi = (RP5MeteostationInfo)item.Tag; if (IsDialog) { Result = mi; DialogResult = DialogResult.OK; Close(); } else { FormLoadFromRP5 frm = new FormLoadFromRP5(mi); if (frm.ShowDialog(this) == DialogResult.OK) { RawRange res = frm.Result; WindEnergy.UI.Ext.TabPageExt tab = Program.winMain.mainTabControl.OpenNewTab(res, res.Name); tab.HasNotSavedChanges = true; _ = Program.winMain.Focus(); } } }
public FormLoadFromNASA(PointLatLng selectedPoint) { InitializeComponent(); Result = null; DialogResult = DialogResult.None; geocoder = new Arcgis(Vars.Options.CacheFolder + "\\arcgis"); comboBoxSpeedHeight.Items.AddRange(NasaWindSpeedHeight.WS10M.GetItems().ToArray()); comboBoxSpeedHeight.SelectedItem = NasaWindSpeedHeight.WS10M.Description(); point = selectedPoint; if (point.IsEmpty) //если точка пустая, то надо попробовать взять из последних { point = Vars.Options.LoadNasaLastPoint; } if (!point.IsEmpty) { spoint = new RP5MeteostationInfo(); spoint.Position = point; labelPointCoordinates.Text = $"Широта: {point.Lat:0.000} Долгота: {point.Lng:0.000}"; loadAddressAsync(point); buttonDownload.Enabled = true; dateTimePickerFromDate.Enabled = true; dateTimePickerToDate.Enabled = true; } }
/// <summary> /// возвращает относительные среднемесячные скорости по месяцам для многолетнего ряда /// </summary> /// <param name="range"></param> /// <param name="allMonth">истина, если в ряде представлены не все месяцы года</param> /// <returns></returns> private static Dictionary <Months, double> getRelativeAverageMonthSpeeds(RawRange range, out bool allMonth) { double rAverage = range.Average((item) => { return(item.Speed); }); //средняя скорость во всем ряде на МС Dictionary <Months, double> msRelatives = new Dictionary <Months, double>(); //относительные скорости по месяцам на МС allMonth = true; for (int m = 1; m <= 12; m++) { Months month = (Months)m; double mAverage = double.NaN; var r = from t in range where t.Date.Month == m select t.Speed; if (r.Count() == 0) { allMonth = false; mAverage = 0; } else { mAverage = r.Average(); } msRelatives.Add(month, mAverage / rAverage);//относительная скорость = среднемесячная скорость / средняя скорость ряда } return(msRelatives); }
/// <summary> /// расчитать основные энергетические характеристики /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void calculateEnergyInfoToolStripMenuItem_Click(object sender, EventArgs e) { RawRange rang = (mainTabControl.SelectedTab as TabPageExt).Range; FormEnergyInfo fei = new FormEnergyInfo(rang); fei.Show(this); }
/// <summary> /// приведение ряда к условиям плоской местности /// </summary> /// <param name="ms_range">ряд</param> /// <param name="expectancy">повторяемости направлений ветра</param> /// <param name="ms_classes">классы открытости МС</param> /// <param name="water_type">расстояние до водной поверхности</param> /// <returns></returns> public static RawRange ToFlatTerrain(RawRange ms_range, StatisticalRange <WindDirections8> expectancy, Dictionary <WindDirections8, double> ms_classes, WaterDistanceType water_type) { //1. найти Кмс //2. пересчитать ряд RawRange result = new RawRange(); double K0 = (int)water_type; //средневзвешенный коэффициент открытости метеостанции double Kms = 0; foreach (WindDirections8 dir in WindDirections8.N.GetEnumItems()) { if (dir != WindDirections8.Calm && dir != WindDirections8.Undefined && dir != WindDirections8.Variable) { Kms += expectancy[dir] * ms_classes[dir]; } } double k0 = K0 / Kms; result.BeginChange(); foreach (RawItem item in ms_range) { RawItem ni = item.Clone(); ni.Speed = item.Speed * k0; result.Add(ni); } result.EndChange(); return(result); }
/// <summary> /// сохранение файла в формате CSV /// </summary> /// <param name="rang"></param> /// <param name="filename"></param> internal override void SaveRange(RawRange rang, string filename) { StreamWriter sw = new StreamWriter(filename, false, Encoding.UTF8); string coordinates = rang.Position.Lat.ToString("0.000000") + " " + rang.Position.Lng.ToString("0.000000"); string caption = "Местное время;T;U;DD;ff;P0"; string title; if (rang.Meteostation == null) { title = "ID=undefined"; } else { title = $"ID={rang.Meteostation.ID}"; } sw.WriteLine(title); sw.WriteLine(coordinates); sw.WriteLine(rang.Name); sw.WriteLine(caption); foreach (RawItem item in rang) { if (double.IsNaN(item.Speed)) { continue; } sw.WriteLine($"{item.Date:dd.MM.yyyy HH:mm};{item.Temperature};{item.Wetness};{item.Direction};{item.Speed};{item.Pressure}"); } sw.Close(); }
public FormRepairRange(RawRange range, List <InterpolateMethods> methods, string caption, string buttonText) { methods = methods ?? throw new ArgumentNullException(nameof(methods)); InitializeComponent(); this.range = range; this.availableMethods = methods; this.Text = caption; this.groupBoxMain.Text = caption; this.buttonRepairRange.Text = buttonText; comboBoxInterpolateMethod.Items.Clear(); foreach (var item in availableMethods) { _ = comboBoxInterpolateMethod.Items.Add(item.Description()); } comboBoxRepairInterval.Items.Clear(); foreach (var item in StandartIntervals.H1.GetEnumItems()) { if ((StandartIntervals)item != StandartIntervals.Variable && (StandartIntervals)item != StandartIntervals.Variable) { _ = comboBoxRepairInterval.Items.Add(item.Description()); } } }
/// <summary> /// загружает ряд наблюдений с ближайшей МС /// </summary> /// <param name="from">начало ряда</param> /// <param name="to">конец ряда</param> /// <param name="coordinates">координаты исходного ряда</param> /// <returns></returns> private static RawRange getNearestRange(DateTime from, DateTime to, PointLatLng coordinates) { if (from > to) { throw new WindEnergyException("Дата from больше, чем to"); } RawRange res = null; RP5MeteostationInfo nearestMS = Vars.RP5Meteostations.GetNearestMS(coordinates); if (nearestMS == null) { throw new Exception("Не удалось найти ближайшую метеостанцию в заданном радиусе"); } RP5ru provider = new RP5ru(Vars.Options.CacheFolder + "\\rp5.ru"); provider.GetMeteostationExtInfo(ref nearestMS); if (from < nearestMS.MonitoringFrom) //если исходный ряд начинается { from = nearestMS.MonitoringFrom; } if (from > to) { throw new Exception("Ряды не пересекаются: один из рядов заканчивается раньше, чем начинается другой"); } res = provider.GetRange(from, to, nearestMS); return(res); }
/// <summary> /// проверка на соответствие нормальному закону распределния ряда. озвращая критерий согласия Пирсона для этого ряда /// http://www.ekonomstat.ru/kurs-lektsij-po-teorii-statistiki/403-proverka-sootvetstvija-rjada-raspredelenija.html /// https://life-prog.ru/2_84515_proverka-po-kriteriyu-hi-kvadrat.html критерий пирсона /// https://math.semestr.ru/group/example-normal-distribution.php для нормального распределения /// </summary> /// <param name="range">ряд</param> /// <param name="parameter">проверяемый параметр</param> /// <returns></returns> private static double checkNormalLaw(RawRange range, MeteorologyParameters parameter) { GradationInfo <GradationItem> grads; switch (parameter) { case MeteorologyParameters.Speed: grads = new GradationInfo <GradationItem>(0, SPEED_GRADATION_STEP, range.Max((item) => { return(item.Speed); })); //градации скорости break; case MeteorologyParameters.Direction: StatisticalRange <WindDirections16> srwd = StatisticEngine.GetDirectionExpectancy(range, GradationInfo <WindDirections16> .Rhumb16Gradations); return(0); case MeteorologyParameters.Temperature: grads = new GradationInfo <GradationItem>(0, TEMPERATURE_GRADATION_STEP, range.Max((item) => { return(item.Temperature); })); //градации температуры break; case MeteorologyParameters.Wetness: grads = new GradationInfo <GradationItem>(0, WETNESS_GRADATION_STEP, range.Max((item) => { return(item.Wetness); })); //градации влажности break; default: throw new WindEnergyException("Этот параметр не реализован"); } //РАСЧЕТ ДЛЯ ВСЕХ, КРОМЕ НАПРАВЛЕНИЙ StatisticalRange <GradationItem> stat_range = StatisticEngine.GetExpectancy(range, grads, parameter); //статистический ряд // TODO: расчет критерия пирсона для ряда return(0); }
/// <summary> /// 获取范围内的数据 /// </summary> /// <param name="self"></param> /// <param name="range"></param> /// <returns></returns> public static RawData GetRangeRawData(this RawData self, RawRange range) { if (range.width > self.width || (range.beginColumn + range.width) > self.width) { throw new System.Exception($"\"{range.width}\"超过\"{self.width}\""); } if (range.height > self.height || (range.beginRow + range.height) > self.height) { throw new System.Exception($"\"{range.height}\"超过\"{self.height}\""); } var data = new string[range.width, range.height]; var columnIndex = 0; var rowIndex = 0; for (var y = range.beginRow; y < range.beginRow + range.height; y++) { columnIndex = 0; for (var x = range.beginColumn; x < range.beginColumn + range.width; x++) { data[columnIndex, rowIndex] = self[x, y]; columnIndex++; } rowIndex++; } return(new RawData(data)); }
/// <summary> /// создаёт новое окно с заданным рядом наблюдений /// </summary> /// <param name="rang"></param> public FormRangeStatistic(RawRange rang) { rang = rang ?? throw new ArgumentNullException(nameof(rang)); InitializeComponent(); dataGridViewExt1.DefaultCellStyle.WrapMode = DataGridViewTriState.True; Text = rang.Name + " - Статистика ряда"; range = rang; }
public FormRangeTerrain(RawRange range) { InitializeComponent(); this.range = range; scintillaRecommendations.StyleResetDefault(); scintillaRecommendations.Styles[Style.Default].Size = 11; scintillaRecommendations.StyleClearAll(); }
/// <summary> /// возвращает отклонение повторямости скорости от среднемноголетней /// </summary> /// <param name="range"></param> /// <param name="totalRange"></param> /// <returns></returns> private static double getExpectancyDeviation(RawRange range, RawRange totalRange) { StatisticalRange <GradationItem> exp = GetExpectancy(totalRange, Vars.Options.CurrentSpeedGradation); double averSpeed = totalRange.Average((t) => t.Speed); DeviationsInfo dinfo = ProcessRangeDeviations(range, averSpeed, exp); return(dinfo.ExpDeviation); }
/// <summary> /// создать новый документ /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void createNewToolStripMenuItem_Click(object sender, EventArgs e) { RawRange r = new RawRange(); r.Name = "Новый документ"; TabPageExt tab = mainTabControl.OpenNewTab(r); tab.HasNotSavedChanges = true; }
/// <summary> /// открыть новую вкладку с заданным рядом /// </summary> /// <param name="range">ряд данных для отображения</param> /// <param name="text">заголовок вкладки</param> internal TabPageExt OpenNewTab(RawRange range, string text = "Новый документ") { TabPageExt ntab = new TabPageExt(range, text); this.TabPages.Add(ntab); this.SelectedTab = ntab; Program.winMain.mainHelper.RefreshStatusBar(); return(ntab); }
public FormRangeElevator(RawRange range) { range = range ?? throw new ArgumentNullException(nameof(range)); InitializeComponent(); this.range = range; textBoxFromHeight.Text = double.IsNaN(range.Height) ? "10" : range.Height.ToString(); refreshOptionsText(); }
private void buttonSave_Click(object sender, EventArgs e) { Range.Name = textBoxName.Text; Range.Height = Convert.ToDouble(numericUpDownHeight.Value); Range.Position = this.selectedPosition; DialogResult = DialogResult.OK; Result = Range; Close(); }
public FormRangeProperties(RawRange range) { this.Range = range ?? throw new ArgumentNullException(nameof(range)); selectedPosition = range.Position; InitializeComponent(); buttonIntervals.Enabled = range.Quality != null; }
/// <summary> /// обновление всех элементов в соответствии с выбранными параметрами /// </summary> private void refreshInfo() { RawRange tempr = range.GetRange( radioButtonSelectPeriod.Checked, radioButtonSelectYearMonth.Checked, dateTimePickerFrom.Value, dateTimePickerTo.Value, comboBoxYear.SelectedItem, comboBoxMonth.SelectedItem ); if (tempr == null) { throw new Exception("что-то совсем не так!!"); } //расчет параметров try { range_info = StatisticEngine.ProcessRange(tempr, range); stat_speeds = StatisticEngine.GetExpectancy(tempr, Vars.Options.CurrentSpeedGradation); stat_directions = StatisticEngine.GetDirectionExpectancy(tempr, GradationInfo <WindDirections16> .Rhumb16Gradations); exp_info = StatisticEngine.ProcessRange(stat_speeds); } catch (Exception ex) { _ = MessageBox.Show(this, ex.Message, "Расчёт энергетических характеристик", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (range_info == null || exp_info == null) { _ = MessageBox.Show(this, "Для заданного ряда невозможно расчитать характеристики на выбранном интервале", "Расчёт энергетических характеристик", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } //вывод параметров labelEnergyDensity.Text = (range_info.EnergyDensity / 1000).ToString("0.00") + " кВт*ч/м^2"; labelPowerDensity.Text = range_info.PowerDensity.ToString("0.00") + " Вт/м^2"; labelCv.Text = range_info.Cv.ToString("0.000"); labelV0.Text = range_info.V0.ToString("0.0") + " м/с"; labelExtremalSpeed.Text = range_info.ExtremalSpeed.ToString("0.0") + " м/с"; labelVmax.Text = range_info.Vmax.ToString("0.0") + " м/с"; labelVmin.Text = range_info.Vmin.ToString("0.0") + " м/с"; labelStandardDeviationSpeed.Text = range_info.StandardDeviationSpeed.ToString("0.000") + " м/с"; labelGamma.Text = range_info.VeybullGamma.ToString("0.000"); labelBeta.Text = range_info.VeybullBeta.ToString("0.000") + " м/с"; labelAirDensity.Text = tempr.AirDensity.ToString("0.000") + " кг/м^3" + (Vars.Options.CalculateAirDensity ? " (расчёт)" : ""); labelEnergyDensityTV.Text = (exp_info.EnergyDensity / 1000).ToString("0.00") + " кВт*ч/м^2"; labelPowerDensityTV.Text = exp_info.PowerDensity.ToString("0.00") + " Вт/м^2"; labelCvTV.Text = exp_info.Cv.ToString("0.000"); labelV0TV.Text = exp_info.V0.ToString("0.0") + " м/с"; labelGammaTV.Text = exp_info.VeybullGamma.ToString("0.000"); labelBetaTV.Text = exp_info.VeybullBeta.ToString("0.000") + " м/с"; }
/// <summary> /// проверяет скорости и направления в заданном ряду на соответствие нормальному закону распределения. /// Возвращает false если ряд не соответствует /// </summary> /// <param name="baseRange">проверяемый ряд</param> /// <param name="acceptDiapason">допустимый диапазон</param> /// <returns></returns> internal static bool CheckNormalLaw(RawRange baseRange, Diapason <double> acceptDiapason) { return(true); double Xi_speed = checkNormalLaw(baseRange, MeteorologyParameters.Speed); double Xi_dir = checkNormalLaw(baseRange, MeteorologyParameters.Direction); double f = Math.Max(Xi_dir, Xi_speed); //максимально расхождение return(acceptDiapason.From < f && acceptDiapason.To > f); }
/// <summary> /// проверить ряд и устранить ошибки /// </summary> /// <param name="range">ряд</param> /// <param name="param">параметры обработки ошибок</param> /// <param name="info">результаты проверки ряда</param> /// <param name="action">действие, при изменении провенца выполнения</param> /// <returns></returns> public RawRange ProcessRange(RawRange range, CheckerParameters param, out CheckerInfo info, Action <double> action = null) { this.action = action; this.totalCount = range.Count; switch (param.LimitsProvider) { case LimitsProviders.Manual: if (param.Coordinates.IsEmpty && param.CheckByPos) { throw new ArgumentException("Ряд не содержит информацию о координатах"); } else { provider = new ManualLimits(param.DirectionInclude, param.SpeedInclude); } break; case LimitsProviders.StaticLimits: provider = new StaticRegionLimits(Vars.SpeedLimits.Dictionary, param.Coordinates); break; default: throw new Exception("Этот провайдер не реализован"); } Parallel.ForEach(range, new ParallelOptions(), (item) => { incrementCount(); bool accepted = checkItem(item); if (accepted) { item = restoreItem(item); resultCollection.Add(item); } }); RawRange res = new RawRange(resultCollection.OrderBy(new Func <RawItem, double>((item) => { return(item.DateArgument); }))) { Height = range.Height, Position = range.Position, Meteostation = range.Meteostation, FilePath = range.FilePath, Name = "Исправленный ряд. " + range.Name }; info = new CheckerInfo() { DateRepeats = repeats, OtherErrors = other, OverLimits = lims, Remain = res.Count, Total = range.Count }; return(res); }
public void FirstVerseStringTest() { RawRange target = new RawRange(); string expected = null; string actual; target.FirstVerseString = expected; target.FirstVerseSuffix = null; actual = target.FirstVerseString; Assert.AreEqual(expected, actual); }
/// <summary> /// создаёт новое окно с заданным рядом /// </summary> /// <param name="rang">ряд наблюдений, для которого расчитываются характеристики</param> public FormEnergyInfo(RawRange rang) { rang = rang ?? throw new ArgumentNullException(nameof(rang)); InitializeComponent(); this.range = rang; Text = rang.Name; radioButtonSelectPeriod.CheckedChanged += radioButtonSelect_CheckedChanged; radioButtonSelectYearMonth.CheckedChanged += radioButtonSelect_CheckedChanged; dateTimePickerFrom.ValueChanged += dateTimePickerFrom_ValueChanged; dateTimePickerTo.ValueChanged += dateTimePickerTo_ValueChanged; }
/// <summary> /// пересчет скорости ветра в точку ВЭС /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ToolStripMenuItemRangeTerrain_Click(object sender, EventArgs e) { RawRange rang = (mainTabControl.SelectedTab as TabPageExt).Range; FormRangeTerrain frm = new FormRangeTerrain(rang); if (frm.ShowDialog(this) == DialogResult.OK) { _ = mainTabControl.OpenNewTab(frm.Result, frm.Result.Name); } frm.Dispose(); }
private void linkLabelOpenNasa_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { FormLoadFromNASA frm = new FormLoadFromNASA(selectedMeteostation.Position); if (frm.ShowDialog(this) == DialogResult.OK) { RawRange res = frm.Result; TabPageExt tab = Program.winMain.mainTabControl.OpenNewTab(res, res.Name); tab.HasNotSavedChanges = true; } frm.Dispose(); }
/// <summary> /// загрузить из БД NASA /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void downloadNASAToolStripMenuItem_Click(object sender, EventArgs e) { FormLoadFromNASA frm = new FormLoadFromNASA(PointLatLng.Empty); if (frm.ShowDialog(this) == DialogResult.OK) { RawRange res = frm.Result; TabPageExt tab = mainTabControl.OpenNewTab(res, res.Name); tab.HasNotSavedChanges = true; } frm.Dispose(); }