Расчет Величины Гамма по закону распределения СВ Фишера - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день. Я ниже создавал тему про нахождение дробной части числа. Это мне нужно было для закона распределения СВ Фишера. Я уже где-то неделю немогу решить во такую проблему: Выполненные условия: -Есть СВ распределенная по закону Фишера (распределение сделано правильно и соответствует почти теории) -Есть такая рассчитываемая величина, называемая частотой попадание в заданные интервалы (Расчитывается правильно и их сумма равна 1); кол.интервалов задаются (изначально > 10). -Проблема: 1. Рассчитана частота попаданий (практическая). Чтобы ее проверить нужно сделать почти такуюжу, но теоретическую. -Эта величина (ЧастТеоретическая), рассчитывается по формуле: Параметры К1 и К2 задаются пользователем. С формулой проблем нет при условии что К1 и К2 кратны двум. Проблема в следующем: Вот те буковки Г и есть Гамма которую я не могу правильно рассчитать при условии что К1 и К2 не кратны двум. В коде я решил рассчитать Гаммы(3 штуки нужно) так:
public void Funcf_F()
        {
            //
            //Этот метод предназначен для рассчета величины Гамма с параметрами
            //К1 и К2
            //
            arG_a = new double[3];
            arG = new double[3];
            //Параметры Гаммы, та величина что в скобке в формуле
            arG_a[0] = (K1 + K2) / 2; //G1_a
            arG_a[1] = K1 / 2; //G2_a
            arG_a[2] = K2 / 2; //G3_a
            //Унивирсальный метод рассчета Гаммы
            for (int i = 0; i < 3; i++)
            {
                arG[i] = 1;
                int G_shag = 1; // Изначальный шаг фактариала
                double G_fakt = 1; //Величина фактариала
                if ((arG_a[i] - Math.Floor(arG_a[i])) == 0)
                    //услови, что если крато двум
                {
                    for (int G_i = 1; G_i < (int)Math.Floor(arG_a[i]); G_i++)
                    {
                        arG[i] *= G_i;
                    }
                }
                else
                {
                    //если нет, то:
                    for (int G_i = 1; G_i < (int)(2 * Math.Floor(arG_a[i])); G_i++)
                    {
                        G_shag += 2;
                        G_fakt *= G_shag;
                    }
                    arG[i] = (Math.Sqrt(Math.PI) * G_fakt) / Math.Pow(2, Math.Floor(arG_a[i]));
                }
            }
        }
Вот. Формула для расчета фактариала, если не крато двум следующая (вот с ней то у меня проблемы походу): -Допустим К1=3, К2=5, то Г1(3/2) = Г(1+1/2)...Г(a+1/2)=, а двойной фактариал (2a-1)!! равен - 1*3*5*7......(2a-1) Вот такая проблема. Если, кто-то с этим уже сталкивался, помогите пжста. Спасибо.

Решение задачи: «Расчет Величины Гамма по закону распределения СВ Фишера»

textual
Листинг программы
for (int a = 0; a < fF._Ntb; a++)
                {
                    this.datResult.Rows[a].Cells[0].Value = fF._arTable[a, 0]; //N
                    this.datResult.Rows[a].Cells[1].Value = Math.Round(fF._arTable[a, 1], 4); //интервалы
                    this.datResult.Rows[a].Cells[2].Value = fF._arTable[a, 2]; //попадания
                    this.datResult.Rows[a].Cells[3].Value = Math.Round(fF._arTable[a, 3], 2); //теор попадания
                    this.datResult.Rows[a].Cells[4].Value = Math.Round(fF._arTable[a, 4], 4); //хи2
                    this.datResult.Rows[a].Cells[5].Value = Math.Round(fF._arTable[a, 5], 4); //частота
                    this.datResult.Rows[a].Cells[6].Value = Math.Round(fF._arTable[a, 6], 4); //вероятность
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы