我为一个程序实现了自己的Levy发行版,但似乎我从中得到了错误的值,经过一段时间后,我仍然无法找到我做错的地方。
这用于生成随机统一数字(此处为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));
}
}
以下是我如何为Levy分布计算Sigma:
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.Gamma(double x):Gamma function
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
我正在使用这个公式来实现:
我得到的结果的一些例子:
从那里我想我做错了什么但仍然找不到。