假设我有一个函数f(X)
,我希望通过约束使其最小化,以便其他一些函数 - A(X) = 0
和B(X) = 0
以及0 < C(X) < pi
。有很多算法可以做到,但为了让我的生活更轻松,我想在matlab中使用内置函数fmincon()
。所以我读了这个文档:
http://www.mathworks.com/help/optim/ug/fmincon.html
但是我不明白我应该如何传递参数来解决具体的问题。我该怎么做?我可以这样做吗?
答案 0 :(得分:1)
使用fmincon的nonlcon参数(我假设你的约束是非线性的?)。然后A(X)
和B(X)
很好,但对于C(X)
,它必须采用c(X) < 0
形式,因此您需要将其分解为该形式的两个约束。
我从elsewhere in the documentation提取了如何为nonlcon
指定函数的示例:
function [c,ceq]=myNonlinearContraints(x)
%First deal with your nonlinear equalities
c(1) = A(X);
c(2) = B(X);
%Then your inequalities transformed to be in the form ceq < 0
ceq(1) = -C(X);
ceq(2) = C(X) - pi;
答案 1 :(得分:0)
查看函数A,B是线性的还是非线性的。也许A(X)只是一个整数,那么解释应该是线性的。如果将线性约束提供为非线性,它确实会产生影响。
如果它们是非线性的,那么创建一个
function [c,ceq] = nonlcon(X)
给出等式约束值(ceq)和不等式约束值(c)。请记住,不等式约束被解释为
ineq(X) < 0
所以你需要以那种方式计算它。
C(X)似乎是一个三角函数,因此它也将是nonlcon函数的一部分。这个nonlcon,你将传递给fmincon作为参数。 Nonlcon被调用为X的特定值,并返回约束值。如果有的话,传递你的下限和上限,并尝试针对不同的初始点x0进行优化。对于某些问题,可以找到多个解决方案。