matlab - 尝试基于现有函数创建符号函数时出现"Unable to prove literally"错误

标签 matlab symbolic-math inverse

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

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

我也尝试过测试版发行版,并得到了类似的错误。如何将 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吗?难道你不能把它写成一个函数然后计算它的逆(如果它可以逆的话......)?

  • 如果您确实想保留符号化,您还可以重写自己的函数 logncdf (使用另一个名称),这样它就不会进行比较。但仍然不能保证您会找到逆元。

关于matlab - 尝试基于现有函数创建符号函数时出现"Unable to prove literally"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53255204/

相关文章:

c++ - 如何在Matlab中正确使用C++ dll中动态分配的内存

matlab - For 循环从结构中提取信息不起作用?

python - Sympy Solve( ) 给出不正确的答案

java - Guava HashBiMap 的逆,多个键指向一个值

ios - 这种关系是否存在逆关系

linux - 如何防止 MATLAB 打印空格和使用错误的字体?

matlab - 如何从表格在matlab中制作数据透视表

math - 重写无限矩阵

python - 如何使用 sympy.physics.quantum 换向器?

c++ - 如何检查 float 的依赖关系