Динамическая задача оптимизации
Под динамическими будем понимать задачи, в которых соотношения между параметрами и целевой функцией выражаются с помощью дифференциальных уравнений или функционалов от функций времени. В качестве первого примера рассмотрим следующую задачу: Задан динамический объект, описываемый дифференциальным уравнением; Входным воздействием на объект является функция времени, содержащая неизвестный параметр : Функция является кусочнолинейной и её вид определяется следующей таблицей значений; Требуется найти такое значение параметра входного воздействия , при котором . Строго говоря, приведенная задача не является задачей на нахождение минимума, но ее можно переформулировать как задачу минмизации при сохранении исходного смысла. Переформулировка заключается в том, что мы потребуем найти такое значение параметра входного воздействия, которое обеспечит минимальное значение . Выполненная переформулировка позволяет использовать при решении поставленной задачи MATLAB – функцию FMINSEARCH. Кроме функции FMINSEARCH будет использована функция ODE45, которая предназначена для численного решения дифференциального уравнения. Решение поставленной задачи реализовано в MATLAB c помощью следующих скриптов: Файл Main7.m %Для определения значения параметра um, программа вызывает %функцию поиска минимума (fminsearch) %Предполагается, что функция fmsfun7, на которую ссылается %fminsearch, вычисляет квадрат состояния объекта, %соответствующего моменту времени t=4 global t t1 x x0 u t1=2; x0=10; um=fminsearch(@fmsfun7, 1) plot(t, x, t, u)
Файл fmsfun7.m %Основное назначение программы – вычислить квадрат значения %состояния объекта, соответствующего моменту времени t=4. %Для вычисления значений состояния объекта используется %функция %ode45 которая реализует метод численного решения %соответствующего дифференциального уравнения. %Функция ode45fun8, на которую ссылается ode45, предназначена %для вычисления значений правой части дифференциального %уравнения объекта. function f=fmsfun7(um) global t t1 x x0 u umax umax=um; t=[]; x=[]; u=[]; [t, x]=ode45(@odefun7, [0 2*t1], [x0]); for i=1: length(t), if t(i)< t1 u(i)=(um/t1)*t(i); else u(i)=-(um/t1)*t(i)+2*um; end end f=x(length(t))*x(length(t));
Файл odefun7.m function f=odefun7(t, x) global t1 umax if t< t1 u=(umax/t1)*t; else u=-(umax/t1)*t+2*umax; end f=-0.5*x+u;
|