#c# #math #normal-distribution
#c# #математика #нормальное распределение
Вопрос:
Я реализовал свое собственное распределение Леви для программы, но, похоже, я получаю от него неправильные значения, и, потратив некоторое время, я все еще не могу найти, где я ошибся.
Это используется для генерации случайных однородных чисел (здесь double ), а также нормальных.
public class RandomProportional : Random
{
protected override double Sample()
{
return Math.Sqrt(base.Sample());
}
public override double NextDouble()
{
return (double)(Sample());
}
public double NextStdNormal()
{
double d1 = NextDouble();
double d2 = NextDouble();
return (double)(Math.Sqrt(-2.0 * Math.Log(d1)) * Math.Sin(2.0 * Math.PI * d2));
}
}
Вот как я вычисляю сигму для распределения Леви:
static double sigma_lev = Math.Pow(var_class.Gamma(1.0 var_class.beta) * Math.Sin(Math.PI * var_class.beta / 2.0) / (var_class.Gamma((1.0 var_class.beta) / 2.0) * var_class.beta * Math.Pow(2.0, (var_class.beta - 1.0) / 2.0)), 1.0 / var_class.beta);
Где var_class.Гамма (двойное x) вычисляется с использованием кода, найденного здесь : Гамма-функция
Where var_class.beta = 1.5 (all the time)
Фактическая функция:
public static double[] levy(int n)
{
RandomProportional randObj = new RandomProportional();
double[] step = new double[n];
for (int i = 0; i < n; i)
{
step[i] = var_class.gam * randObj.NextStdNormal() * sigma_lev / Math.Pow(Math.Abs(randObj.NextStdNormal()), 1.0 / var_class.beta);
}
return step;
}
Где var_class.gam
0.075
Я использую эту формулу для реализации:
Некоторые примеры результатов, которые я получаю:
Оттуда, я думаю, я сделал что-то не так, но все еще не могу найти, что именно.
Комментарии:
1. Не могли бы вы определить метод double
var_class.Gamma(double x)
?2. @hoang Это указано в ссылке
3. Какие неправильные значения вы получаете? Какое значение mu вы используете?
4. Я добавил изображение формулы, а также некоторые значения, которые я получаю из кода, который я дал