如何使用符号数学定义累积正态分布

时间:2014-09-19 10:24:49

标签: matlab symbolic-math

我在MATLAB中有以下代码

x=sym('x',[1 2]);
DV=x(1)*ED+x(2);
sv=x(1)*DV;
DD=DV./sv;
p=normcdf(-DD);

其中DV和ED均为13242 x 1个向量。一直到DD都可以。当我如上所述定义p时,我会收到以下消息:

  

使用symfun> validateArgNames(第205行)时出错

     

第二个输入必须是唯一符号变量的标量或向量。

当我定义p=1./(1+exp(-DD))时,一切正常。因此normcdf存在问题。

有什么想法吗?

此致

3 个答案:

答案 0 :(得分:0)

来自normcdf

的MATLAB帮助
  

x可以是矢量,矩阵或多维数组。

即,它不能是一个符号变量。

尝试

syms y;
p=normcdf(y)

不起作用。由于DD是一个符号变量,因此无效。为什么你还想要几千个符号值的向量?为x的特定非符号值运行脚本不是更有效吗?

答案 1 :(得分:0)

我弄清楚如何做到这一点。我必须定义累积密度函数的等式,而不是使用命令normcdf,其中X = -DD

答案 2 :(得分:0)

与统计工具箱中的大多数函数一样,

normcdf不支持符号输入。文档没有说清楚,我同意错误消息是非常无用的(您可能会contact MathWorks and file a service request about this建议他们为统计工具箱添加对符号数学的支持。)

normcdf函数没有做任何神奇的事情。您可以使用p = 0.5*erfc(DD./sqrt(2))代替p = normcdf(-DD)。这也会更快。在命令中键入edit normcdf以查看该函数的代码。有很多错误检查和特定于浮点的情况,这就是函数错误与符号输入的原因。

另一个选择是使用来自stats::normalCDF的MuPAD within Matlab(此功能可能仅在最近的版本中受支持)。例如:

x = sym('x',[1 2]);
ED = ones(1,3);
DV = x(1)*ED+x(2);
sv = x(1)*DV;
DD = DV./sv;
DDstr = char(-DD);
p = evalin(symengine, ['f:=stats::normalCDF(0,1):map(' DDstr(9:end-2) ',x->f(x))'])

其中f定义procedure实现符号正常CDF,均值为0且方差为1. MuPAD的map函数也用于对此进行向量化。总而言之,这个选项可能没有必要。