MATLAB的符号数学未能解决一个简单的不等式

时间:2016-06-30 22:28:50

标签: matlab symbolic-math maple inequality

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

>> syms X ndot4B xiA ndot4A xiB

我试图解决以下不平等问题(请自行完成#34;在纸上#34;)

>> 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会搞砸这么简单的计算。

修改

根据霍克勒的答案,我尝试使用MATLAB和Maple上的假设来解决相同的不等式。

MATLAB:

枫木:

我仍然觉得MATLAB的答案很奇怪......

2 个答案:

答案 0 :(得分:2)

您的系统定义不明确。你(也许枫树)正在做出一些不一定是真的或者至少彼此不同的假设。在solving inequalities时,最好使用'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.parametersx)和一组条件(s.conditionsX ~= 1 & ndot4B ~= 0 & 0 < x)。解决方案s.xiA是参数的函数:

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

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

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

我还建议您在使用assumptions时了解并使用solve

答案 1 :(得分: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

正如霍克勒指出的那样,如果您将>更改为==,那么您就不需要正值。

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

希望这有帮助。