2

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

>> syms X ndot4B xiA ndot4A xiB

我正在尝试解决以下不等式(请“在纸上”自己解决):

>> 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 的答案很奇怪......

4

2 回答 2

2

您的系统定义不明确。您(也许还有 Maple)正在做出一些不一定正确或至少彼此不同的假设。解决不等式时,最好使用该'ReturnConditions'选项查看解决方案的完整细节。在你的情况下:

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

这将返回一个数据结构:

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

现在您将看到有一个附加参数 ( s.parametersis x) 和一组条件 ( s.conditionsis X ~= 1 & ndot4B ~= 0 & 0 < x)。解 ,s.xiA是参数的函数:

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

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

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

我还建议assumptions在使用solve.

于 2016-07-01T00:09:26.987 回答
0

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

正如 horchler 指出的那样,如果您将 更改>==,那么您不需要正值。

solve引入假设,X~=1并且ndot4B~=0,因为当您将不等式的两边除以常数时,该常数不可能是0

希望这可以帮助。

于 2016-07-07T13:05:48.883 回答