Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 为什么isequaln(f,simplify(f))是假的?_Matlab_Symbolic Math - Fatal编程技术网

Matlab 为什么isequaln(f,simplify(f))是假的?

Matlab 为什么isequaln(f,simplify(f))是假的?,matlab,symbolic-math,Matlab,Symbolic Math,我有一个函数f,其定义如下: syms c a t f = symfun(c + t - (2*(t - 2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t), [c a t]) 但是,检查简化版本是否相等会产生: isequaln(f, simplify(f)) ans = 0 simplify是否不希望返回与原始函数完全等效的函数?函数simplify返回您提供的函数的最简单代数形式。根据Matlab的文档: isequaln递归比较符号数据结

我有一个函数
f
,其定义如下:

syms c a t
f = symfun(c + t - (2*(t - 2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t), [c a t])
但是,检查简化版本是否相等会产生:

isequaln(f, simplify(f))

ans =

     0

simplify
是否不希望返回与原始函数完全等效的函数?

函数simplify返回您提供的函数的最简单代数形式。根据Matlab的文档:

isequaln递归比较符号数据结构的内容 以及对象的属性。如果在各自的 位置相等,isequaln返回逻辑1(true)

我不清楚Matlab是如何检查“各个位置的内容”的,但看起来,虽然简化函数在代数上与原始函数等价,但其“内容”与原始函数不在同一位置,因此Matlab认为它们是不同的

正如@horchler在一篇评论中正确地提到的,用一组输入参数测试两个函数的相等性并不是一个可靠的证明,如下所示,因此对这个答案持保留态度:

%//Define f and S = simplify(f);
syms c a t
f = symfun(c + t - (2*(t - 2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t), [c a t])

f(c, a, t) =

c + t - ((2*t - 2*2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t)

S = simplify(f)

S(c, a, t) =

c + 2^(1/2)*(a*t)^(1/2)

%// Check with dummy arguments:

isequaln(f(1,2,3),S(1,2,3))

ans =

     1 %// seems to work...
出于好奇,如果我们比较两个函数,即(a+b)^2和a^2+2ab+b^2(它们是相同的),并检查是否等效:

syms a b
x1 = symfun(a^2+2*a*b+b^2,[a b])

x1(a, b) =

a^2 + 2*a*b + b^2

x2 = symfun((a+b)^2,[a b])

x2(a, b) =

(a + b)^2

isequaln(x1,x2)

ans =

     0
我们再一次得到错误,尽管它们是等价的


因此,要回答“为什么isequaln(f,simplify(f))是假的?”这个问题,我会说这是因为MATLAB在内部以不同的方式组织它们的内容,所以它们看起来像两个不同的函数。我知道这不是一个很好的解释,但无论如何我希望这能有所帮助。

代码的问题是平等的

可能不是用于测试相等性的适当函数。从
sym/isequaln
的帮助中:

isequaln(A,B)返回真值,如果A和B相同,则将NaN视为相等

正如@Benoit_11所暗示的,文档并不完全清楚,但是,就像它的数字等价物一样,函数似乎正在测试(尽管不幸使用了“等同”一词)。简化函数是未简化函数的恒等式,但它不是等价物。根据文档,
sym/isequaln
可能会考虑一些事情,比如简单的关系,但它不会在内部执行转换和简化。这几乎是肯定的,因为简化是一个计算成本很高的过程,所以它很可能是一个设计决策,只包括一些定义良好(但没有充分记录)的测试

可能存在陷阱的解决方案

那么,你如何继续呢?除了
sym/isequaln
,符号数学工具箱还包括更严格地测试等式和不等式:

syms c a t
f = symfun(c + t - (2*(t - 2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t), [c a t])
g = simplify(f)
isAlways(f==g)
但是,在R2014b中,这将返回
false
和以下警告:

Warning: Cannot prove 'c + t - ((2*t - 2*2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t) == c +
2^(1/2)*(a*t)^(1/2)'. 
> In /Applications/MATLAB_R2014b.app/toolbox/symbolic/symbolic/symengine.p>symengine at 56
  In sym.isAlways at 38
您应该知道,默认情况下,符号变量被假定为复杂的,
总是试图为
c
a
t
的复杂值的所有可能组合证明这种关系。简化也是一个定义不清的过程——从以下文件中可以看出:

数学表达式的简化不是一个明确定义的主题。对于哪种形式的表达式最简单,还没有普遍的概念。对于一个问题来说最简单的数学表达式的形式可能很复杂,甚至不适合于另一个问题

如果你仔细观察你的原始方程,你会发现它包含了一个被简化掉的奇点。在R2014b中,评估
g(1,1,2)
返回
3
,但评估
f(1,1,2)
返回:

Error using mupadmex
Error in MuPAD command: Division by zero. [_power]
  Evaluating: _symans_32_15992

...
使用假设

如果您对符号变量有所了解,您可以通过应用假设来避免这种情况,例如

syms c a t
f = symfun(c + t - (2*(t - 2^(1/2)*(a*t)^(1/2))*(a - t/2))/(2*a - t), [c a t])
g = simplify(f)
assume(t>2*a)
isAlways(f==g)

现在返回
true
。顺便说一下,以@Benoit_11为例,
syms a b;我总是((a+b)^2==a^2+2*a*b+b^2)
也会直接返回
true

通过在某一点上求值来检查等式几乎不构成证据。此外,正在使用重载的
sym/isequaln
,而不是
isequaln
——没有进行数值比较。我认为这并不能回答这个问题。为什么
isequaln
不返回true和/或如何测试这两个函数的相等性?+1个很好的答案!比我的好得多,而且在解释我不能解释的方面做得很好:)