我有一个简单的不等式,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的答案很奇怪......
答案 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.parameters
是x
)和一组条件(s.conditions
是X ~= 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~=1
和ndot4B~=0
,因为当你将不等式的两边除以常数时,那个常数不能是0
。
希望这有帮助。