public class LognormalDistribution : ContinuousDistribution
{
private double mean;
private double standardDeviation;
public override double Mean => Math.Exp(this.mean + 0.5 * this.standardDeviation * this.standardDeviation);
public override double Variance
{
get
{
double num;
num = Math.Exp(this.standardDeviation * this.standardDeviation);
return Math.Exp(2.0 * this.mean) * num * (num - 1.0);
}
}
public override double Skewness
{
get
{
double num;
num = Math.Exp(this.standardDeviation * this.standardDeviation);
return (2.0 + num) * Math.Sqrt(num - 1.0);
}
}
public override double Kurtosis
{
get
{
double num;
num = Math.Exp(this.standardDeviation * this.standardDeviation);
return num * num * (3.0 + num * (2.0 + num)) - 6.0;
}
}
public double LocationParameter => this.mean;
public double ScaleParameter => this.standardDeviation;
public LognormalDistribution(double mean, double standardDeviation)
{
if (standardDeviation <= 0.0)
{
ThrowException.ArgumentOutOfRange("standardDeviation");
}
this.mean = mean;
this.standardDeviation = standardDeviation;
}
public LognormalDistribution(NumericalVariable variable)
{
if (variable == null)
{
ThrowException.ArgumentNull("variable");
}
variable = variable.Transforms.Log();
this.mean = variable.Mean;
this.standardDeviation = variable.StandardDeviation;
}
public override double ProbabilityDensityFunction(double x)
{
if (x <= 0.0)
{
return 0.0;
}
return Math.Exp(-0.5 * Math.Pow((Math.Log(x) - this.mean) / this.standardDeviation, 2.0)) / (x * 2.5066282746310007 * this.standardDeviation);
}
public override double MomentFunction(int order, double x)
{
if (order < 0)
{
ThrowException.ArgumentOutOfRange("order");
}
if (order == 0)
{
return this.DistributionFunction(x);
}
double num;
num = this.standardDeviation * this.standardDeviation;
return 0.5 * Math.Exp((double)order * this.mean + 0.5 * ((double)(order * order) * num)) * Extreme.Mathematics.SpecialFunctions.Probability.Erfc((this.mean + (double)order * num - Math.Log(x)) / (1.4142135623730951 * this.standardDeviation));
}
public override double DistributionFunction(double x)
{
if (x <= 0.0)
{
return 0.0;
}
return 0.5 + 0.5 * Extreme.Mathematics.SpecialFunctions.Probability.Erf((Math.Log(x) - this.mean) / this.standardDeviation / 1.4142135623730951);
}
public override double SurvivorDistributionFunction(double x)
{
if (x <= 0.0)
{
return 1.0;
}
return 0.5 - 0.5 * Extreme.Mathematics.SpecialFunctions.Probability.Erf((Math.Log(x) - this.mean) / this.standardDeviation / 1.4142135623730951);
}
public override double InverseDistributionFunction(double probability)
{
if (probability < 0.0 || probability > 1.0)
{
ThrowException.ArgumentOutOfRange("probability");
}
return Math.Exp(NormalDistribution.Standard.InverseDistributionFunction(probability) * this.standardDeviation + this.mean);
}
public override double GetRandomVariate(System.Random random)
{
if (random == null)
{
ThrowException.ArgumentNull("random");
}
return Math.Exp(NormalDistribution.Standard.GetRandomVariate(random) * this.standardDeviation + this.mean);
}
}
如果对您有帮忙,非常感谢您支持一下创造者的付出!
感谢支持技术分享,请扫码点赞支持:
技术合作交流qq:2401315930