当使用符号变量作为参数时,Matlab 无法识别函数的数值范围

问题描述 投票:0回答:1

当函数参数被定义为符号变量时,Matlab 无法识别具有数值定义范围的函数始终落在该范围内。下面的示例显示了正态分布的 CDF 问题。这是我的代码:

kmax = sym('kmax',{'positive','rational'});
mu = sym('mu',{'positive','rational'});
s = sym('s',{'positive','rational'});
isAlways(normcdf(kmax,mu,s)>=0)

这给出了以下错误:

无法从 sym 转换为逻辑。

normcdf>localnormcdf 中的错误(第 127 行) 如果西格玛 > 0

normcdf 中的错误(第 50 行)[varargout{1:max(1,nargout)}] = localnormcdf(uflag,x,varargin{:});

当我尝试手动定义 CDF 时,如

syms ncdf(x);
ncdf(x) = (1/2)*(1+erf((log(x)-mu)/(s*sqrt(2))));
isAlways(ncdf(kmax)>=0)

我收到此错误:

警告:无法证明 '0 <= 1/2 - erf((2^(1/2)(mu - log(kmax)))/(2s))/2'.

在符号引擎中

在 sym/isAlways 中(第 41 行)

ans=

逻辑

0

同样,我无法证明误差函数(范围为 [-1,1])始终大于或等于 -1,即

isAlways(erf(kmax)>=-1)

给予

警告:无法证明'-1 <= erf(kmax)'.

在 symengine 中 sym/isAlways(第 41 行)

ans=

逻辑

0

有办法解决这个问题吗?是否有一个函数在评估符号表达式方面比 isAlways 表现更好?

提前致谢!

matlab symbolic-math
1个回答
0
投票

normcdf
函数(统计和机器学习工具箱的一部分)是一个数字函数,正如您所见,它不是为符号数学的一般用途而设计的。更好的方法是像您一样定义自己的符号函数。

问题似乎在于您的变量是

'rational'
的规范。如果删除它,您将能够从
isAlways
获得更一般情况的正确答案:

syms kmax mu s positive;
syms ncdf(x);
ncdf(x) = (1/2)*(1+erf((log(x)-mu)/(s*sqrt(sym(2)))));
isAlways(ncdf(kmax)>=0)

我不知道在数学上为什么添加

'rational'
假设会导致
isAlways
失败,除了它可能尝试针对这种情况采用替代方法。您可以向 MathWorks 询问此事,甚至可以提交服务请求/错误报告

© www.soinside.com 2019 - 2024. All rights reserved.