AnyLogic:直接通过均值和标准差定义对数正态分布
AnyLogic: Definition of Lognormal-Distribution directly via its mean and standard deviation
我试图在 AnyLogic 中模拟对数正态分布,我有它的标准差和均值,但没有标准差和它包含的正态分布的均值(如 AnyLogic 要求的)。
如何直接通过 ITS 均值和标准差对对数正态分布建模?
我试着取均值的对数来实现它b/o这个公式:
E(X) = exp[my+(sigma^2)/2]。
所以当我取对数时,我应该得到 my+(sigma^2)/2。当 sigma=0 时,我可以实现对数正态分布,但是当 sigma 存在时,上面的公式也依赖于 sigma。因此,我不知道如何在 AnyLogic 中直接通过 ITS 均值、西格玛和最小值 = 0 实现对数正态分布。
有人对此有解决方案吗?
您需要做的是根据您希望的对数正态分布的均值和方差为包含的正态分布计算正确的参数。我完成了这些计算并编写了一些 AnyLogic 代码来展示如何进行计算。在我的代码中,targetMean := "The desired mean of the lognormal distribution."和 targetVariance := "对数正态分布的期望方差。"
计算包含正态分布的参数,第一个函数是
getMu(targetMean, targetVariance):
double mu = log(targetMean) - getSigma2(targetMean,targetVariance)/2.0;
return mu;
第二个函数是
getSigma2(targetMean,targetVariance):
double sigma2 = log(targetVariance/pow(targetMean,2) + 1);
return sigma2;
这是一篇计算的文章:
https://www.johndcook.com/blog/2022/02/24/find-log-normal-parameters/
结果如下:
double targetMean = 8.0;
double targetVariance = 3.0;
for(int i=0;i<5000;i++)
{
lognormalSamples.add(lognormal(getMu(targetMean,targetVariance),sqrt(getSigma2(targetMean,targetVariance)), 0));
}
traceln("Realized mean = " + lognormalSamples.mean());
traceln("Realized var = " + lognormalSamples.variance());
不要忘记将输入中的 sigma2 平方为对数正态分布。这给出了我为对数正态指定的正确均值和方差:
Realized mean = 7.991504691617353
Realized var = 2.9660508827785415
我试图在 AnyLogic 中模拟对数正态分布,我有它的标准差和均值,但没有标准差和它包含的正态分布的均值(如 AnyLogic 要求的)。 如何直接通过 ITS 均值和标准差对对数正态分布建模?
我试着取均值的对数来实现它b/o这个公式:
E(X) = exp[my+(sigma^2)/2]。 所以当我取对数时,我应该得到 my+(sigma^2)/2。当 sigma=0 时,我可以实现对数正态分布,但是当 sigma 存在时,上面的公式也依赖于 sigma。因此,我不知道如何在 AnyLogic 中直接通过 ITS 均值、西格玛和最小值 = 0 实现对数正态分布。
有人对此有解决方案吗?
您需要做的是根据您希望的对数正态分布的均值和方差为包含的正态分布计算正确的参数。我完成了这些计算并编写了一些 AnyLogic 代码来展示如何进行计算。在我的代码中,targetMean := "The desired mean of the lognormal distribution."和 targetVariance := "对数正态分布的期望方差。"
计算包含正态分布的参数,第一个函数是
getMu(targetMean, targetVariance):
double mu = log(targetMean) - getSigma2(targetMean,targetVariance)/2.0;
return mu;
第二个函数是
getSigma2(targetMean,targetVariance):
double sigma2 = log(targetVariance/pow(targetMean,2) + 1);
return sigma2;
这是一篇计算的文章: https://www.johndcook.com/blog/2022/02/24/find-log-normal-parameters/
结果如下:
double targetMean = 8.0;
double targetVariance = 3.0;
for(int i=0;i<5000;i++)
{
lognormalSamples.add(lognormal(getMu(targetMean,targetVariance),sqrt(getSigma2(targetMean,targetVariance)), 0));
}
traceln("Realized mean = " + lognormalSamples.mean());
traceln("Realized var = " + lognormalSamples.variance());
不要忘记将输入中的 sigma2 平方为对数正态分布。这给出了我为对数正态指定的正确均值和方差:
Realized mean = 7.991504691617353
Realized var = 2.9660508827785415