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

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

Уравнение

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

где 0.1 <= a <= 1.5 и

u = 2.75;
s = 3.194;

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

Учитывая значение s, v является монотически возрастающей функцией a, так что максимум v всегда будет иметь место при максимальном значении a.

dmuir 28.05.2019 12:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
540
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Objective function visualization

  • 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

Отличное решение (+1). Одно примечание для будущие посетители заключается в том, что fminbnd «может демонстрировать медленную сходимость, когда решение находится на границе интервала», согласно документации.

SecretAgentMan 24.05.2019 21:18

Другие вопросы по теме