Групповые константы на FMINCON - PullRequest
0 голосов
/ 26 апреля 2020

Я пишу модель, которая должна минимизировать 6 переменных, используя fmincon: o, a, b, w, kappa, gamma. Переменная options определяется следующим образом:

optimset(optimset(@fmincon),'Diagnostics','off','Display','off','LargeScale','off','MaxSQPIter',1000,'TolFun',1e-6)

Переменные уже подчиняются следующим нижним / верхним границам:

  • o, a, b, w между 0 и Inf;
  • kappa и gamma строго положительный между (2 * options.TolCon) и Inf;

Мне нужно для обеспечения соблюдения нескольких ограничений:

  • o, a, b, w должны приблизительно составлять 1;
  • kappa * gamma должно быть приблизительно равно 1;

Если бы мне не пришлось учитывать последние две переменные, я бы, вероятно, использовал параметры A и b fmincon следующим образом:

A = [-eye(3); ones(1,3)];
b = [(zeros(3,1) + (2 * options.TolCon)); (1 - (2 * options.TolCon))];

Но подход к этому подходу с двумя различными ограничениями (аддитивным и мультипликативным) довольно странный, и я действительно понятия не имею, как установить A и b.

Кажется, что параметр nonlcon в fmincon может быть тем, что я ищу, но мне неясно, как его правильно сформулировать.

Спасибо!

1 Ответ

0 голосов
/ 27 апреля 2020

Вы не сможете обойтись, используя ограничения неравенства и нелинейные ограничения . Давайте вспомним вызов функции x_opt = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) и предположим, что ваш вектор оптимизации выглядит следующим образом x = [o, a, b, w, kappa, gamma].

ограничения неравенства : "o , a, b, w должно приблизительно составлять 1 "... Я перевел это, чтобы быть где-то в области допуска размера TOL

TOL = 0.01; % your "approximately"
A = [ ones(1,4) 0 0;
     -ones(1,4) 0 0];
b = [ 1+TOL
     -1+TOL];

Теперь то, что я редко использую:

нелинейные ограничения nonlcon: kappa * gamma must быть примерно равным 1. Это дескриптор функции, возвращающий логический скаляр

 nonlcon = @(x) abs(x(5)*x(6)-1) < TOL
...