尝试基于现有函数创建符号函数时出现“无法从字面上证明”错误

时间:2018-11-12 02:13:35

标签: matlab symbolic-math inverse

我需要找到对数正态随机变量的虚值函数的逆。这是我试图做的:

# Rewrite to other domain
RewriteRule ^player_api.* http://example2.com:25461%{REQUEST_URI}?%{QUERY_STRING} [R,QSA]
RewriteRule ^panel_api.* http://example2.com:25461%{REQUEST_URI}?%{QUERY_STRING} [R,QSA]
RewriteRule ^xmltv.* http://example2.com:25461%{REQUEST_URI}?%{QUERY_STRING} [R,QSA]
RewriteRule ^get.* http://example2.com:25461%{REQUEST_URI}?%{QUERY_STRING} [R,QSA]

但是我得到了错误:

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);

我也尝试使用beta发行版,并且遇到了类似的错误。如何将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); 与符号变量一起使用?

1 个答案:

答案 0 :(得分:2)

请注意,您可以将示例代码进一步最小化,如下所示:

syms flogn(x,p1,p2)
flogn(x,p1,p2) = logncdf(x,p1,p2);

它更短,产生相同的错误,并帮助我们专注于错误消息的来源。


因此,错误不是来自于试图对一个函数求逆,而是来自试图将现有函数用于具有符号变量的数值计算

该错误来自以下事实:您想基于现有函数flogn创建一个符号函数logncdf,并且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(使用其他名称),使其不具有比较功能。但这仍然不能保证您会找到一个逆。