Matlab 相当于 Mathematica 的 FindInstance

Matlab equivalent to Mathematica's FindInstance

我几乎所有的事情都在 Matlab 中完成,但我还没有想出一个在 Matlab 中复制 Mathematica 的 FindInstance 函数的好方法。例如,使用 Mathematica,我可以输入:

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

它会给我:

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

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

似乎应该有一种方法可以用 Solve 在 Matlab 中复制它。帮助文件中有一些部分是关于求解带条件的参数化解的一组不等式。还有另一节是关于使用 PrincipalValue 仅吐出一个解决方案,但这似乎只是 select 来自有限的解决方案集,而不是提出满足参数的解决方案。

任何人都可以想出一种在 Matlab 中复制 FindInstance 功能的方法吗?

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

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

您寻求在 R^n 中找到一个解决方案 x,该解决方案最小化 objective 函数 f^{T}*x 受一组不等式约束、等式约束和每个组件in x 介于下限和上限之间。因为你想找到满足上述给定约束的最小可能值,所以你真正想要的是:

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

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

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

f 是与 objective 函数一起使用的系数向量,A 是与不等式一起使用的系数矩阵,b 是一个向量每个不等式约束的 right-hand 侧的系数和 Aeqbeq 与不等式相同,但用于等式约束。 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 中看到的内容。


祝你好运!