【问题标题】:using fmincon in matlab在 matlab 中使用 fmincon
【发布时间】:2013-06-06 06:18:25
【问题描述】:

假设我有一个函数 f(X),我想通过约束来最小化它,例如一些其他函数 - A(X) = 0B(X) = 00 < C(X) < pi。有很多算法可以做到这一点,但为了让我的生活更轻松,我想在 matlab 中使用内置函数fmincon()。所以我读了这个文档: http://www.mathworks.com/help/optim/ug/fmincon.html

但我不明白我应该如何传递参数来具体解决我的问题。我该怎么做?我能做到吗?

【问题讨论】:

  • 我也可以把我的 C(X) 函数这样 C(X)>0

标签: matlab function minimize


【解决方案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;

【讨论】:

  • 小问题,当我传递参数时,我应该像这样传递它:fmincon(...myNonlinearContraints)?
  • 您需要将其作为函数句柄传递,因此您需要在其前面加上@,即fmincon(...,@myNonlinearContraints)。就像你传递你的目标函数一样。
  • 知道了。我只能通过其中一个?我想不会更多。假设我已经为 B 和 C 定义了 myNonlinearConstraints()。我的 fmincon(...) 会是什么样子?谢谢
  • 不可以将所有非线性约束放在同一个函数中。上面的示例函数包含您的 A、B 和 C
  • @SahilChaudhary 当然,很高兴它有帮助 :) 顺便说一句,如果答案对你有帮助,你应该考虑给它一个 upvote ;)
【解决方案2】:

查看函数 A、B 是线性的还是非线性的。那可能A(X)只是一个积分,那么解释应该是它是线性的。如果您将线性约束作为非线性提供,它确实会产生影响。

如果它们是非线性的,则创建一个

function [c,ceq] = nonlcon(X) 

给出等式约束值(ceq)和不等式约束值(c)。请记住,不等式约束被解释为

ineq(X) < 0

所以你需要这样计算。

C(X) 似乎是一个三角函数,所以它也将是 nonlcon 函数的一部分。这个 nonlcon,您将作为参数传递给 fmincon。 Nonlcon 为 X 的特定值调用,它返回约束值。如果有的话,传递你的下限和上限,并尝试针对不同的初始点 x0 进行优化。对于某些问题,可以找到不止一种解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多