#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. Я думал об этом, но, на мой взгляд, было странно, что это невозможно решить с помощью линейных ограничений! И я был осторожен по этому поводу