fmincon — слишком много ограничений — MATLAB

#matlab #fminsearch

#matlab #fminsearch

Вопрос:

Предположим, у меня есть функция fmincon. Как мы знаем из документации matlab, мы можем накладывать линейные и нелинейные ограничения.

Предположим, теперь у меня есть функция из 3 параметров для оптимизации. И я хочу, чтобы 3 из них были больше 0, а 1 из них больше -1. Мне понадобилось бы 4 ограничения, но я получаю сообщение об ошибке.

Простой пример (рабочий код):

 A=eye(4)
A(4,4)=-1;
b=100*ones(4,1)
b(4,1)= 1
fun = @(x)100*(x(2)-x(1)^2)^2   (1-x(1))^2 x(3);
fmincon(fun,[0,0,0],A,b)
  

Ошибка

Ошибка при использовании fmincon (строка 287) В A должно быть 3 столбца (столбцов).

Странно, что A может иметь только n ограничений (которые вы могли бы добавить с помощью нелинейного)

Спасибо

Комментарии:

1. Пожалуйста, сообщите нам точное сообщение об ошибке, которое вы получаете, а также size параметры, которые вы передаете fmincon .

2. Я добавил простой пример

3. Ваше предположение о инициализации имеет три elt, но ожидается, что матрица A будет работать с 4 elt. Возможно, вы хотели создать матрицу 4×3 (которая будет содержать 4 ограничения неравенства)

4. Александр, ты совершенно прав! Я был очень глуп. Большое спасибо. Я думаю, вы могли бы создать ответ, чтобы другие люди не совершали ту же ошибку. Даже если я не понимаю, почему я не должен давать n начальных значений с n количеством параметров?

Ответ №1:

Ваша функция fun ожидает ровно три входных данных, т. Е. Вектор x всегда будет равен 3×1. Таким образом, ваша начальная точка должна быть вектором 3×1, а не 4×1. fmincon Функция позволяет указать любое количество линейных ограничений вида Ax ≤ b . Здесь это Ax умножение матрицы: каждый столбец в A соответствует одному из измерений x , поэтому A должно быть ровно три столбца. Количество строк может быть любым произвольным числом — хотя, конечно b , должно иметь одинаковое измерение!

Небольшой пример: если у вас есть неравенство 3*x 4*y - z ≤ 1 , то первая строка A равна [3, 4, -1] . И первая запись b is 1 . Теперь давайте создадим дополнительное ограничение, например y ≤ 4 , поэтому вам нужно добавить строку [0, 1, 0] в A и 4 в b . Ваши матрицы

 A = [3, 4, -1;
     0, 1, 0];
b = [1; 4];
  

В вашем случае вам нужно больше условий, чем переменных. Вы можете сделать это, вызвав eye два параметра: количество строк и количество столбцов:

 >> A = eye(4, 3);
A =
     1     0     0
     0     1     0
     0     0     1
     0     0     0
  

и вручную добавьте последнее ограничение:

 A(4,:) = [0, 0, -1];
  

Чтобы реализовать ограничение, согласно которому все параметры должны быть больше 0 и z должны быть меньше 1, вы можете создавать свои матрицы следующим образом:

 A = -eye(4, 3);
A(4,:) = [0, 0, 1];
b = [zeros(3,1); 1];
  

т.е. уравнения:

-1 * x ≤ 0 , что равно x ≥ 0
-1 * y ≤ 0 , что равно y ≥ 0
-1 * z ≤ 0 , что равно z ≥ 0
z ≤ 1

теперь вы можете использовать fmincon :

 >>fmincon(fun, zeros(3,1), A, b);
ans =
    1.0000
    1.0000
    0.0000
  

Комментарии:

1. Почему я должен обязательно указывать начальную точку 4? в противном случае он не просыпается

2. Нет, очень важно: не указывайте 4 отправные точки! Поскольку ваша функция ожидает 3 параметра, укажите 3 отправные точки — как в последнем примере в моем ответе. Ошибка была в вашей матрице A : в ней было 4 столбца вместо 3 столбцов. Как объяснено в моем ответе, количество столбцов всегда должно совпадать с количеством параметров, т. Е. 3.

Ответ №2:

Вместо того, чтобы рассматривать два абсолютных ограничения как 4 отдельных линейных ограничения, почему бы не рассматривать их как 2 нелинейных ограничения конкретно. x ^ 2 < 9 ?

Комментарии:

1. Хорошая идея. Можете ли вы добавить пример к своему вопросу, где вы показываете, как это сделать?

2. Я думал об этом, но, на мой взгляд, было странно, что это невозможно решить с помощью линейных ограничений! И я был осторожен по этому поводу