【问题标题】:MATLAB's Symbolic Math Fails to Solve a Simple InequalityMATLAB 的符号数学无法解决简单的不等式
【发布时间】:2016-06-30 22:28:49
【问题描述】:

我有一个简单的不等式,而 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 的回答很奇怪……

【问题讨论】:

    标签: matlab symbolic-math maple inequality


    【解决方案1】:

    您的系统定义不明确。您(也许还有 Maple)正在做出一些不一定正确或至少彼此不同的假设。当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。它似乎对<= 的情况进行了类似的处理,但由于某种原因没有为x 选择0(这将与== 匹配)。我建议filing a service request 如果您想尝试询问 The MathWorks 为什么会这样,以及它是否可能是某种错误。

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

    【讨论】:

    • 感谢详细分析!这个附加参数 x 对我来说是个谜……我使用了假设,但解决方案仍然很奇怪。我更新了问题。
    【解决方案2】:

    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~=1ndot4B~=0,因为当您将不等式的两边除以一个常数时,该常数不能是 0

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 2016-04-07
      • 1970-01-01
      • 2013-06-15
      相关资源
      最近更新 更多