什么是Delphi/Pascal等效于MS-Excel的NormDist函数?

4ioopgfo  于 2022-09-21  发布在  其他
关注(0)|答案(2)|浏览(225)

我正在从MS-Excel(它运行良好)向Delphi移植一个液相色谱模拟器,这样我就可以有一个可执行的文件,我可以与学生和工作的色谱仪共享。NormDist function是这项任务的核心。似乎没有Delphi原生的正态分布函数(NormDist)。

有人能给我指个方向吗?

kiayqfof

kiayqfof1#

由于我对数学不是很深入,我只是在搜索引擎上使用了关键字NormDist Excel Delphi,这导致我找到了this unit,它具有完全相同的函数和相同的参数as in Excel。最好下载all the units,因为至少还需要另外两个。

将所有需要的代码合并为:

const
  sqrt2pi = 2.5066282746310005; {sqrt(2*pi)}

function Erfc(X : Single) : Single;
var
  t, z, ans : Double;
begin
  z := abs(X);
  t := 1.0/(1.0+0.5*z);
  ans := t*exp(-z*z-1.26551223+t*(1.00002368+t*(0.37409196+t*(0.09678418+
    t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+
    t*(-0.82215223+t*0.17087277)))))))));
  if (X >= 0.0) then
    Result := ans
  else
    Result := 2.0-ans;
end;

function NormSDist(Z : Single) : Single;
const
  sqrt2 = 1.41421356237310;
begin
  Result := 1.0-0.5*Erfc(Z/sqrt2);
end;

function NormDist(X, Mean, StandardDev : Single;
  Cumulative : Boolean) : Single;
var
  Z : Extended;
begin
  if (StandardDev <= 0) then
    raise Exception.Create('Invalid parameter');
  Z := (X-Mean)/StandardDev;
  if (Cumulative) then
    Result := NormSDist(Z)
  else
    Result := exp(-Z*Z/2.0)/(StandardDev*sqrt2pi);
end;
kt06eoxx

kt06eoxx2#

谢谢大家的帮助。

最后,我决定为概率密度(正态分布)编写自己的(有限)函数。

没有错误检查,所以这不是一个通用的解决方案,但对于我有限的目的来说,它工作得很好。

对于较小的标准偏差(StdDev)值和较大的X值,返回的扩展结果很重要,否则会出现浮点溢出错误消息。

function NormalDistribution(X: extended; Mean, StdDev: double):extended;
var  e,Sqrt2Pi: extended;
begin
  e := 2.71828182845905;
  Sqrt2Pi := 2.506628274631;
  Result := (1/(StdDev*Sqrt2Pi))*Power(e, -0.5*Power(((X-Mean)/StdDev), 2));
end;

相关问题