Библиотека генерации случайной величины по закону Фишера

Описание: Код для выполнения генерации распределния случайных чисел по закону распределения Фишера.

Данная статья посвящена разбору алгоритма и кода для построяения случайных велечин с законом Фишера, а также построение графиков на их основе. Начнёмс…

Цель. Реализовать на ЭВМ и исследовать на точность алгоритм моделирования непрерывной случайной величины, распределенной по закону Фишера (число успехов в испытаниях), методом суммирования:

числом степеней свободы К1 и К2.

Математическое ожидание и дисперсия СВ, распределенной по закону Фишера, имеют вид:

Для моделирования непрерывной случайной величины, распределенной по закону Фишера, использовалась следующая формула

, с числом степеней свободы К1 и К2.
 Чтобы смоделировать одну случайную велечину необходимо пройти через алгоритм (рис. 1). Затем приступим к написанию кода

Допустим, у нас есть проект в Visual Studio и мы создали класс «Exp.cs», который содержит довольно простой код (Листинг 1):

public class Fisher
    {
        private Распределения.EnterValues enVal;
        private Распределения.OutValues ouVal;
        private Распределения.Xi_two Xi2_1;
        private Распределения.Xi_two Xi2_2;
        public Fisher(Распределения.EnterValues enVal, Распределения.OutValues ouVal, Распределения.Xi_two Xi2_1, Распределения.Xi_two Xi2_2)
        {
            this.enVal = enVal;
            this.ouVal = ouVal;
            this.Xi2_1 = Xi2_1;
            this.Xi2_2 = Xi2_2;
        }
        public void generate()
        {
            ouVal._arX = new double[enVal._N];
            enVal._MatO_T = 0.0f;
            enVal._Sko_T = 1.0f;
            ouVal._NameOfR = "Распределение Фишера";
            for (int i = 0; i < enVal._N; i++)
            {
                ouVal._arX[i] = genX(enVal._K1, enVal._K2, enVal._MatO_T, enVal._Sko_T);
            }
        }
        private double genX(int K1, int K2, float MatO, float Sko)
        {
            double Xi2_K1 = 0.0;
            double Xi2_K2 = 0.0;
            double x = 0.0;
            Xi2_K1 = Xi2_1.genX(MatO, Sko, K1);
            Xi2_K2 = Xi2_2.genX(MatO, Sko, K2);
            x = (Xi2_K1 / (double)enVal._K1) / (Xi2_K2 / (double)enVal._K2);
            return x;
        }
    }

Даю пояснения к листингу 1.

Здесь применяется подход из ряда статей «Распределения — (первая статья)«, т.е. имеется ввиду, что мы используем некий класс входных переменных(enVal) и выводимых(ouVal). В классе «ouVal» мы используем переменную для храненя случайных велечин (СВ) с экспоненциальным законом распредления «ouVal._arX[i]», куда мы записываем новые СВ. Входной параметр «enVal._Lya» является неотъемлемой частью этого закона распределния, а папраметр «enVal._N» означает количество генерирумых СВ.

Также, если вы используете «все в одном», то можно написать примерно следующимм кодом — Листинг 2.

Надеюсь, что вы имеете небольшое предстваления, как использовать эти листинги для своих целей.

Если все правильно сделать, то программа способна отображать графики и расчитывать величины правильно. Некоторые возможности представлены на рисунках ниже.

Хорошего дня.

Attachments

  • zip Debug
    Размер файла: 198 КБ Кол-во скачиваний: 402