Matlab等价于Mathematica的FindInstance

Matlab等价于Mathematica的FindInstance,matlab,wolfram-mathematica,solver,Matlab,Wolfram Mathematica,Solver,我在Matlab中做了几乎所有的事情,但我还没有找到一个在Matlab中复制Mathematica的FindInstance函数的好方法。例如,使用Mathematica,我可以输入: FindInstance[x + y == 1 && x > 0 && y > 0, {x, y}] 它会给我: {{x -> 1/2, y -> 1/2}} 当没有解决方案存在时,它会给我一个空的。在我的工作中,我经常使用它来检查一个不等式系统的解是否

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

FindInstance[x + y == 1 && x > 0 && y > 0, {x, y}]
它会给我:

{{x -> 1/2, y -> 1/2}}
当没有解决方案存在时,它会给我一个空的。在我的工作中,我经常使用它来检查一个不等式系统的解是否存在——我并不真正关心某个特定的解

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


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

Matlab不像Mathematica那样是一个符号解算器,因此你不会得到精确解,而是数值近似解。无论如何,如果你要求解线性规划单纯形,比如在你的例子中,你应该使用函数。

基于jlandercy所说的,你当然可以使用MATLAB的函数,这是MATLAB的线性规划解算器。MATLAB宇宙中的线性程序可以这样表述:

你试图在R^n中找到一个解x,它使目标函数f^{T}*x在一组不等式约束、等式约束下最小化,并且x中的每个分量都在上下界之间有界。因为您希望找到满足上述约束的最小可能值,所以您真正想要的是:

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

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

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接口:这或多或少模拟了你在Mathematica中看到的,如果你觉得更舒服的话。


祝你好运

虽然我大体上同意你的区别,但Matlab确实有符号解算器,包括Solve。我可以使用linprog,但这样做似乎是在浪费计算,因为我要求一个特定的解决方案,而我只需要一个任意的解决方案。真的,我只需要知道一个是否存在——我认为求解会更好。@Shane-看看MATLAB中的MuPad:-这或多或少地模仿了Mathematica作为符号解算器的功能。谢谢。我已经在这上面混了一会儿了,这应该是一个相对有效的方法。事实上,否定约束允许>=。至于严格不等式,它比仅仅使用eps要复杂一些。例如,如果您要求它使用约束x+y=1+eps进行求解,它将给出x=y=1/2,因为eps小于linprog上的默认公差,该公差实际上在它选择的算法之间有所不同。所以我现在使用的是1e-4。另外,我在原始问题中提到的解算函数是MuPAD的一个特性。我意识到了这一点——我最初希望从这个问题中得到更具体的指导,如何使用MuPAD/Solve快速测试一组严格不等式的解的存在性。从我对Solve所做的一点来看,它看起来可能比用linprog进行数值计算要慢。@Shane-这是真的。我忘了公差,所以我很高兴你知道了。我最好更新我的帖子来反映这一点。此外,在小型系统上使用linprog,例如您正在处理的系统。。。我想说使用linprog会更有效。谢谢你 你的建设性意见,我很高兴能帮上忙!