Matlab symbolic - 检查一个函数是否可以用另一个函数表示

Matlab symbolic - check if a function can be expressed in terms of another one

在标题中解释这个有点困难,所以假设我在符号表达式及其导数中有标准的 sigmoid 函数

f = 1/(1+exp(-x))
f2 = exp(-x)/(1+exp(-x))^2

再次作为符号表达很容易获得。我想要的是以某种方式检查实际上 f2=f1(1-f1),例如(对于任何单射函数 f 总是如此),但自动执行此操作。

至少在这种情况下,您应该能够仅使用 subs 来做到这一点,它适用于表达式和变量:

syms x f1;
f = 1/(1+exp(-x))
f2 = exp(-x)/(1+exp(-x))^2
f2 = subs(f2,f,f1)

在 R2014b 和 R2015a returns f1^2*exp(-x) 中。对于更复杂的表达式,这可能不是完全可靠的,或者可能需要多次应用或与 simplify.

结合使用

如果只是需要比较表达式,可以使用sym/isequaln or isAlways:

syms x;
f = 1/(1+exp(-x));
f2 = exp(-x)/(1+exp(-x))^2;
isequaln(f*(1-f),f2)
isAlways(f*(1-f)==f2)

但是,这两个return布尔值false(0)。因为某些原因。这可能是一个错误,也可能是因为这两种形式在 -Inf 处计算时具有不同的奇点。以下

syms x;
f = 1/(1+exp(-x));
f2 = exp(-x)/(1+exp(-x))^2;
subs(f2,x,-Inf)
subs(f*(1-f),x,-Inf)

分别产生 NaN0。通过 MathWorks 获得 limit at -Inf does yield the correct values, however. The documentation does not indicate how sym/isequaln and/or isAlways handle this situation. This might be a good case to file a service request