Найти максимальное значение функции для ограниченной граничной переменной, используя символьный инструмент Matlab или Matlab? - PullRequest
0 голосов
/ 24 мая 2019

Я сейчас решаю уравнения, и мне нужно найти максимальное значение функции.

Уравнение

v = sqrt(u^2+2*a*s); 

, где 0.1 <= a <= 1.5 и

u = 2.75;
s = 3.194;

Я должен решить последовательность уравнений, где каждый раз у меня есть одно переменное неравенство. Я хочу узнать максимальное значение v и соответствующее значение a.

Ответы [ 2 ]

4 голосов
/ 24 мая 2019

Подход 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, также будет глобальным решением.

Objective function visualization

1 голос
/ 24 мая 2019
  • 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...