TableKolmogorova table = new TableKolmogorova(); //таблица критерия #endregion Fields #region Methods public KolmogorovContainer Calculate(Sampling sampling, int type) { //создаём эземпляр практической функции распределения PracticalDistributionFunction function1 = new PracticalDistributionFunction(sampling); double d = D(function1, type); double λ = d * Math.Sqrt(sampling.GetVolume());//вычисляем λ double P = table.GetP(λ);//ищем по таблице результат KolmogorovContainer result = new KolmogorovContainer(); result.P = P; result.λ = λ; result.D = d; result.MeanSquareDeviation = function1.MeanSquareDeviation(sampling.AvеrageValue()); return result; }
//возвращает максимальное расхождение между теорертической и практической функциями распределения private double D(PracticalDistributionFunction function1, int type) { double d = 0; IDistributionFunction function2 = null; switch (type) { case 0: function2 = UniversalDistributionFunction.Create(); break; case 1: function2 = InverseDistributionFunction.Create(); break; case 2: function2 = DiscreteDistributionFunction.Create(); break; default: throw new Exception("Неизвестная функция"); } double min = function2.Xmin(); double max = function2.Xmax(); //проверка расхождения между функциями с определённым шагом for (double i = min; i <= max; i += (max-min)/100000) { double temp; if(type==2)//если функция дискретная { temp = Math.Abs(function1.GetDiscreteFunctionValue(i) - function2.GetFunctionValue(i)); } else//если функция неприрывная { temp = Math.Abs(function1.GetFunctionValue(i) - function2.GetFunctionValue(i)); } if(temp>d) { d = temp; } } return d; }
public void DrawGraph2(ZedGraphControl control,PracticalDistributionFunction function2,int type) { IDistributionFunction function1 = null; switch (type) { case 0: function1 = UniversalDistributionFunction.Create(); break; case 1: function1 = InverseDistributionFunction.Create(); break; case 2: function1 = DiscreteDistributionFunction.Create(); break; default: throw new Exception("Неизвестная функция"); } //DensityFunction function2 = DensityFunction.Create(); // Получим панель для рисования GraphPane pane = control.GraphPane; pane.CurveList.Clear();// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы pane.Title.Text = "Функция распределения"; // Название панели и осей pane.XAxis.Title.Text = "X"; pane.YAxis.Title.Text = "F(X)"; PointPairList list = new PointPairList();// Создадим список точек PointPairList list2 = new PointPairList(); double min = function1.GetInverseFunctionValue(0); double max = function1.GetInverseFunctionValue(1); list.Add(min,0); list2.Add(min,0); double step = (max - min) / 100000;//точность нахождения границы for (double j = min; j <= (max+5000*step); j += step) { if(type == 2) { list.Add(j, function2.GetDiscreteFunctionValue(j)); } else { list.Add(j, function2.GetFunctionValue(j)); } list2.Add(j, function1.GetFunctionValue(j)); } // Создадим кривую с названием "Sinc", // которая будет рисоваться голубым цветом (Color.Blue), // Опорные точки выделяться не будут (SymbolType.None) LineItem myCurve = pane.AddCurve("практическая функция распределения", list, Color.Blue, SymbolType.None); // Создадим кривую с названием "Sinc2", // которая будет рисоваться голубым цветом (Color.Red), // Опорные точки выделяться не будут (SymbolType.None) LineItem myCurve2 = pane.AddCurve("функция распределения", list2, Color.Red, SymbolType.None); myCurve.Line.Width = 2.0F; // Толщина графиков myCurve2.Line.Width = 2.0F; pane.XAxis.Scale.Min = min - 5000 * step; // Устанавливаем интересующий нас интервал по оси X pane.XAxis.Scale.Max = max+5000*step; // Включаем отображение сетки напротив крупных рисок по оси X pane.XAxis.MajorGrid.IsVisible = true; // Задаем вид пунктирной линии для крупных рисок по оси X: // Длина штрихов равна 10 пикселям, ... pane.XAxis.MajorGrid.DashOn = 10; // затем 5 пикселей - пропуск pane.XAxis.MajorGrid.DashOff = 5; // Включаем отображение сетки напротив крупных рисок по оси Y pane.YAxis.MajorGrid.IsVisible = true; // Аналогично задаем вид пунктирной линии для крупных рисок по оси Y pane.YAxis.MajorGrid.DashOn = 10; pane.YAxis.MajorGrid.DashOff = 5; // Включаем отображение сетки напротив мелких рисок по оси X pane.YAxis.MinorGrid.IsVisible = true; // Задаем вид пунктирной линии для крупных рисок по оси Y: // Длина штрихов равна одному пикселю, ... pane.YAxis.MinorGrid.DashOn = 1; // затем 2 пикселя - пропуск pane.YAxis.MinorGrid.DashOff = 2; // Включаем отображение сетки напротив мелких рисок по оси Y pane.XAxis.MinorGrid.IsVisible = true; //Цвет сетки pane.XAxis.MajorGrid.Color = Color.Gray; pane.YAxis.MajorGrid.Color = Color.Gray; // Аналогично задаем вид пунктирной линии для крупных рисок по оси Y pane.XAxis.MinorGrid.DashOn = 1; pane.XAxis.MinorGrid.DashOff = 2; //Оси pane.XAxis.MajorGrid.IsZeroLine = true; pane.YAxis.MajorGrid.IsZeroLine = true; // Вызываем метод AxisChange (), чтобы обновить данные об осях. // В противном случае на рисунке будет показана только часть графика, // которая умещается в интервалы по осям, установленные по умолчанию control.AxisChange(); control.Invalidate(); // Обновляем график }