"Unable to prove literally" 尝试基于现有函数创建符号函数时出错
"Unable to prove literally" error when trying to create a symbolic function based on an existing function
我需要求对数正态随机变量虚值函数的反函数。这是我尝试做的:
syms flogn(x,p1,p2)
% assume(p2<=0); %Adding this doesn't change the error
flogn(x,p1,p2) = x - logncdf(x,p1,p2,'upper')/lognpdf(x,p1,p2);
glogn = finverse(flogn,x);
但是我得到了错误:
Error using symengine
Unable to prove 'p2 <= 0' literally. Use 'isAlways' to test the statement mathematically.
Error in sym/subsindex (line 810)
X = find(mupadmex('symobj::logical',A.s,9)) - 1;
Error in sym/privsubsasgn (line 1085)
L_tilde2 = builtin('subsasgn',L_tilde,struct('type','()','subs',{varargin}),R_tilde);
Error in sym/subsasgn (line 922)
C = privsubsasgn(L,R,inds{:});
Error in logncdf>locallogncdf (line 73)
sigma(sigma <= 0) = NaN;
Error in logncdf (line 47)
[varargout{1:max(1,nargout)}] = locallogncdf(uflag,x,varargin{:});
Error in Untitled5 (line 3)
flogn(x,p1,p2) = x - logncdf(x,p1,p2,'upper')/lognpdf(x,p1,p2);
我也尝试过使用 beta 分发版,但也遇到了类似的错误。如何将 logncdf
与符号变量一起使用?
请注意,您可以进一步简化示例代码,如下所示:
syms flogn(x,p1,p2)
flogn(x,p1,p2) = logncdf(x,p1,p2);
它更短,产生相同的错误并帮助我们关注错误消息的来源。
因此,错误不是来自尝试反函数,而是来自尝试将现有函数用于带有符号变量的数值计算。
错误来自于您想要基于现有函数 logncdf
创建符号函数 flogn
,并且 logncdf
具有多重比较。
使用命令edit logncdf
,可以阅读函数源码,第73行和第76行比较
% Return NaN for out of range parameters.
sigma(sigma <= 0) = NaN;
% Negative data would create complex values, which erfc cannot handle.
x(x < 0) = 0;
Matlab 无法比较符号,因此会抛出错误。
根据您的实际需要,您可以有不同的解决方案。
你真的需要符号化函数flogn
吗?难道你不能把它写成 function
然后计算它的倒数(如果它可以倒数...)?
如果你真的想保留符号化,你也可以重写你自己的函数logncdf
(用另一个名字)所以它没有比较。但是仍然不能保证你会找到一个逆。
我需要求对数正态随机变量虚值函数的反函数。这是我尝试做的:
syms flogn(x,p1,p2)
% assume(p2<=0); %Adding this doesn't change the error
flogn(x,p1,p2) = x - logncdf(x,p1,p2,'upper')/lognpdf(x,p1,p2);
glogn = finverse(flogn,x);
但是我得到了错误:
Error using symengine
Unable to prove 'p2 <= 0' literally. Use 'isAlways' to test the statement mathematically.
Error in sym/subsindex (line 810)
X = find(mupadmex('symobj::logical',A.s,9)) - 1;
Error in sym/privsubsasgn (line 1085)
L_tilde2 = builtin('subsasgn',L_tilde,struct('type','()','subs',{varargin}),R_tilde);
Error in sym/subsasgn (line 922)
C = privsubsasgn(L,R,inds{:});
Error in logncdf>locallogncdf (line 73)
sigma(sigma <= 0) = NaN;
Error in logncdf (line 47)
[varargout{1:max(1,nargout)}] = locallogncdf(uflag,x,varargin{:});
Error in Untitled5 (line 3)
flogn(x,p1,p2) = x - logncdf(x,p1,p2,'upper')/lognpdf(x,p1,p2);
我也尝试过使用 beta 分发版,但也遇到了类似的错误。如何将 logncdf
与符号变量一起使用?
请注意,您可以进一步简化示例代码,如下所示:
syms flogn(x,p1,p2)
flogn(x,p1,p2) = logncdf(x,p1,p2);
它更短,产生相同的错误并帮助我们关注错误消息的来源。
因此,错误不是来自尝试反函数,而是来自尝试将现有函数用于带有符号变量的数值计算。
错误来自于您想要基于现有函数 logncdf
创建符号函数 flogn
,并且 logncdf
具有多重比较。
使用命令edit logncdf
,可以阅读函数源码,第73行和第76行比较
% Return NaN for out of range parameters.
sigma(sigma <= 0) = NaN;
% Negative data would create complex values, which erfc cannot handle.
x(x < 0) = 0;
Matlab 无法比较符号,因此会抛出错误。
根据您的实际需要,您可以有不同的解决方案。
你真的需要符号化函数
flogn
吗?难道你不能把它写成function
然后计算它的倒数(如果它可以倒数...)?如果你真的想保留符号化,你也可以重写你自己的函数
logncdf
(用另一个名字)所以它没有比较。但是仍然不能保证你会找到一个逆。