Подход 1: Числовой (но наивный)
В этом подходе используется анонимная функция с векторизацией, численно вычисляется v
для диапазона возможных a
доразмер шага (точность в a
) 0,01.
В зависимости от требуемой точности можно просто уменьшить stepsize
, пока ответ не сойдет (не прекратит изменение) в пределах допуска.
% MATLAB R2017a
u = 2.75;
s = 3.194;
fh =@(a) sqrt(u.^2 + 2.*a.*s);
aLB = 0.1;
aUB = 1.5;
stepsize = 0.01; % Reduce until your answer converges (stops changing)
a = aLB:stepsize:aUB;
v = fh(a);
[v_max, ind] = max(v) % v_max = 4.1406
a(ind) % a(ind) = 1.5000
Подход 2: Числовой
Этот подход использует линейное наказание для добавления ограничения aLB <= a <= aUB
в целевую функцию для числовой оптимизации с использованием fminsearch
.Обратите внимание, что для fminsearch
требуется начальное предположение для a
и что целевая функция должна быть векторизована.
Это хорошо работает, когда целевая функция выпуклая (более a
).Если целевая функция не является выпуклой, то один из подходов состоит в том, чтобы сделать это много раз из разных начальных точек, а затем принять лучший ответ в качестве своего «лучшего ответа из всех найденных».
Так как мы максимизируем здесь, а fminsearch
только минимизирует, мы вводим знак минуса и минимизируем.Что касается функции штрафа, мы могли бы сделать ее квадратичной или увеличить вес, но мы знаем допустимый диапазон a
, что делает такие методы здесь ненужными.
f2h =@(a) -fh(a) + abs(a-aLB).*(a < aLB) + abs(a-aUB).*(a > aUB);
[a_best, v_max_neg] = fminsearch(f2h,1)
v_max = -vmax_neg
Вы можете видеть, что целевая функция является вогнутой при проверке (хотя 2-ая производная также показала бы это).Таким образом, отрицание дает выпуклую функцию, которая означает, что локальное решение (оптимальное), возвращаемое fminsearch
, также будет глобальным решением.