当前位置: 首页 > 编程语言 > C#

C#中的标准正态分布z值函数Share

时间:2023-04-10 19:51:09 C#

C#中的标准正态分布z值函数我正在尝试将帖子中的代码转换为C#,但我遇到了问题。我知道.NET中没有返回z值的函数,给定标准正态曲线下面积的百分比。该算法使用的建议值为95%和97.5%,您可以在任何统计手册的z分数表中查找这些值。有谁知道如何为z的所有值或距均值至少6个标准差的值实现这样的函数。一种方法是将值硬编码到字典中并使用查找,但必须有一种方法来计算准确的值。我尝试解决这个问题的方法是对标准正态曲线函数取定积分。y=(1/(sqrt(2*PI)))*e^(-(1/2)*x^2)这给了我两个x值之间的曲线面积,但后来我卡住了......也许我是基本方式而你不是那样做的?谢谢。这是一些用Python编写的正常分发代码,但可以通过添加一些标点符号轻松转换为C#。这只有大约15行代码。这是统计程序R中使用的正常分位数C代码的C#转换。//////正态分布的分位数函数(逆CDF)。//////概率。///正态分布的均值。///正态分布的标准差。///如果为真,则概率为P[Xx]。///如果为真,则概率以log(p)形式给出。///P[X///参见https://svn.r-project.org/R/trunk/src/nmath/qnorm.cpublicstaticdoubleQNorm(doublep,doublemu,doublesigma,boollower_tail,boollog_p){如果(double.IsNaN(p)||double.IsNaN(mu)||double.IsNaN(sigma))返回(p+mu+sigma);双答案;boolisBoundaryCase=R_Q_P01_boundaries(p,double.NegativeInfinity,double.PositiveInfinity,lower_tail,log_p,outans);如果(isBoundaryCase)返回(ans);if(sigma0?R_DT_CIv(p,lower_tail,log_p):p_;r=Math.Sqrt(-((log_p&&((lower_tail&&q0)))?p:Math.Log(r)));if(rmin(p,1-p)>=exp(-25)~=1.3888e-11{r-=1.6;val=(((((((r*7.7454501427834140764e-4+.0227238449892691845833)*r+.24178072517745061177)*r+1.27045825245236838258)*r+3.64784832476320460504)*r+5.7694972214606914055)*r+4.6303378461565452959)*r+1.42343711074968357734)/(((((((r*1.05075007164441684324e-9+5.475938084995344946e-4)*r+.0151986665636164571966)*r+.14810397642748007459)*r+.68976733498510000455)*r+1.6763848301838038494)*r+2.05319162663775.0*r);}else//非常接近0或1{r-=5.0;val=(((((((r*2.01033439929228813265e-7+2.71155556874348757815e-5)*r+.0012426609473880784386)*r+.026532189526576123093)*r+.29656057182850489123)*r+1.7848265399172913358)*r+5.4637849111641143699)*r+6.6579046435011037772)/(((((((r*2.04426310338993978564e-15+1.4215117583164458887e-7)*r+1.8463183175100546818e-5)*r+7.868691311456132591e-4)*r+.0148753612908506148525)*r+.13692988092273580531)*r+.59983220655588793769)*r+1.0);}if(q一些辅助方法:privatestaticboolR_Q_P01_boundaries(doublep,double_LEFT_,double_RIGHT_,boollower_tail,boollog_p,outdoubleans){if(log_p){if(p>0.0){ans=double.NaN;返回(真);}if(p==0.0){ans=lower_tail?_右左_;返回(真);}if(p==double.NegativeInfinity){ans=lower_tail?_左右_;返回(真);}}else{if(p1.0){ans=double.NaN;返回(真);}if(p==0.0){ans=lower_tail?_左右_;返回(真);}if(p==1.0){ans=lower_tail?_右左_;返回(真);}}ans=double.NaN;返回(假);}privatestaticdoubleR_DT_qIv(doublep,boollower_tail,boollog_p){return(log_p?(lower_tail?Math.Exp(p):-ExpM1(p)):R_D_Lval(p,lower_tail));}privatestaticdoubleR_DT_CIv(doublep,boollower_tail,boollog_p){return(log_p?(lower_tail?-ExpM1(p):Math.Exp(p)):R_D_Cval(p,lower_tail));}privatestaticdoubleR_D_Lval(doublep,boollower_tail){returnlower_tail?p:0.5-p+0.5;}privatestaticdoubleR_D_Cval(doublep,boollower_tail){returnlower_tail?0.5-p+0.5:p;}privatestaticdoubleExpM1(doublex){if(Math.Abs??(x)在你的情况下你需要mu=0.0,sigma=1.0,lower_tail=true,log_p=false找到误差函数的实现。有本书在所有经典的数值食谱中。对于较新版本的MathNet以上是C#学习教程:StandardinC#正态分布z值函数分享的所有内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注---//标准正态累积分布函数staticdoubleF(doublex){MathNet.Numerics.Distributions.Normalresult=newMathNet.Numerics.Distributions.Normal();returnresult.CumulativeDistribution(x);}本文采集自网络,不代表立场,如涉及侵权,请点击维权联系管理员删除,如需转载请注明出处: