В настоящее время я решаю уравнения, и мне нужно найти максимальное значение функции.
Уравнение
v = sqrt(u^2+2*a*s);
где 0.1 <= a <= 1.5
и
u = 2.75;
s = 3.194;
Мне нужно решить последовательность уравнений, где каждый раз у меня есть одно переменное неравенство. Я хочу узнать максимальное значение v
и соответствующее значение a
.
Подход 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
Вы можете видеть, что целевая функция вогнута при осмотре (хотя вторая производная также покажет это). Таким образом, отрицание дает выпуклую функцию, что означает, что локальное решение (оптимальное), возвращаемое fminsearch
, также будет глобальным решением.
fminbnd
находит функцию minimum
u = 2.75;
s = 3.194;
lb = 0.1;
ub = 1.5;
v =@(a) -1*sqrt(u.^2 + 2.*a.*s);
[maximum_a,maximum_v] = fminbnd(v,lb,ub);
maximum_v = -1*maximum_v ;
%% maximum_a = 1.5
%% maximum_v =4.1405
Учитывая значение s, v является монотически возрастающей функцией a, так что максимум v всегда будет иметь место при максимальном значении a.