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;
        }
示例#3
0
        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();  // Обновляем график
        }