当函数参数被定义为符号变量时,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 表现更好?
提前致谢!
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 询问此事,甚至可以提交服务请求/错误报告。