/// <summary> /// Получение веса нечеткой тенденции по названию /// </summary> /// <param name="trendName"></param> /// <returns></returns> public static int ToFuzzyTrendLabelWeight(FuzzyTrendLabel trendName) { if (FuzzyTrendWeight.TrendWeights.ContainsKey(trendName)) { return(FuzzyTrendWeight.TrendWeights[trendName]); } else { return(TrendWeightNotFound); } }
public static int GetPoint(FuzzyTrendLabel lastPointFTN, FuzzyTrendLabel beforeLastPointFTN) { var xNow = Converter.ToFuzzyTrendLabelWeight(lastPointFTN); if (xNow == Converter.TrendWeightNotFound) { throw new Exception(string.Format("Не найден вес для тенденции {0}", lastPointFTN)); } var xLast = Converter.ToFuzzyTrendLabelWeight(beforeLastPointFTN); if (xLast == Converter.TrendWeightNotFound) { throw new Exception(string.Format("Не найден вес для тенденции {0}", beforeLastPointFTN)); } // точка на фазовой плоскости для текущей точки ряда return(CalcPointOnPhasePlane(lastPointFTN, xLast - xNow)); }
/// <summary> /// Вычисляется точка по значении меры энтропии по нечеткой тенденции и точке фазовой плоскости по предыдущей тенденции (для прогнозирования) /// </summary> /// <param name="lastPointFTN"></param> /// <param name="beforeLastPointFTN"></param> /// <param name="tempStateEntropy"></param> /// <returns></returns> public static int CalcPointFromFFT(FuzzyTrendLabel lastPointFTN, FuzzyTrendLabel beforeLastPointFTN, StatisticsByEntropy tempStateEntropy, int seriesId) { var xLast = Converter.ToFuzzyTrendLabelWeight(lastPointFTN); if (xLast == Converter.TrendWeightNotFound) { throw new Exception("Не найден вес для тенденции " + lastPointFTN); } var xLastLast = Converter.ToFuzzyTrendLabelWeight(beforeLastPointFTN); if (xLastLast == Converter.TrendWeightNotFound) { throw new Exception("Не найден вес для тенденции " + beforeLastPointFTN); } var speedTrendLast = xLastLast - xLast; return(CalcPointFromFFT(Converter.ToEntropyByFT(tempStateEntropy.EndStateLingvistFT), CalcPointOnPhasePlane(lastPointFTN, speedTrendLast), seriesId)); }
/// <summary> /// Расчет точки на фазовой плоскости /// </summary> /// <param name="trend">вес тенденции</param> /// <param name="speedTrend">скорость тенденции</param> /// <returns></returns> public static int CalcPointOnPhasePlane(FuzzyTrendLabel trend, int speedTrend) { if (trend == FuzzyTrendLabel.СтабильностьСредняя && speedTrend == 0) { return(0); } else if (trend.ToString().Contains("Рост") && speedTrend > 0) { return(1); } else if (trend.ToString().Contains("Падение") && speedTrend > 0) { return(2); } else if (trend.ToString().Contains("Падение") && speedTrend < 0) { return(3); } else if (trend.ToString().Contains("Рост") && speedTrend < 0) { return(4); } else if (trend == FuzzyTrendLabel.СтабильностьСредняя && speedTrend > 0) { return(5); } else if (trend == FuzzyTrendLabel.СтабильностьСредняя && speedTrend < 0) { return(6); } else if (trend.ToString().Contains("Рост") && speedTrend == 0) { return(7); } else if (trend.ToString().Contains("Падение") && speedTrend == 0) { return(8); } else { return(-1); } }
/// <summary> /// Вычисление значения энтропии по нечеткой тенденции /// </summary> /// <param name="point"></param> /// <returns></returns> public static double CalcEntropyByFT(FuzzyTrendLabel lastPointFTN, FuzzyTrendLabel beforeLastPointFTN, FuzzyTrendLabel beforeBeforeLastPointFTN, int seriesId, out int pointNext) { var xNow = Converter.ToFuzzyTrendLabelWeight(lastPointFTN); if (xNow == Converter.TrendWeightNotFound) { throw new Exception(string.Format("Не найден вес для тенденции {0}", lastPointFTN)); } var xLast = Converter.ToFuzzyTrendLabelWeight(beforeLastPointFTN); if (xLast == Converter.TrendWeightNotFound) { throw new Exception(string.Format("Не найден вес для тенденции {0}", beforeLastPointFTN)); } var xLastLast = Converter.ToFuzzyTrendLabelWeight(beforeBeforeLastPointFTN); if (xLastLast == Converter.TrendWeightNotFound) { throw new Exception(string.Format("Не найден вес для тенденции {0}", beforeBeforeLastPointFTN)); } // точка на фазовой полскости для предыдущей точки ряда var beforePoint = CalcPointOnPhasePlane(beforeLastPointFTN, xLastLast - xLast); // точка на фазовой плоскости для текущей точки ряда var nextPoint = CalcPointOnPhasePlane(lastPointFTN, xLast - xNow); pointNext = nextPoint; // получаем энтропию using (var _context = new DissertationDbContext()) { var point = _context.PointTrends.FirstOrDefault(rec => rec.StartPoint == beforePoint && rec.FinishPoint == nextPoint && rec.SeriesDiscriptionId == seriesId); if (point == null) { return(1); } else { point.Count++; _context.SaveChanges(); return(1.0 - point.Weight); } } }