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