我在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吐出一个解决方案,但这似乎只是从有限的解决方案集中选择,而不是提出满足参数的解决方案。
有人能想出一种在Matlab中复制FindInstance功能的方法吗?
答案 0 :(得分:4)
基于jlandercy所说的,你当然可以使用MATLAB的linprog
函数,它是MATLAB的线性编程求解器。 MATLAB世界中的线性程序可以这样表达:
您试图在x
中找到一个解决方案R^n
,它最大限度地减少了目标函数f^{T}*x
受到一组不等式约束,等式约束以及x
中的每个组件的影响在下限和上限之间。因为你想找到满足上述约束条件的最小可能值,你真正想要的是:
因为MATLAB只支持小于的不等式,所以你需要接受前两个约束的负数。此外,MATLAB不支持严格不等式,因此您必须执行的是强制约束,以便检查每个变量是否小于数字,可能就像设置一个阈值epsilon
到1e-4
。因此,如上所述,您的配方现在是:
请注意,我们没有任何上限或下限,因为这些条件已经在相等和不等式约束中得到满足。您现在要做的就是将此问题插入linprog
。 linprog
以下列方式接受语法:
x = linprog(f,A,b,Aeq,beq);
f
是与目标函数一起使用的系数向量,A
是与不等式一起使用的系数矩阵,b
是系数的向量,用于每个不等式约束的右侧,Aeq
,beq
,与不等式相同,但对于等式约束。 x
将成为线性规划问题的解决方案。如果我们将您的问题重新形成上述矩阵形式,我们现在得到:
关于线性规划公式,我们现在可以看到MATLAB Universe中的每个变量都需要。因此,在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中看到的内容更舒服。
答案 1 :(得分:1)
Matlab不是像Mathematica那样的符号求解器,所以你不会得到精确的解,只能得到数值近似。无论如何,如果您要解决线性编程(单工),例如在您的示例中,您应该使用linprog函数。