【问题标题】:Matlab equivalent to Mathematica's FindInstanceMatlab 相当于 Mathematica 的 FindInstance
【发布时间】:2015-02-03 16:02:42
【问题描述】:

我几乎在 Matlab 中做了所有事情,但我还没有找到一种在 Matlab 中复制 Mathematica 的 FindInstance 函数的好方法。例如,使用 Mathematica,我可以输入:

FindInstance[x + y == 1 && x > 0 && y > 0, {x, y}]

它会给我:

{{x -> 1/2, y -> 1/2}}

当没有解决方案存在时,它会给我一个空的 Out。我在工作中经常使用它来检查是否存在解决不平等系统的方法——我并不真正关心特定的解决方案。

似乎应该有一种方法可以在 Matlab 中使用Solve 复制它。帮助文件中有一些章节介绍了如何为带有条件的参数化解法求解一组不等式。另一部分是关于使用 PrincipalValue 仅给出一个解决方案,但这似乎只是从有限的解决方案集中选择,而不是提出一个满足参数的解决方案。

谁能想出一种方法来复制 Matlab 中的 FindInstance 功能?

【问题讨论】:

    标签: matlab wolfram-mathematica solver


    【解决方案1】:

    根据 jlandercy 所说,您当然可以使用 MATLAB 的 linprog 函数,这是 MATLAB 的线性规划求解器。 MATLAB 世界中的线性程序可以这样表述:

    您试图在R^n 中找到一个解决方案x,它使目标函数f^{T}*x 受到一组不等式约束、等式约束的影响,并且x 中的每个组件都在上下限之间.因为您想找到满足上述给定约束的最小可能值,所以您真正追求的是:

    由于 MATLAB 仅支持小于的不等式,因此您需要取前两个约束的负数。此外,MATLAB 不支持 strict 不等式,因此您必须执行一个约束,以便检查每个变量是否小于一个小数,也许是什么比如将阈值epsilon 设置为1e-4。因此,有了上述内容,您的公式现在是:

    请注意,我们没有任何上限或下限,因为这些条件已经在等式和不等式约束中得到满足。您现在要做的就是将此问题插入linproglinprog 接受语法如下:

    x = linprog(f,A,b,Aeq,beq);
    

    f 是与目标函数一起使用的系数向量,A 是与不等式一起使用的系数矩阵,b 是每个右侧的系数向量不等式约束和Aeq,beq 与不等式相同,但用于等式约束。 x 将是线性规划问题的解决方案。如果我们将您的问题重新表述为上述矩阵形式,我们现在得到:

    关于线性规划公式,我们现在可以看到 MATLAB 世界中的每个变量需要是什么。因此,在 MATLAB 语法中,每个变量变为:

    f = [1; 1];
    A = [-1 0; 0 -1];
    b = [1e-4; 1e-4];
    Aeq = [1 1];
    beq = 1;
    

    这样:

    x = linprog(f, A, b, Aeq, beq);
    

    我们得到:

    Optimization terminated.
    
    x =
    
        0.5000
        0.5000
    

    如果线性规划不是您想要的,请考虑查看 MATLAB 的 MuPAD 界面:http://www.mathworks.com/help/symbolic/mupad_ug/solve-algebraic-equations-and-inequalities.html - 如果您对此更满意,这或多或少模仿了您在 Mathematica 中看到的内容。


    祝你好运!

    【讨论】:

    • 谢谢。我已经搞砸了一会儿,这应该是一种相对有效的方法。实际上,否定约束允许 >=。至于严格不等式,它比仅使用 eps 稍微复杂一些。例如,如果您要求它使用约束 x+y=1+eps 求解,它将给出 x=y=1/2 因为 eps 小于 linprog 的默认容差(实际上因它选择的算法而异)。所以我现在改用 1e-4。
    • 另外,我在原始问题中提到的 Solve 函数是 MuPAD 的功能之一。我知道他们——我最初希望从这个问题中获得更具体的指导,以了解如何使用 MuPAD/Solve 快速测试是否存在解决一组不等式(有些严格)的解决方案。从我对 Solve 所做的事情来看,它看起来可能比使用 linprog 进行数值计算要慢。
    • @Shane - 是的。我忘记了公差,所以我很高兴你知道了。我最好更新我的帖子以反映这一点。此外,在小型系统(例如您正在处理的系统)上使用linprog...我会说使用linprog 会更有效。感谢您的建设性 cmets,很高兴我能提供帮助!
    【解决方案2】:

    Matlab 不像 Mathematica 那样是符号求解器,因此您不会得到精确的解,而是得到数值近似。无论如何,如果您要解决示例中的线性规划(单纯形),您应该使用linprog 函数。

    【讨论】:

    • 虽然我一般同意你的区别,但 Matlab 确实有符号求解器,包括 Solve。我可以使用 linprog,但这样做似乎在计算上很浪费,因为当我只需要一个任意的解决方案时,我就要求一个特定的解决方案。真的,我只需要知道一个是否存在——我认为 Solve 会更好。
    • @Shane - 看看 MATLAB 中的 MuPad:mathworks.com/help/symbolic/mupad_ug/… - 这或多或少模仿了 Mathematica 作为符号求解器的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多