MATLAB 的符号数学无法解决简单的不等式

MATLAB's Symbolic Math Fails to Solve a Simple Inequality

我有一个简单的不等式,MATLAB 的符号数学工具箱正在做一些非常奇怪的事情。以下是变量:

>> syms X ndot4B xiA ndot4A xiB

我正在尝试解决以下不等式(请自己解决"on paper"):

>> solve(X*ndot4B*xiA - ndot4B*xiA + X*ndot4A*xiB > 0, xiA)

答案是:

ans =

(X*ndot4A*xiB - 1)/(ndot4B - X*ndot4B)

但这是不正确的。相反,如果我将其作为等式解决:

>> solve(X*ndot4B*xiA - ndot4B*xiA + X*ndot4A*xiB, xiA)

结果是:

ans =

(X*ndot4A*xiB)/(ndot4B - X*ndot4B)

以上是正确的(即 xiA 必须大于上面的解)。区别在于分子。 Maple 做对了(它应该做的)。关于可能发生的事情有什么想法吗?很难相信 MATLAB 会搞砸这么简单的计算。

编辑:

根据 horchler 的回答,我尝试在 MATLAB 和 Maple 上使用假设来解决相同的不等式。

MATLAB:

枫树:

我还是觉得MATLAB的回答很奇怪...

您的系统定义不正确。您(也许还有 Maple)做出了一些不一定正确或至少彼此不同的假设。当 solving inequalities, it's best to use the 'ReturnConditions' 选项查看解决方案的完整详细信息时。在你的情况下:

syms X xiA ndot4B ndot4A xiB
s = solve(X*ndot4B*xiA - ndot4B*xiA + X*ndot4A*xiB > 0, xiA, 'ReturnConditions', true)

这return是一个数据结构:

       xiA: [1x1 sym]
parameters: [1x1 sym]
conditions: [1x1 sym]

现在您会看到有一个附加参数(s.parametersx)和一组条件(s.conditionsX ~= 1 & ndot4B ~= 0 & 0 < x)。解决方案 s.xiA 是参数的函数:

-(x - X*ndot4A*xiB)/(ndot4B - X*ndot4B)

因为你是用严格的不等式(> 而不是 >=)来解决这个问题,所以参数 x 实际上不能等于零 以保证满足不等式(Maple 可能对这两种情况一视同仁,我不确定)。

那么当你不要求 return 条件时,为什么 Matlab 的符号引擎(与 MuPAD 环境不太一样)return (X*ndot4A*xiB - 1)/(ndot4B - X*ndot4B)?首先,这个答案满足不等式并且完全有效,因为没有关于每个变量范围的信息(假设)。而不是 return 错误或警告,看起来 Matlab 只是选择了满足条件的参数 x 的第一个整数值,即 1。它似乎以类似的方式处理 <= 情况,但出于某种原因没有为 x 选择 0(这将匹配 ==)。我建议 filing a service request 如果您想尝试询问 MathWorks 为什么会这样,以及它是否可能是某种错误。

我还建议学习和使用 assumptions when working with solve

solve的回答是正确的。您只需要分子中有一些正值即可满足不等式。它可以是任何值,因此 solve 引入了一个参数。

您可以验证您建议的答案和 solve 的答案:

syms X ndot4B xiA ndot4A xiB
eqn = X*ndot4B*xiA - ndot4B*xiA + X*ndot4A*xiB > 0;
trySol = (X*ndot4A*xiB)/(ndot4B - X*ndot4B); % let's try the proposed answer
tryCondition = subs(eqn,xiA,trySol); % substitute the answer to get the condition
isAlways(tryCondition) % check if the condition holds?
ans =
  logical
   0

条件不成立。现在用相同的步骤尝试 solve 的答案:

trySol = (X*ndot4A*xiB - 1)/(ndot4B - X*ndot4B);
tryCondition = subs(eqn,xiA,trySol);
isAlways(tryCondition)
ans =
  logical
   1

这个答案是正确的。您可以通过将这两个值替换为 xiA 来自己在纸上检查。您只需要分子中有一些正值即可满足 > 不等式。例如,即使使用 eps 而不是 1 也可以:

trySol = (X*ndot4A*xiB - eps)/(ndot4B - X*ndot4B);
isAlways(subs(eqn,xiA,trySol))
ans =
  logical
   1

正如霍希勒指出的那样,如果将 > 更改为 ==,则不需要正值。

solve引入了假设,X~=1ndot4B~=0,因为当你用一个常数除不等式两边时,那个常数不可能是0

希望对您有所帮助。