Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
Методы оптимизации
При решении задач оптимального управления, основанных на классическом вариационном
исчислении или принципе максимума Л.С.Понтрягина, возникает необходимость в оптимизации фyнкции
Гaмильтoнa на каждом шаге интегрирования.
Пакет расширения Optimization Toolbox в Matlab предназначен для решения оптимизационных
задач и систем нелинейных уравнений. В пакете реализованы основные методы оптимизации функций
нескольких переменных.
Пакет дает возможности решать задачи минимизации функций, нахождения решений уравнений,
задачи аппроксимации («подгонки» кривых под экспериментальные данные). Различные типы таких
задач вместе с применяемыми для их решения функциями пакета Optimization Toolbox приведены в
Приложении 1. Обращение к отдельным функциям приведено в Приложении 2.
Сравнить с результатами, полученными при использовании методов Брайсона или Эллерта при
решении задачи АКОР в лабораторной работе №1 и сделать выводы.
2. Используя стандартные процедуры интегрирования дифференциальных уравнений (ode113, ode45
и др. см. Приложение 3), решить задачу выведения космического аппарата (КА) на круговую орбиту, если
уравнения движения КА в плоскости выведения OXстYст (рис.1):
dVx dV y dX dY
=acos , =asin -g, =Vx , =Vy,
dt dt dt dt
_________________________________________________________________________________________________________________ 1
Деменков Н.П. Прямые методы оптимизации и решение краевых задач
Московский государственный технический университет им.Н.Э.Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
где Vx и Vy – горизонтальная и вертикальная составляющие скорости V, a=P/m – ускорение за счет силы
тяги, m=m0- m t – масса КА, – угол между вектором горизонтальной скорости и направлением
- секундный расход топлива, g=9,81 м/с2 - ускорение свободного падения, =3,98602*1014
ускорения a, m
м /с – гравитационная постоянная Земли.
3 2
0 Xст
Рис.1
Таблица 2
1 2 3 4 5 6 7 8 9 10 11 12 13
m 0, т 499 168 47 297 150 103 33 46 84 390 270 180 500
mкон, т 49 17 5 30 15 10 3 5 8 39 27 18 50
m , кг/с 288 320 325 288 320 325 160 150 148 310 320 210 200
P, 103 кн 9,9 2,4 5,83 5,26 3,82 4,2 3,63 6,5 7,0 8,9 2,4 6,0 9,0
Условием окончания процесса интегрирования является одновременное выполнение краевых
условий:
Ф1 = Vy(tk) = 0, Ф2 = Vx(tk) - =0,
r (t k )
которые следует задать аргументом options, с управляющим параметром events, определяющим события,
наступление которых влияет на ход вычислений.
3. Решить, используя метод стрельбы (Приложения 4) и функцию MATLAB bvp4c или bvp5c
(Приложения 5)., одну из краевых задач по указанию преподавателя:
z
y' = x ,
1) 2z 2 z на отрезке [1,2] .
z' = + ,
x ( y − 1) x
y (1) = 0, z (2 ) = 0.321
y' = (z − y )x,
2)
z ' = (z + y )x, на отрезке [0,1] .
y(0) = 1, z (1) = 2.346
y ' = cos( y + 2 z ) + 2,
3) z ' = 2
+ x + 1, на отрезке [0, 0.3].
x + 2 y2
y (0) = 1, z (0.3) = 0.18
y ' = e − (x + z ) + 2 x ,
2 2
4)
z ' = 2 y + z,
2 на отрезке [0, 0.3].
y (0) = 0.5, z (0.3) = 1.547
y' y
5) y ' ' = − + 2 + 1 , y(1) = 0, y’(3) = 3 на отрезке [0,3].
x x
6) y’’- y = ex , y(0) = 0, y’(1) = 2.7183 на отрезке [0,1].
_________________________________________________________________________________________________________________ 2
Деменков Н.П. Прямые методы оптимизации и решение краевых задач
Московский государственный технический университет им.Н.Э.Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
8) y’’- 2y’ = 3ex , y(0.3) = 1.415, y’(0.6) = 8.6938 на отрезке [0.3, 0.6].
Оформление отчета
Отчет по лабораторной работе должен содержать:
1. Название лабораторной работы.
2. Цель исследования.
3. Конкретную постановку задачи оптимизации.
4. Уравнения или структурную схему исследуемых систем.
5. Алгоритм и программу решения задачи оптимизации в Matlab.
6. Алгоритм, программу или схему решения краевой задачи.
7. Результаты решения краевой задачи.
8. Выводы по результатам исследований.
_________________________________________________________________________________________________________________ 3
Деменков Н.П. Прямые методы оптимизации и решение краевых задач
Московский государственный технический университет им.Н.Э.Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
Вопросы:
1. Поставьте задачу линейного программирования.
2. Поставьте задачу нелинейного программирования.
3. В каких случаях применяется метод множителей Лагранжа?
4. В чем состоит суть метода множителей Лагранжа?
5. Какие существуют процедуры оптимизации в пакете Optimization Toolbox?
6. Какие вычислительные проблемы возникают при решении оптимизационной задачи
прямыми методами?
7. Какие существуют методы решения краевых задач?
8 В чем состоит особенность метода Ньютона?
9. Как задаются недостающие начальные условия в методе стрельбы?
10. Приведите схему решения краевой задачи методом стрельбы с использованием
процедуры деления отрезка пополам.
11. Приведите схему решения краевой задачи методом стрельбы с использованием
процедуры Ньютона.
12. Приведите алгоритм решения краевой задачи с помощью процедуры bvp4c.
Литература
1. Дъяконов В.П., Круглов В.В. Математические пакеты расширения MATLAB. Специальный
справочник. – СПб.: Питер, 2001. – 480 с. (Пакет Optimization Toolbox – c. 376-436.)
2. Кетков Ю.Л., Кетков А.Ю., Шульц М.М. MATLAB 7: программирование, численные
методы. — СПб.: БХВ-Петербург, 2005. — 752 с.
3. Сборник лабораторных работ по курсу «Управление в технических системах»: Метод. Указания
к лабораторным работам / Под ред. К. А. Пупкова. - М.: Изд-во МГТУ им. Н.Э.Баумана, 2002. – 72с.
4. Деменков Н.П. Вычислительные методы решения задач оптимального управления на основе
принципа максимума Понтрягина: Учеб. пособие. – М.: Изд-во МГТУ им. Н.Э.Баумана, 2015. – 78с.
5. Деменков Н.П. Вычислительные аспекты решения задач оптимального управления: Учеб.
пособие. – М.: Изд-во МГТУ им. Н.Э.Баумана, 2007. – 171с.
Приложение 1
Типы задач оптимизации, решаемых средствами пакета Optimization Toolbox
Функция
Тип задачи Математическая запись
MATLAB
Скалярная (одномерная) min f (a ), a1 a a 2 fminbnd
минимизация a
Принятые обозначения:
• а – скалярный аргумент; x, γ – в общем случае векторные аргументы;
• f(a), f(x) – скалярные функции; F(x), с(x), сeq(x), K(x,w) – векторные функции;
• A, Aeq, C, H – матрицы;
• b, beq, d, f, w, goal, xdata, ydata – векторы;
xL, xU, – нижняя и верхняя границы области изменения аргумента.
Приложение 2
Обращение к отдельным функциям пакета Optimization Toolbox
Функция fmincon предназначена для поиска минимума скалярной функции многих переменных при наличии
линейных ограничений вида
с(х) < 0, ceq(x) = 0,
А х < b, Aeq x = beq,
lb < x < ub
(задача нелинейною программирования). Функция записывается в виде
x = fmincon(fun,x0,A,b)
x = fmincon(fun,x0,A,b,Aeq,beq)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
Если отсутствуют ограничения на отдельные компоненты x(i) сверху или снизу, то соответствующие
компоненты векторов lb и ub задаются как - (lb(i)=-Inf) или + (ub(i)=Inf).
Нелинейное условие может быть задано с помощью двухкомпонентной функции
[c,ceq]=nonlcon(x),
для которой искомая точка минимума должна удовлетворять двум ограничениям: c(x)0 и ceq(x)=0. Обращение
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
Если какой-то параметр не используется, вместо него задается пустой аргумент ([ ]).
Можно передавать минимизируемой функции fun и функции ограничений nonlcon, кроме аргумента список
дополнительных параметров P1,P2 и т.д.
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options,P1,P2, ...)
[x,fval] = fmincon(...)
[x,fval,exitflag] = fmincon(...)
[x,fval,exitflag,output] = fmincon(...)
[x,fval,exitflag,output,lambda] = fmincon(...)
[x,fval,exitflag,output,lambda,grad] = fmincon(...)
Ускорение вычислительного процесса может быть достигнуто заданием формул вычисления градиента и
/или гессиана.
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(...)
Аргументы и возвращаемые величины практически аналогичны рассмотренным для функции fgoalattain за
следующими исключениями:
1) имеется дополнительная возвращаемая величина grad – градиент функции в точке минимума;
2) имеется возможность задания вычисления гессиана Н (вводом функции options = optimset ('Hessian','on'),
что должно быть отражено в m-файле:
function [f,g,H] = myfun(x)
f = … % Вычисление целевой функции
g = … % Вычисление градиента
Н = … % Вычисление гессиана
3) имеется дополнительная возвращаемая величина hessian – гессиан Н функции в точке минимума;
Если действительно найден минимум, то компоненты градиента достаточно малы, а гессиан –
положительно определенная матрица, в чем можно убедиться с помощью критерия Сильвестра
det(hes)>0.
4) возможны дополнительные опции и имеются различия в их использовании:
o LargeScale – может принимать значения 'off' (no умолчанию) и 'on'. В первом случае используется
алгоритм средней размерности, во втором – алгоритм большой размерности.
Следующие опции используются только при работе с алгоритмом средней размерности:
o DerivativeCheck;
o DiffWaxChange;
o DiffMinChange;
o LineSearchType – задание вида алгоритма одномерной оптимизации.
_________________________________________________________________________________________________________________ 5
Деменков Н.П. Прямые методы оптимизации и решение краевых задач
Московский государственный технический университет им.Н.Э.Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
Опции, используемые только в алгоритме большой размерности:
o Hessian – гессиан (в случае матрицы Гессе, задаваемой пользователем);
o HessPattern – задание гессиана как разреженной матрицы (это может привести к
существенному ускорению поиска минимума);
o MaxPCGIter – максимальное число итераций PCG-алгоритма (preconditioned conjugate gradient);
o PrecondBandWidth – верхняя величина начальных условий для PCG-алгоритма;
o TolPCG – допуск на завершение РСG-итераций;
o TypicalX – типовые величины х;
5) возвращаемая величина output в данном случае имеет дополнительные компоненты:
o output.cgiterations – число PCG-итераций (только при использовании алгоритма большой
размерности);
o output.stepsize – величина конечного шага поиска (только при использовании алгоритма средней
размерности);
o output.firstorderopt – мера оптимальности первого порядка (норма вектора градиента в точке
минимума) – только при использовании алгоритма большой размерности).
Пример 1. Требуется найти минимум функции f(х)= –x1x2x3 при начальном значении х=[10;10;10] и при наличии
ограничении 0 ≤ x1+2x2+2x3 ≤ 72.
Решение:
Вначале создадим m-файл, определяющий целевую функцию:
Function=myfun(x)
F=-x(1)*x(2)*x(3);
Затем запишем ограничения в виде неравенств:
– x1 – 2x2 – 2x3 ≤ 0,
x1 + 2x2 + 2x3 ≤ 72,
или в матричной форме:
А х ≤ b,
где
− 1 − 2 − 2 0
A= , b = .
1 2 2 72
Теперь нахождение решения представляется следующим образом:
>> A=[-1 -2 -2; 1 2 2];
>> b=[0;72];
>> x0=[10;10;10]; % стартовое значение
>> [x,fval]=fmincon(‘myfun’,x0,A,b)
х=
24.0000
12.0000
12.0000
fval =
-3.4560е+003
Функция fminsearch позволяет найти минимум функции нескольких переменных без ограничений, то есть
решение задачи безусловной оптимизации с использованием симплексного метода.
Формы записи, аргументы и возвращаемые величины аналогичны рассмотренным ранее:
x = fminsearch(fun,x0)
x = fminsearch(fun,x0,options)
x = fminsearch(fun,x0,options,P1,P2,...)
[x,fval] = fminsearch(...)
[x,fval,exitflag] = fminsearch(...)
[x,fval,exitflag,output] = fminsearch(...)
Пример 2. Найти минимум функции одного аргумента f(x) = sin(x) + 3:
Решение:
>> f = inline('sin(x)+3');
>> x = fminsearch(f,2)
x = 4.712402343750007
Функция fgoalattain служит для решения задачи многомерной векторной оптимизации методом «достижения
цели» и записывается в следующем виде:
• [х,fval,attainfactor,exitflag,output,lambda]=fgoalattain(fun,x0,goal,weight,A
,b,Aeq,beq,lb,ub,nonlcon,options,P1,P2,...)
возвращает не только оптимальное значение векторного аргумента x, но еще и значение целевой функции в
точке минимума fval; коэффициент достижения цели attainfactor; информаци о характере завершения
вычислений exitflag; о результатах оптимизации (выходная структура) output;множители Лагранжа lambda.
решает задачу многомерной оптимизации при заданных векторе целевых функций fun, начальном
приближении х0, заданных векторах целей goal и весов weight; при наличии ограничений в форме линейных
неравенств А х ≤ b; при наличии дополнительных ограничений в форме равенств Aeq x = beq; если ограничения в форме
_________________________________________________________________________________________________________________ 6
Деменков Н.П. Прямые методы оптимизации и решение краевых задач
Московский государственный технический университет им.Н.Э.Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
неравенств отсутствуют, задаются А = [] и b = []; при наличии дополнительных ограничений в форме
нелинейных неравенств или равенств с(х) ≤ 0, ceq(x) = 0, при отсутствии граничных ограничений задаются lb = [] и
ub = []; при наличии дополнительных граничных ограничений lb ≤ х ≤ ub; при задании (изменении) опций (см. ниже);
при задании параметров P1, P2, ..., относящихся к функциям-аргументам;
Аргументы функции:
• fun – векторная функция векторного аргумента. Должна быть задана либо с помощью функции inline,
например:
>> fun = inline('sin(x.*x)');
либо как m-файл, например:
function F = myfun(x)
F = ...
Если задано вычисление градиента (функцией options = optimset('GradObj','on')), то m-файл должен
возвращать не только значение функции F, но и значения градиентов G:
function[F,G] = myfun(x)
F = ... % Вычисление векторной функции
G = ... % Вычисление градиента
• goal – вектор задаваемых целевых значений той же размерности, что и вектор fun;
• weight - вектор весов той же размерности, что и вектор целей, часто принимается равным abs(goal).
• nonlcon – функция, возвращающая значения функций-ограничений, а при необходимости (если задано
options = optimset ('GradConstr' ,'on')) и их градиентов; должна быть оформлена в виде m-файла, например:
function[c,ceq] = mycon(x)
с = ... % Вычисление левых частей нелинейных неравенств
ceq = ... % Вычисление левых частей нелинейных равенств
function [c,ceq,GC,GCeq] = mycon(x)
с = ... % Вычисление левых частей нелинейных неравенств
ceq = ... % Вычисление левых частей нелинейных равенств
GC = ... % Градиенты неравенств
GCeq = ... % Градиенты равенств
• Options – опции (их можно изменять, используя функцию optimset):
o DerivativeCheck – дает проверку соответствия производных, определенных пользователем, их
вычисленным оценкам в виде первых разностей;
o Diagnostics – вод диагностической информации о минимизируемой функции;
o DiffMaxChange – максимальные значения изменений переменных при определении первых разностей;
o DiffMinChange – минимальные значения изменений переменных при определении первых разностей;
o Display – уровень отображения: 'off' – вывод информации отсутствует, 'iter' – вывод информации о
поиске решения на каждой итерации, 'final' – вывод только итоговой информации;
o GoalExactAchieve – определяет количество целей, которые должны быть достигнуты «точно»;
o GradConstr – использование градиентов для ограничений (опция имеет смысл в случае применения
аргумента nonlcon, см. выше), возможные значения – 'off' и 'on';
o GradObj – использование градиента для целевой функции, определяемого пользователем (возможные
значения – 'off' и 'on');
o MaxFunEvals – максимальное число вычислений функции;
o MaxIter – максимальное допустимое число итераций;
o MeritFunction – устанавливает вид функции оценки качества достижения цели (возможные значения
'multiobj' или 'singleobj');
o TolCon – допуск останова вычислений при нарушении ограничений;
o ТоlFun – допуск останова вычислений по величине изменений функции;
o TolX – допуск останова вычислений но величине изменений х;
• attainfactor – коэффициент достижения цели, усредненное значение несоответствий заданным целям,
выраженное в долевом (процентном) виде. Если данный коэффициент отрицательный, цели были «перекрыты», если
положительный – цели не достигнуты;
• exitflag – информация о характере завершения вычислений: если эта величина положительна, то
вычисления завершились нахождением решения х, если она равна нулю, то останов произошел в результате выполнения
предельного числа итераций, если данная величина отрицательна, то решение не найдено;
• lambda – множители Лагранжа, соответственно, для различных типов ограничений:
o lambda.lower – для нижней границы lb;
o lambda.upper – для верхней границы ub;
o lambda.ineqlin – для линейных неравенств;
o lambda.eqlin – для линейных равенств;
o lambda.ineqnonlin – для нелинейных неравенств;
o lambda.eqnonlin – для нелинейных равенств;
• output – информация о результатах оптимизации:
o output.Iterations – число выполненных итераций;
o output.funcCount – число вычислений функции;
_________________________________________________________________________________________________________________ 7
Деменков Н.П. Прямые методы оптимизации и решение краевых задач
Московский государственный технический университет им.Н.Э.Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
o output.algorithm – используемый алгоритм.
Пример 3. Пусть некоторая замкнутая динамическая система 3-го порядка описывается уравнениями:
x =A x +B u , y = Cx , u = Ky
− 0.5 0 0 1 0
где матрицы 1 0 0 ,
A= 0 − 2 10 B = − 2 2 C = 0 0 1
0 1 − 2 0 − 1
характеризующие свойства объекта, являются заданными, и матрица K регулятора – изменяемой.
Качество работы такой системы определяется расположением на комплексной плоскости собственных
чисел замкнутой системы x =(A+BKC) x .
Поставим следующую оптимизационную задачу. При заданном диапазоне изменения элементов матрицы K
от -4 до +4 подобрать эти элементы таким образом, чтобы собственные числа замкнутой системы равнялись [-5,-3,-
1]. В такой постановке задача является многокритериальной (3 критерия) и соответствует задаче достижения цели.
Решение:
На первом этапе создадим m-файл для вычисления собственных чисел матрицы A+BKC.
function F = eigfun(K,A,B,C)% Нахождение собственных чисел
F=sort(A+B*K*C)%Упорядочивание собственных чисел.
end
На втором этапе создадим оптимизирующую функцию
A = [ -0.5 0 0; 0 -2 10; 0 1 -2 ];
B = [ 1 0; -2 2; 0 1 ];
C = [ 1 0 0; 0 0 1 ];
K0=[-1 -1; -1 -1]; % Задание начальных условий
goal=[-5,-3,-1]; % Задание вектора целей
weight = abs(goal);% Задание вектора весовых коэффициентов
lb=-4*ones(size(K0)); % Нижние границы элементов матрицы К
ub=4*ones(size(K0)); % Верхние границы элементов матрицы К
% Установка опции вывода информации
options = optimset('Display','iter');
eigfun = @(K) sort(eig(A+B*K*C));
[K,fval,attainfactor,exitflag,output,lambda] = ...
fgoalattain(eigfun,K0,goal,weight,[ ],[ ],[ ],[ ],lb,ub,[ ],options);
Результаты вычислений:
Attainment Max Line search Directional
Iter F-count factor constraint steplength derivative Procedure
0 6 0 1.88521
1 12 1.031 0.02998 1 0.745
2 18 0.3525 0.06863 1 -0.613
3 24 -0.1706 0.1071 1 -0.223 Hessian modified
4 30 -0.2236 0.06654 1 -0.234 Hessian modified twice
5 36 -0.3568 0.007894 1 -0.0812
6 42 -0.3645 0.000145 1 -0.164 Hessian modified
7 48 -0.3645 0 1 -0.00515 Hessian modified
8 54 -0.3675 0.0001549 1 -0.00812 Hessian modified twice
9 60 -0.3889 0.008327 1 -0.00751 Hessian modified
10 66 -0.3862 0 1 0.00568
11 72 -0.3863 4.116e-013 1 -0.998 Hessian modified twice
fgoalattain stopped because the size of the current search direction is less than
twice the default value of the step size tolerance and constraints are satisfied to
within the default value of the constraint tolerance.
Здесь: Iter – число итераций, F-count –количество вычислений функций, Attainment factor – коэффициент (уровень)
достижения цели, Max constraint - , Line search steplength – шаг поиска , Directional derivative – норма градиента .
Конечное значение матрицы K
K = -4.0000 -0.2564
-4.0000 -4.0000
Итоговые значения собственных чисел eigfun(K)
ans = -6.9313 -4.1588 -1.4099
Итоговое значение коэффициента достижения цели attainfactor
attainfactor = -0.3863,
что говорит о перевыполнении заданных целей в среднем на 38% (сравнение итоговых собственных значений с
заданными это подтверждает)/
Для получения более приемлемого результата зададим опцию точного достижения всех трех целей:
Options = optimset(options,'GoalsExactAchieve',3);
_________________________________________________________________________________________________________________ 8
Деменков Н.П. Прямые методы оптимизации и решение краевых задач
Московский государственный технический университет им.Н.Э.Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
после чего повторим поиск оптимального решения.
В результате получим.
K = -1.5953 1.2040
-0.4201 -2.9047
eigfun(K)
ans = -5.0000 -3.0000 -1.0000
attainfactor = -1.5410e-022.
Промоделируем поведение замкнутой системы при начальных условиях x0 = [1;1;1];
[Times, xvals] = ode45(@(u,x)((A + B*K*C)*x),[0,4],x0);
plot(Times,xvals)
legend('x_1(t)','x_2(t)','x_3(t)','Location','best')
xlabel('t');
ylabel('x(t)');
1.4
x 1(t)
1.2 x 2(t)
x 3(t)
1
0.8
x(t)
0.6
0.4
0.2
0
0 0.5 1 1.5 2 2.5 3 3.5 4
t
Приложение 3
Интегрирование системы обыкновенных дифференциальных уравнений в MATLAB
Интегрирование системы обыкновенных дифференциальных уравнений (ОДУ) в MATLAB осуществляется
чаще всего при помощи функций ode23 или ode45. Для решения жестких задач можно применить функцию ode15s.
Система дифференциальных уравнений должна быть представлена в форме Коши:
dx
= f ( x, t) ,
dt
где x – вектор переменных состояния системы, t – аргумент (обычно время), f – нелинейная вектор-функция от
переменных состояния x и аргумента t.
Результатом интегрирования является матрица проинтегрированных значений фазовых переменных x , в
которой каждый столбец соответствует одной из переменных состояния, а строка содержит значения переменных
состояния, соответствующих определенному шагу интегрирования, т.е. значению вектора t.
Полная форма обращения к функции ode имеет следующий вид:
[tout, xout, varargout] = ode***(fun, tspan, x0, options, varargin).
Здесь: fun - имя m-файла, являющегося функцией MATLAB от t и x, в котором вычисляется вектор функция f(x,t),
т.е. правые части системы дифференциальных уравнений; tspan – вектор, задающий интервал интегрирования [t0
tfinal], t0 – начальное значение интервала, tfinal – конечное; могут быть заданы и промежуточные контрольные
значения независимой переменной, тогда tspan=[t0 t1…tfinal]; x0 – вектор начальных условий (скаляр или вектор
столбец); tout – вектор-столбец контрольных значений независимой переменной; если используется минимальный
вариант tspan, выдаются все значения, которые получались в процессе численного интегрирования; если tspan
содержит и другие значения, кроме t0 и tfinal, то tout=tspan; xout – решения, представленные массивом, в котором
каждая строка соответствует одному элементу в столбце tout; options – аргумент, позволяющий задавать
управляющие параметры; varargin – дополнительные аргументы для вычисления fun; varargout –
дополнительные результаты, возникающие при некоторых вариантах задания options.
Аргумент options позволяет отразить очень много управляющих параметров, которые задаются путем
обращения к функции odeset, аргументом которой является последовательность пар вида <’параметр’,
значение>, в которой название любого из параметров должно быть заключено в апострофы.
Это может быть строка параметров, определяющих значения допустимой относительной (параметр
RelTol) и абсолютной (параметр AbsTol) погрешностей интегрирования. Эти параметры можно не указывать,
если пользователя устраивают значения погрешностей, заданных по умолчанию (1e-3) и (1e-6) соответственно. В
противном случае, перед обращением к процедуре ode следует указать значения погрешностей при помощи процедуры
odeset:
options=odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]).
Параметр InitialStep аргумента options задает начальный шаг, который по умолчанию выбирается
автоматически.
Параметр Mass определяет квадратную матрицу масс M, которая является множителем при производной в
левой части дифференциального уравнения
M(t,x) x =f(t,x).
Значением этого параметра является сама матрица, если она заполнена константами, или указание на m-
_________________________________________________________________________________________________________________ 9
Деменков Н.П. Прямые методы оптимизации и решение краевых задач
Московский государственный технический университет им.Н.Э.Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
файл, содержащий функцию, которая вычисляет матрицу масс, как функцию переменных t и x, например,
options=odeset('Mass',@mass).
Параметр MassSingular позволяет сообщить, является ли (может ли быть) матрица Mass
вырожденной.
Параметр Events задает события, наступление которых влияет на ход вычислений. Значением этого
параметра является указание на m-файл, содержащий функцию, которая отслеживает эти события, например,
options=odeset('Events',@events).
Пример условия окончания процесса интегрирования
function(value, isterminal, direction)=events (t,x)
фиксация времени, когда x(1) проходит через ноль в направлении убывания и прекращения интегрирования
value= x(1); - для слежения за обращением в ноль величины x(1); isterminal=1; - прекратить
интегрирование при value= 0; direction=-1; - при условии убывания value.
В этой функции отслеживается обращение в ноль переменной value (необходимым условием останова
является обращение в ноль некоторого выражения).
Переменная isterminal задается равной 1, если при достижении value=0 интегрирование должно
прекращаться, и равной 0, если интегрирование должно продолжаться.
Переменная direction должна принимать одно из трех значений: 1, если value возрастает при переходе
через ноль; -1, если value убывает при переходе через ноль; 0 при любом обращении value в ноль.
Все три выходные переменные могут быть векторами одинаковой длины. В этом случае их компоненты
соответствуют друг другу: при value(i)=0 интегрирование прекращается, если isterminal(i)=1 и продолжается, если
isterminal(i)=0. Аналогично используются и компоненты direction(i).
_________________________________________________________________________________________________________________ 10
Деменков Н.П. Прямые методы оптимизации и решение краевых задач
Московский государственный технический университет им.Н.Э.Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
Рис.2
При фиксированном y0 решение задачи (1) имеет вид y=y(x.). При x=xk (на рис.2 xk=1) решение зависит только
от :
y( x, ) | x=1 =y(1,).
Используя указанное замечание о решении задачи Коши, о задачу (1) переформулируем следующим образом: найти
такой угол =*, при котором интегральная кривая, выходящая из точки (0,Y0) под углом к оси абсцисс, попадет в
точку (1,Y1):
y(1,)=Y1. (2)
Решение задачи (1) при этом =* совпадает с искомым решением задачи (рис.3), т.е. сводится к решению уравнения
(2) .
Рис.3
Уравнение (2) — это уравнение вида
F()=0, (3)
где F()=y(1,)-Y1.
Для решения уравнения (3) можно использовать любой метод, пригодный для уточнения корней нелинейного
уравнения, например, метод деления отрезка пополам, метод Ньютона (касательных) и др.
Если имеется достаточно хорошее начальное приближение, метод Ньютона предпочтительнее из -за высокой
стоимости вычисления одного значения функции F(α) (нужно решить задачу Коши (2) с данным ).
В случае использования для решения уравнения F()=0 метода Ньютона задают 0, а затем последующие
n вычисляют по рекуррентной формуле
n+1= n - F ( n ) , n=0,1,…
F ' ( n )
Производная F’(n) может быть вычислена по одной из формул численного дифференцирования, например,
первого порядка аппроксимации:
F ( n + h) − F ( n )
F’(n) .
h
При решении уравнений F()=0 методом деления отрезка пополам, задают 0 и 1 так, чтобы разности y(1,0) -
Y1 и y(1,1) - Y1 имели разные знаки. Далее, полагая 2=
0 + 1 , и вычисляют y(1,2). Затем вычисляют 3 по одной из
2
формул: 3= 1 + 2 или 3=
0 + 2 в зависимости от того, имеют ли разности y(1,2) - Y1 и y(1,1) -
2 2
Y1 соответственно разные или одинаковые знаки. Далее вычисляется y(1,3). Процесс продолжается до тех пор, пока
не будет достигнута требуемая точность | y(1,n) - Y1 |<.
Пример 1. Пусть требуется решить краевую задачу следующего вида
tx'' - x' = 3t2; x(1) = 2; x(2) = 9.
_________________________________________________________________________________________________________________ 11
Деменков Н.П. Прямые методы оптимизации и решение краевых задач
Московский государственный технический университет им.Н.Э.Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
Представим данную задачу в виде системы уравнений первого порядка:
x1 ' = x2 ,
x2
x2 ' = 3t + , (1)
t
x1 (1) = 2, x1 (2 ) = 9.
Далее сведем данную задачу к задаче Коши, введя параметр , равный неизвестному значению x2(1).
x1 ' = x 2 ,
x2
x 2 ' = 3t + ,
t
x1 (1) = 2, x 2 (1) = .
Решив полученную систему с фиксированным параметром , мы получим значение x2(2), вообще говоря,
отличающееся от истинного.
Для корректировки параметра рассчитаем его новое значение по формуле
x1 (2)calc − x1 (2)
new = old −
x2 (2)calc
.
Здесь x1(2)calc – полученное в результате расчета значение x1(2). Затем снова решаем систему дифференциальных
уравнений и т.д.
Процесс расчета продолжается до тех пор, пока не будет выполнено условие:
new – old , где – заранее заданная точность расчета.
Замечание. Для того чтобы найти , при котором выполнено граничное условие в точке
t = 2, удобно ввести еще два уравнения, продифференцировав исходную систему по параметру и введя еще две
x1 x
дополнительные переменные x3 = , x4 = 2 .
Для решения краевой задачи создадим в рабочей области MATLAB m-файл boundary.m,, который является
функцией переменных t и x. Текст файла:
function boundary
% Задание начальных условий
x=zeros(2,1);
n=0;
ips=10^(-8);
alpha=2.5;
alpha_old=3.5;
% Условие окончания процесса интегрирования
while abs(alpha-alpha_old)>ips
x0 = [2 alpha];
t0 = 1;
tk = 2;
x1end=9;
% Интегрирование
[t,x]=ode45(@task,[t0 tk],x0);
x1 = x(length(x),1)
x2 = x(length(x),2)
x1endCalc=x1; x2endCalc=x2;
alpha_old=alpha;
alpha=alpha_old-(x1endCalc-x1end)/x2endCalc;
n=n+1;
end
% Печать
figure;
hold on;
plot(t,x(:,1),'-r',t,x(:,2),'-g');
grid on;
n
alpha
% Вычисление правых частей
function dx=task(t,x)
dx= [x(2);...
3*t+x(2)/t];
end
_________________________________________________________________________________________________________________ 12
Деменков Н.П. Прямые методы оптимизации и решение краевых задач
Московский государственный технический университет им.Н.Э.Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
end
После запуска и соответствующего числа итераций программы можно увидеть график решения:
12
11
10
2
1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2
Для контроля выполнения программы выведены конечные значения x1, x2, n и полученное значение .
Приложение 5
Стандартные процедуры для решения краевых задач в MATLAB
Для решения краевых задач можно использовать специальные программы в MATLAB bvp4c или bvp5c.
Функция bvp4c решает краевую задачу для системы обыкновенных дифференциальных уравнений y’=f(y,x).
Решение y=y(x), удовлетворяющее на отрезке [a,b] этому уравнению и граничным условиям, наложенным на
значение функции и/или ее производной на концах отрезка, ищется в форме сеточной функции. Отрезок делится
точками a=x1<x2<…<xn=b (не обязательно равные) и каждой точке xi ставится в соответствие yi. Исходя из
dy
начальных значений x1 и y1, путем аппроксимации производной y’= в каждой точке сетки разностным
dx
y
отношением , строится система уравнений, из которой находятся значения xi. В процессе ее решения сетка xi
x
f
может перестраиваться (в частности, сгущаться), при решении используется матрица-якобиан .
x
Полная форма обращения к функции bvp4c:
sol=bvp4c(odefun,bcfun,solinit, options,P1,P2,…),
Здесь: odefun - функция, вычисляющая вектор правых частей; bcfun - функция, вычисляющая вектор граничных
условий, две компоненты которого представляют собой выражения, обращающиеся в 0 в точках a и b
соответственно; аргументами функции bcfun являются ya и yb – векторы решения y в точках a и b; solinit – выходная
структура функции bvpinit, с помощью которой задаются начальные значения xi и yi; options – аргумент, позволяющий
задавать различные управляющие параметры; P1,P2 и т.д.- дополнительные аргументы для вычисления odefun и bcfun.
solinit=bvpinit(xinit,yinit).
При этом заполняются два поля: solinit.x=xinit и solinit.y=y(i,:).
Здесь xinit – вектор-строка a=xinit(1)<xinit(2)<…<xinit(n)=b, yinit – гипотетические значения для y(i), которые
могут задаваться в одной из двух форм: в виде вектора, каждая компонента которого yinit(i) копируется в качестве
гипотетического решения для всех точек сетки, т.е. y(i,;)=yinit(i) или в виде функции в форме y=quess(x), где x – любая
точка отрезка[a,b], y – вектор, длина которого равна порядку системы дифференциальных уравнений. Для каждой
точки сетки x(i) вычисляется вектор гипотетического решения y(i,:)=quess(x(i));
sol – структура, аналогичная solinit, содержит решение краевой задачи; кроме полей sol.x и sol.y она имеет поле sol.yp,
в котором содержатся значения производной решения (sol.y)’ в точках sol.x.
Управляющие параметры задаются путем обращения к функции bvpset, аргументом которой является
последовательность пар вида < ‘параметр’, значение >, например,
options=bvpset(‘FJacobian’,@FJac).
Параметр FJacobian задает в аналитическом виде якобиан [ f ], где f – функция, вычисляемая в odefun. Параметр
y
BCJacobian задает в аналитическом виде два якобиана [ bc ] и [ bc ], где bc(ya,yb) – функция, вычисляемая в bcfun.
y a yb
Неизвестный параметр или вектор неизвестных параметров вводится с помощью функции bvpinit, форма
обращения к которой
solinit=bvpinit(xinit,yinit, parametrs).
Parametrs – гипотетическое значение неизвестного параметра (вектора), solinit – структура, в которой кроме
полей solinit.x=xinit и solinit.y=y(i,:) заполняется еще одно поле solinit.parametrs=parametrs.
Пример 2. Решить задачу (1), используя функцию bvp4c.
Составим m-файл, содержащий функцию, вычисляющую правые части:
function dxdt=exampl(t,x)
dxdt=[x(2);...
3*t+x(2)/t];
_________________________________________________________________________________________________________________ 13
Деменков Н.П. Прямые методы оптимизации и решение краевых задач
Московский государственный технический университет им.Н.Э.Баумана
Кафедра “Системы автоматического управления”
____________________________________________________________________________________________
a также m-файл, содержащий функцию, задающую граничные условия
function res=border(xa,xb)
res=[xa(1)-2 xb(1)-9];
В качестве начальных значений координаты t выберем с помощью функции linspace пять равноотстоящих
точек на интервале [1,2].
tinit=linspace(1,2,5);
В качестве начальных приближений вектора решений в этих точках выберем xinit=[0 2]. При таком
выборе вектора xinit поле структуры solinit.x будет заполнено копиями исходного вектора. Такой выбор начального
приближения может оказаться не очень удачным. Альтернативный вариант состоит в задании вспомогательной
функции, вычисляющей эти компоненты. Начальное приближение влияет на число итераций. Выбор начального
вектора или вида вспомогательной функции полностью зависит от интуиции пользователя.
Сформируем структуру solinit, используемую при решении задачи:
solinit=bvpinit(tinit,xinit).
Для решения задачи выполним команду
sol=bvp4c(@exampl,@border,solinit).
Если попытаться построить решение краевой задачи в виде графика с помощью команды
plot(sol.t,sol.x(1,:)),
результат получится не очень гладкий – слишком мало точек. Эту трудность можно преодолеть с помощью
дополнительной функции deval, которая, используя информацию, содержащуюся в структуре sol, строит
интерполяционный сплайн Эрмита, для заданного вектора пробных точек tt, который может содержать сколь угодно
точек для обеспечения требуемой гладкости результата. Обращение к функции bvpval имеет вид:
xx=deval(sol,tt),
где xx – значение сплайн-функции в пробных точка. Вектор, содержащий по умолчанию 100 пробных точек, создадим
командой
tt=linspace(1,2).
_________________________________________________________________________________________________________________ 14
Деменков Н.П. Прямые методы оптимизации и решение краевых задач