Стабилизация нелинейной модели маятника с двумя нелинейностями управлениями минимальной интенсивности
Постановка нелинейной задачи. Кусочно-линейная и кусочно-постоянная аппроксимация нелинейностей. Сопровождающая кусочно-линейная задача минимальной интенсивности. Свойства оптимальной стартовой обратной связи. Стабилизация перевернутого маятника.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 28.05.2013 |
Размер файла | 412,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
Учреждение образования
«Гомельский государственный университет
имени Франциска Скорины»
Математический факультет
Кафедра вычислительной математики и программирования
Допущена к защите
Зав. кафедрой__________ А.В. Лубочкин
"____"________________20___г.
Стабилизация нелинейной модели маятника с двумя нелинейностями управлениями минимальной интенсивности
Дипломная работа
Исполнитель
студентка группы ПМ-52 Е. А. Полховская
Научный руководитель
к. ф. - м. н., доцент А. В. Лубочкин
Рецензент
доцент кафедры прикладной
математики БелГУТа,
к.т.н., доцент С. И. Жогаль
Гомель 2013
Реферат
Дипломная работа 62 страницы, 26 источников, 1 рисунок, 1 приложение.
Ключевые слова: нелинейная модель маятника с двумя нелинейностями, перевод маятника в неустойчивое положение равновесия, проблема стабилизации перевёрнутого маятника, сопровождающая кусочно-линейная задача минимальной интенсивности, дискретное управление.
Объект исследования: проблема стабилизации нелинейной модели маятника с двумя нелинейностями управлениями минимальной интенсивности.
Цель дипломной работы: метод стабилизации нелинейной модели маятника с двумя нелинейностями управлениями минимальной интенсивности.
Выводы: изучен метод стабилизации нелинейной модели маятника с двумя нелинейностями управлениями минимальной интенсивности. Метод перевода использует сопровождающую кусочно-линейную задачу минимальной интенсивности. Выбран класс управления. Получена эквивалентная задача линейного программирования переменной структуры и выбран метод её решения. Приведена программа стабилизации нелинейной модели маятника с двумя нелинейностями управлениями минимальной интенсивности.
Содержание
Введение
1. Обзор литературы
2. Постановка нелинейной задачи
3. Кусочно-линейная и кусочно-постоянная аппроксимация нелинейностей
4. Сопровождающая кусочно-линейная задача минимальной интенсивности
5. Свойства оптимальной стартовой обратной связи
6. Оптимальный регулятор
7. Стабилизация перевёрнутого маятника
Заключение
Список использованных источников
Приложение А
Введение
Линейные теории составляют основу многих нелинейных теорий. Однако ими невозможно ограничиться, если иметь в виду нелокальные поведения нелинейных систем. Переход к стабилизации нелинейных систем естественный этап развития теории стабилизации. В дипломной работе и рассматривается проблема стабилизации нелинейной модели маятника с двумя нелинейностями управлениями минимальной интенсивности. Из-за огромного многообразия нелинейных систем рассчитывать на создание общих эффективных численных методов стабилизации нелинейных систем не приходится. Каждая нелинейная система в своем роде уникальна. Общими для разных нелинейных систем могут быть лишь некоторые принципы.
В дипломной работе исследуется задача построения ограниченной обратной связи для перевода с помощью горизонтальных перемещений точки подвеса математического маятника из нижнего устойчивого положения в верхнее неустойчивое и стабилизации в новом положении. Для решения задачи используется позиционное решение вспомогательной задачи оптимального управления. Приводятся результаты работы стабилизатора при различных пределах геометрических ограничений на значения стабилизирующих воздействий.
Цель данной работы описать один принцип стабилизации нелинейных динамических систем, базирующийся на методах оптимального управления, и привести результаты его применения для стабилизации перевернутого маятника.
Как будет видно в дальнейшем, метод состоит в построении программных решений серии близких задач оптимального управления, возникающих вдоль реализующих траекторий рассматриваемой нелинейной системы. Каждая из этих задач решает задачу перевода маятника в неустойчивое положение равновесия и стабилизация его в новом положении. Именно этому посвящена дипломная работа.
1. Обзор литературы
Стабилизация -- одна из центральных проблем теории управления движением [1]. Классический подход к ее решению состоит в использовании разнообразных достаточных условий асимптотической устойчивости движения [2]. При этом знание подходящей функции Ляпунова позволяет оценить и качество переходных процессов [3]. Задача стабилизации является одной из причин возникновения современной теории управления и в частности теории оптимального управления. Теория оптимального управления за более чем полвека прошла огромный путь. Естественен вопрос, что дают методы оптимального управления для решения классических задач теории регулирования, актуальность которых несомненна и в наши дни. Длительное время применение теории оптимального управления к решению задач регулирования и стабилизации сдерживалось отсутствием эффективных методов синтеза оптимальных систем. Задача регулирования в классической постановке состоит в построении обратной связи, которая переводит динамическую систему из окрестности одного состояния равновесия в окрестность другого и стабилизирует систему относительно нового состояния равновесия. Первая часть задачи регулирования явилась источником возникновения современной теории оптимального управления. Вторая часть задачи исследуется в теории управления в рамках теории стабилизации. С созданием математической теории оптимальных процессов [4] появилась возможность построения оптимальных стабилизирующих обратных связей. Первый результат в этой области был получен А.М.Летовым [5] и Р.Калманом [6], которые показали, что оптимальные управления типа обратной связи для линейно-квадратичной задачи оптимального управления с бесконечным горизонтом являются линейными стабилизирующими обратными связями. Линейно-квадратичные задачи с конечным горизонтом для создания стабилизирующих обратных связей были использованы в [7-9]. Указанные примеры синтезирования стабилизирующих обратных связей на базе позиционных решений задач оптимального управления существенным образом опирались на возможность аналитического решения соответствующих задач оптимального управления и поэтому исключали прямые (геометрические) ограничения на стабилизирующие воздействия. Между тем общепризнано, что такие ограничения представляют наиболее типичный элемент современных систем управления.
При использовании в указанной последовательности результатов теории оптимального управления и теории стабилизации для решения задачи регулирования возникают определенные трудности. Прежде всего, задача точного (с заданной точностью) перевода системы в окрестность нового состояния равновесия за фиксированное время не очень естественна для систем, функционирование которых не прекращается после достижения цели и протекает в условиях постоянно действующих возмущений. Далее следует отметить, что очень трудно задать момент перехода от решения задачи оптимального управления к решению задачи стабилизации. В теории оптимального управления, как правило, исследуются процессы конечной продолжительности, при этом основные результаты получены в форме ограниченных программных управлений, которые не характерны ни для теории стабилизации, ни для классической теории автоматического регулирования, решающих свои задачи созданием подходящих обратных связей. В теории стабилизации и в классической теории автоматического регулирования исследуются процессы неограниченной продолжительности, но без учета ограничений на управления, без требований к качеству переходных процессов.
Подход к созданию ограниченных стабилизирующих обратных связей был предложен в [10]. Он базировался на методе реализации оптимальных обратных связей, описанном в [11]. Впоследствии метод стабилизации линейных систем на базе линейных задач оптимального управления был обобщен в направлении использования позиционных решений линейно-квадратичных задач оптимального управления [12]. В дальнейшем возникла необходимость исследования задач стабилизации нелинейных систем [13, 14, 15]. В данной дипломной работе рассматривается стабилизация нелинейной модели маятника с двумя нелинейностями, которая описывается с помощью кусочно-линейной задачи минимальной интенсивности.
2. Постановка нелинейной задачи
Математический маятник -- классический объект нелинейной механики. Задача его стабилизации в малом инерционным моментом на базе линейной модели и линейно-квадратичной задачи оптимального управления решена в [1]. При стабилизации в большом с помощью приложенного к оси подвеса момента линеаризованная модель уже не достаточна и приходится рассматривать нелинейное уравнение [16]
. (2.1)
Задача стабилизации значительно усложняется, если поведением маятника управлять с помощью горизонтальных перемещений оси подвеса. В этом случае уравнение движения имеет вид:
, (2.2)
где - ускорение точки подвеса.
Уравнение (2.2) в отличие от (2.1) содержит две нелинейности и при больших возмущениях () неуправляемо.
Задача подъема маятника из нижнего положения равновесия в верхнее с последующей стабилизацией около нового положения исследовалась в [17, 18]. В этих работах решение задачи построения стабилизирующих обратных связей разбивалось на два этапа. На первом этапе решалась задача подъема маятника в окрестность верхнего положения с помощью накачки энергии, на втором осуществлялась стабилизация с помощью решения линейно-квадратичной задачи оптимального управления.
В данной работе задача стабилизации динамической системы (2.2) как единая решается новым методом.
Рассмотрим динамическую систему, поведение которой в области описывается уравнением
, (2.3)
где - n-вектор-функции, обеспечивающие существование единственного и продолжимого решения , для всех и кусочно-непрерывных управлений .
Функцию
(2.4)
назовем дискретной (с периодом квантования ) стабилизирующей обратной связью, если:
1) ;
2) траектория замкнутой системы
представляет непрерывное решение уравнения
с управлением ;
3) нулевое решение , , уравнения асимптотически устойчиво и - область притяжения состояния равновесия .
Задача построения ограниченной стабилизирующей обратной связи состоит в поиске такой стабилизирующей обратной связи (2.4), которая при заданном , , удовлетворяет ограничению
.
Несмотря на то, что в такой постановке задача стабилизации может иметь бесконечное множество решений (а может и не иметь и одного решения), она не становится тривиальной. Нельзя утверждать и то, что она существенно проще задач оптимального управления из-за того, что в ней нет критерия качества. Во всяком, случае, в литературе не опубликовано эффективных методов ее решения. Когда появятся различные методы решения поставленной задачи, найдутся и способы оценки качества построенных стабилизирующих обратных связей.
В данной работе будет описываться общая схема решения задачи стабилизации нелинейной системы с последующей ее реализацией на конкретной механической системе.
3. Кусочно-линейная и кусочно-постоянная аппроксимация нелинейностей
Если обобщить подход, разработанный для линейного варианта системы, то можно выяснить, что он состоит из двух процедур.
Первая процедура представляет решение задачи стабилизации для кусочно-линейной аппроксимации системы (2.3):
, (3.1)
где - кусочно-линейная функция, аппроксимирующая функцию ; - линейна в каждой из областей - кусочно-постоянная функция, аппроксимирующая функцию ; она постоянна в каждой области
Функция :
1) при ;
2) при проходит через точки и :
, ,
, ,
;
3) при проходит через точки и (см. п.4) :
, ,
, ;
4) при
(для п.3):
А - коэффициенты соответствующих прямых ломаной .
Точность аппроксимации характеризуется числом
.
Быстрые (прямые и двойственные) алгоритмы решения нескольких типов сопровождающих задач, разработанные в [19] для линейных систем, можно обобщить на кусочно-линейную систему (3.1). Это позволяет, следуя [20], реализовать оптимальные обратные связи в режиме реального времени, т.е. решить задачу стабилизации динамической системы (3.1).
Вторая процедура при решении задачи стабилизации нелинейной системы состоит в решении задачи (3.1) для кусочно-квазилинейной системы
, (3.2)
Асимптотическое решение сопровождающей задачи (5.1) для (3.2) можно строить в режиме реального времени по схеме [19], что позволит увеличить точность решения кусочно-линейной задачи (5.1), (3.1) без увеличения количества подобластей.
При из (3.2) получаем (2.3). Поэтому решение задачи (5.1), (3.2) можно взять в качестве приближенного решения для исходной системы (2.3). При этом, выбирая и строя соответствующее асимптотическое приближение, можно добиться сколь угодно высокой точности приближения.
Выше было показано, что уже реализация одной первой процедуры с довольно грубой аппроксимацией может решить задачу стабилизации непростой нелинейной системы (2.3).
Рассмотрим математический маятник, ось подвеса которого можно перемещать по горизонтальной прямой. В этом случае уравнение движения маятника имеет вид:
(3.3)
где - угол отклонения маятника от вертикального верхнего положения. Состояние является устойчивым нижним положением равновесия системы (3.3), а состояние - неустойчивым верхним положением равновесия.
Уравнение (3.3) представляет частный случай системы
(2.1):
В качестве X возьмем область:
(3.4)
Область (3.4) разобьем, на подобласти:
Выберем следующие аппроксимации функций и :
Аппроксимации , функций представлены на рисунке 3.1 (а, б) соответственно.
a)
б)
Рисунок 3.1 - Аппроксимация нелинейностей
4. Сопровождающая кусочно-линейная задача минимальной интенсивности
В качестве вспомогательной (сопровождающей) задачи оптимального управления в общем виде приведём задачу:
( 4.1)
где к - конкретное целое число.
А теперь рассмотрим конкретный пример.
Пусть заданы: начальное состояние , значения , , . Рассмотрим случай, когда оптимальная траектория задачи (4.1) на фазовой плоскости проходит по четырем областям: I: , II: , III: , IV: . Таким образом, маятник находится в нижнем устойчивом состоянии равновесия . Требуется поднять его в верхнее неустойчивое положение равновесия и удержать его (стабилизировать) в новом положении.
В качестве сопровождающей кусочно-линейной задачи оптимального управления (4.1) возьмем следующую задачу оптимального управления в классе дискретных управлений:
(4.2)
где
-
оптимальные моменты перехода траектории , из областей: I в II; II в III; III в IV.
5. Свойства оптимальной обратной стартовой связи
В данной работе описывается общая схема решения задачи стабилизации нелинейной системы с последующей ее реализацией на конкретной механической системе.
Выберем число (параметр метода) и критерий качества
где если и класс доступных дискретных управлений .
Предположим, что для каждого начального состояния существует дискретное управление которое переводит систему (2.3), , в момент в состояние равновесия .
В классе доступных управлений рассмотрим вспомогательную (сопровождающую) задачу оптимального управления
( 5.1)
Пусть , оптимальное программное управление задачи (5.1), - множество для которых существует решение задачи (5.1).
Функцию
(5.2)
назовем оптимальным (стартовым) управлением типа обратной связи.
Покажем, что (5.2) ограниченная стабилизирующая дискретная обратная связь. Пусть произвольное начальное состояние,
- соответствующее оптимальное программное управление, - значение критерия качества. По определению (5.2), Траектория замкнутой системы
(5.3)
в момент окажется в состоянии , которое получается из решения уравнения
Для состояния управление ... является допустимым в задаче (5.1) и поэтому если ).
Продолжая движение вдоль траектории уравнения (5.3), найдем такое число , что
Таким образом, вдоль любой траектории системы (5.3) положительно-определенная функция , убывает. Ясно, что при . Отсюда, как при доказательстве теоремы Ляпунова об асимптотической устойчивости [2], получаем, что нулевое решение уравнения (5.3) асимптотически устойчиво в
Область , на которой определена обратная связь (5.2), является подобластью . Для любого можно найти такое , что -окрестность множества содержит , т.е. область стабилизации, обеспечиваемая обратной связью (5.2), может быть сделана сколь угодно близкой к максимально возможной.
Как видно из описанной схемы, конструктивное решение связано с эффективным построением обратной связи (5.2). В общем случае надежд на получение аналитического решения (явной формулы) нет. Поэтому остается обобщить подход, разработанный для линейного варианта системы (2.3). Это обобщение состоит из двух процедур, описанных ранее в третьем пункте данной работы.
6. Оптимальный регулятор
Опишем алгоритм работы оптимального регулятора, который в каждом процессе стабилизации способен в режиме реального времени вычислять текущие значения оптимальной обратной связи.
Задача (4.2) задача оптимального программного управления, в ней все элементы известны, и поэтому для начального состояния она может быть решена заранее любым методом, не обращая внимание на затраты машинного времени. Однако, с точки зрения последующего синтеза, задачу (4.2) целесообразно решить адаптивным (прямым или двойственным) методом [21, 22], который кроме оптимального программного управления доставляет оптимальную опору .
В соответствии с (5.2) значение используем в качестве начального сигнала стабилизирующей обратной связи на промежутке времени . Предположим, что регулятор проработал на промежутке времени и замкнутая система в текущий момент времени оказалась в состоянии
Чтобы вычислить текущее значение стабилизирующей обратной связи, регулятору нужно решить задачу (4.2) с с учетом того, что в предыдущий момент , когда система (3.3) находилась в состоянии , регулятор уже решил задачу (4.2) с построив оптимальную опору и вычислив оптимальные моменты перехода Задача (4.2) для соседних моментов и отличается только начальными условиями и это отличие тем меньше, чем меньше . Поэтому наиболее эффективным методом решения задачи (4.2) с является двойственный метод коррекции опоры, если дополнить его оптимизацией по параметрам которую можно осуществить, например, направленным перебором, начиная со значений Построив решение задачи (4.2), получаем реализацию обратной связи на промежутке . Если время, необходимое для коррекции опоры , а, значит, и для вычисления не превосходит , то можно говорить о стабилизации системы в режиме реального времени. В рассматриваемой задаче упомянутая коррекция занимает очень малое время, которое не засекалось.
Описанная процедура была реализована на ПЭВМ. Для системы (3.3) исследовалось влияние параметров задачи , на поведение замкнутой системы. В каждом случае был подсчитан расход топлива (значения критерия качества), необходимый для перевода системы (3.3) из начального состояния в заданное состояние равновесия и расход топлива на реализацию стабилизирующей обратной связи на промежутке системы в этом состоянии.
Обратная связь, построенная в результате кусочно-линейной аппроксимации, хорошо стабилизирует и исходную нелинейную систему.
7. Стабилизация перевёрнутого маятника
Для стабилизации перевёрнутого маятника нам потребуется эквивалентная задача линейного программирования.
Чтобы получить эквивалентную задачу линейного программирования переменной структуры рассмотрим случай, когда оптимальная траектория задачи (3.1) на фазовой плоскости проходит по четырем областям.
В первом области уравнение имеет вид:. Используя обозначения , однородная часть уравнения примет вид:
, , .
Получим фундаментальную матрицу:
, , .
Во второй области уравнение имеет вид:
.
Вводя обозначения, однородная часть уравнения примет вид:
, , .
Вычислим компоненты фундаментальной матрицы:
Получим фундаментальную матрицу:
, , , .
В третьей области уравнение имеет вид:
Если обозначим , то однородная часть уравнения примет вид:
, , .
Вычисляя
получим фундаментальную матрицу:
, , , .
В четвёртой области однородная часть уравнения имеет вид:
, ,
Фундаментальная матрица:
, , .
Пусть имеем , , , .
Рассмотрим случай, когда оптимальная траектория задачи на фазовой плоскости находится в первой области.
Пусть .
Используя формулу Коши и учитывая класс выбранных состояний, исключим из задачи (4.2) переменные состояния:
.
Эти значения получены путём преобразования:
Для краткости записи сделаем замену:.
Получим следующее:
Теперь в рассмотренном классе дискретных управлений в случае, когда оптимальная траектория задачи на фазовой плоскости находится в первой области, получаем:
Пусть . Тогда получаем эквивалентную задачу линейного программирования переменной структуры:
Используя формулу Коши и учитывая класс выбранных состояний, исключим из полученной эквивалентной задачи переменные состояния:
Эти значения получены путём преобразования: для краткости записи сделаем замену:
Получаем:
Теперь в рассмотренном классе дискретных управлений в случае, когда оптимальная траектория задачи на фазовой плоскости находится во второй области, получаем:
Пусть . Тогда получаем эквивалентную задачу линейного программирования переменной структуры:
Однородная часть уравнения имеет вид:
Эти значения получены путём преобразования:
Для краткости записи сделаем замену:
.
Получим следующее:
Теперь в рассмотренном классе дискретных управлений в случае, когда оптимальная траектория задачи на фазовой плоскости находится в третьей области, получаем:
Пусть . Тогда получаем эквивалентную задачу линейного программирования переменной структуры:
Однородная часть уравнения имеет вид:
.
Эти значения получены путём преобразования:
Для краткости записи сделаем замену:
.
Получим следующее:
Теперь в случае, когда оптимальная траектория задачи на фазовой плоскости находится в четвёртой области, получаем:
перевернутый маятник оптимальный стабилизация
Заключение
В данной дипломной работе была рассмотрена одна из нелинейных моделей маятника. Для этой модели была освящена проблема стабилизации маятника в неустойчивом положении равновесия. С целью достижения намеченного результата использовалось позиционное решение задачи минимальной интенсивности. Были рассмотрены кусочно-линейная и кусочно-постоянная аппроксимации нелинейностей, а также произведён выбор класса управления и стабилизация перевёрнутого маятника. В ходе рассмотрения работы была приведена кусочно-линейная задача переменной структуры и эквивалентная задача линейного программирования переменной структуры. В дипломной работе описывается общая схема решения задачи стабилизации нелинейной системы с последующей её реализацией на конкретной механической системе, выбран метод решения этой эквивалентной задачи. А также, приведена программа перевода и стабилизации нелинейной модели маятника с двумя нелинейностями управлениями минимальной интенсивности, проведены численные эксперименты, а результаты оформлены в виде графиков фазовых траекторий.
Список использованных источников
1 Красовский Н.Н. Проблемы стабилизации управляемых движений / Малкин И.Г. Теория устойчивости движения. М.: Наука, 1966.
2 Малкин И.Г. Теория устойчивости движения. М.: Наука, 1966. 530 с.
3 Чапаев Н.Г. О выборе параметров устойчивой механической системы // Прикладная математика и механика. 1951. Т.15. Вып.2.
4 Математическая теория оптимальных процессов / Л.С.Понтрягин, В.Г.Болтянский, Р.В.Гамкрелидзе, Е.Ф.Мищенко. М.: Наука, 1969.
5 Летов A.M. Аналитическое конструирование регуляторов // Автоматика и телемеханика. 1960. Т.21.Ш. С.436-441; 5. С. 561-568, Ж. С. 661 665
6 Калман Р.Е. Об общей теории систем управления. М.: АН СССР, Тр. I Конгресса ИФАК. 1961. Т.1. С. 521 547.
7 Kwon W.N., Pearson А.Е. A modified quadratic cost problem and feedback stabilization of a linear system // IEEE Trans. Automat . Contr., AC 22, 1977.
8 Kwon W.N., Bruckstein A.N., Kailath T. Stabilizing state feedback design via the moving horizon method, Int. J. Contr., V. 37. 1983.
9 Mayne D.Q., Michalska //. Receding horizon control of nonlinear systems // IEEE Trans. Automat. Contr, V.3, №7. P. 814 824.
10 R.Gabasov, F.M.KiriMova, E.A.Ruzhitskaya. Stabilization of dynamical systems with the help of optimization methods // Nonsmooth and discontinuous problems of control and optimization. Proceedings volume from the IFAC Workshop, Chelyabinsk, Russia. 1998. P.35 41.
11 Габасов P., Кириллова Ф.М., Костюкова О.И. Построение оптимальных управлений типа обратной связи в линейной задаче // Доклады АН СССР. 1991. Т.320. Ж. С. 1294 1299.
12 Габасов Р., Лубочкин А.В. Стабилизация линейных динамических систем оптимальными управлениями линейно-квадратичных задач // Прикладная математика и механика. 1998. Т.62. Вып.4.
13 Габасов Р. Применение позиционных решений кусочно-линейно-квадратичных задач для демпфирования и стабилизации маятника / Р. Габасов, Ф.М. Кириллова, А.В. Лубочкин // Известия РАН. Теория и системы управления. - 2002. - № 5. - С. 64 73.
14 Габасов Р. Стабилизация в большом перевернутого маятника / Р. Габасов [и др.] // Известия РАН. Теория и системы управления. - 2003. - № 1. - С. 17 23.
15 Габасов Р. Демпфирование и стабилизация маятника при больших начальных возмущениях / Р. Габасов, Ф.М. Кириллова, Е.А. Ружицкая // Известия РАН. Теория и системы управления. - 2001. - №1. - С. 29 38.
16 Габасов Р., Кириллова Ф.М., Ружицкая Е.А. Стабилизация перевернутого маятника // Доклады НАН Беларуси. 2000. Т.44, т. С. 9 12.
17 Furuta К., Yamakita М., Kobayashi S. Swing-up control of inverted pendulum using pseudo-state feedback // ,5. Systems and Control Eng. 1992. V.206, P. 263 269.
18 Astrom K.J., Furuta K. Swinging up a. pendulum by energy control // Proc. 13th Triennial World Congress. San Francisco, USA. P. 37 42.
19 Конструктивные методы оптимизации / P. Габасов, Ф.М. Кириллова, О.П. Костюкова, А.В. Покатаем // Нелинейные задачи. Мн.: Университетское, 1998. Ч. 5. 390 с.
20 Gabasov R., Kirillova F.M. Real-time construction of optimal closable feedbacks 13th World Congress of IFAC International Federation of Automatic Control, V.D., San Francisca, CA, USA, 1996
21 Габасов Р. Конструктивные методы оптимизации: в 5 ч. Ч. 1. Линейные задачи / Р. Габасов, Ф.М. Кириллова, А.И. Тятюшкин. - Мн.: БГУ, 1983. - 214 с.
22 Габасов Р. Конструктивные методы оптимизации: в 5 ч. Ч. 2. Задачи управления / Р. Габасов, Ф.М. Кириллова. - Мн.: Университетское, 1984. - 204 с.
23 Конструктивные методы оптимизации: в 5 ч. Ч. 4. Выпуклые задачи / Р. Габасов [и др.]. - Мн.: Университетское, 1987. - 223 c.
24 Габасов Р. Построение оптимальных управлений типа обратной связи в линейной задаче / Р. Габасов, Ф.М. Кириллова, О.И. Костюкова // Докл. АН СССР. - 1991. - Т. 320, № 6. - С. 1294 1299.
25 Габасов Р. К методам стабилизации динамических систем / Р. Габасов, Ф.М. Кириллова, О.И. Костюкова // Известие РАН. Техническая кибернетика. - 1994. - № 3. - С. 67 77.
26 Лубочкин А.В. Реализация позиционного решения задачи оптимизации линейной системы по негладкому критерию качества / А.В. Лубочкин // Известие РАН. Теория и системы управления. - 1998. - № 1. - С. 64 70.
Приложение А
Код программы
# include <stdio.h>
# include <math.h>
# include <string.h>
# include <process.h>
# include <alloc.h>
# include <conio.h>
#define M 5
#define N 30
#define N1 N+1
#define TBEG 0.0
#define TETA 3.0
#define NX 2
#define pi 3.1415926536
double x[NX] = { pi, 0.0 },
c[N1],b[M],A[M][N1],
dn[N1],dw[N1],u[N1],
u0[N1], ur,J,ga;
int nop, Jop[M],StrZ,
m,NachRe=0,ProgrRe=0,
ii,nnz;
void puN1NRo ( int*, int*, int*, double );
void puRo(int,int,int,double);
void formParam ( int, int, int, double );
void f_x (double, double*, // f1(t)=x2(t)
double* ); //f2(t)=sin(x1(t))- u(t)*cos(x1(t))
//или
//f1(t)=x2(t)
//f2(t)=a(x1(t))-u(t)*b(x1(t))
void FEHL(int, double,double*, void (f_p)(double, double*, double*),
double*, double*,
double*, double*,
double*, double*,
double*, double*);
void RKF45 (int, double, // Метод Рунге-Кутта-Фельдберга
double, double*,
void (f_p)(double, double*, double*), double*,
double*, double*,
double*, double*,
double*, double*,
int*, int*,
int*, int*,
int*, int*,
double*, double*,
double*, double*);
void prifl0 (int*, double*, double*);
FILE *d;
FILE *r;
FILE *ru; // Файл.dat : t, u(t)
FILE *rJ; // Файл.dat : t, J(t)
FILE *rx; // Файл.dat : t, x(t)
void main (void)
{char f_Name_u[13],// Имя файла.dat : t, u(t)
f_Name_J[13],// Имя файла.dat : t, J(t)
f_Name_x[13];// Имя файла.dat : t, x(t)
double tau,h,t,tout,ypx [NX],
hx=0,f1x [NX],f2x [NX],
f3x [NX],f4x [NX],
f5x [NX],rerr=1.0e-12,
aerr = 0.0,savrex = 0,
savaex = 0;
int j,n1,n2,n3,Ostanov,inte,
iflx, jflx, kflx, nfex,
kopx, initx;
//Открытие файлов:
printf ( "\nFileName: " );
scanf ( "%s", f_Name_u );
strcpy ( f_Name_x, f_Name_u );
strcpy ( f_Name_J, f_Name_u );
strcat ( f_Name_u, "_u.dat" );
strcat ( f_Name_J, "_J.dat" );
strcat ( f_Name_x, "_x.dat" );
if ((ru=fopen(f_Name_u,"wt")) == NULL )
{ perror ( f_Name_u );
exit (-1);}
if ((rJ = fopen ( f_Name_J, "wt")) == NULL )
{ perror ( f_Name_J );
exit (-1);}
if((rx = fopen(f_Name_x, "wt")) == NULL )
{ perror ( f_Name_x );
exit (-1);}
tau = TBEG;
//Печать в файл и на экран x0:
fprintf ( rx, "%lf ", tau );
printf ( "\ntau = %lf",tau );
printf ( "x = ( " );
for ( j=0; j<NX; j++ )
{fprintf ( rx, "%lf ",x[j] );
printf ( "%lf ", x[j] );}
fprintf ( rx, "\n" );
printf ( ")\n" );
printf ( "| x(1) - 3pi/4 | = %lf\n",fabs(x[0]-3.0*pi/4.0));
printf ( "| x(1) - 5pi/4 | = %lf\n\n",fabs(x[0]-5.0*pi/4.0) );
//Начальн. формирование некот. параметров конечномерн.задачи:
h = TETA/N; // шаг(длина перем.)
printf ( "h = %lf\n\n", h );
ga = sqrt( 4.0/pi - 1.0 );
StrZ = 1;
printf ( "n1 = " );
scanf ( "%d", &n1 );
printf ( "n2 = " );
scanf ( "%d", &n2 );
printf ( "n3 = " );
scanf ( "%d", &n3 );
//Работа регулятора:
Ostanov = 0;
while ( !Ostanov )
{//Программн. реш. задачи с перем. структурой:
if ( ( StrZ==1 ) || ( StrZ==2 ) || ( StrZ==3 ) )
while (1)
{printf ( "\nСтруктура задачи:\n" );
printf ( "1 -- четыре области: [ 3pi/4, 5pi/4 ]\n" );
printf("[pi/2, 3pi/4]\n" );
printf("[pi/4, pi/2]\n" );
printf("[-pi/4,pi/4]\n\n");
printf ( "2 -- три области:
[pi/2, 3pi/4]\n" );
printf("[ pi/4, pi/2]\n" );
printf("[-pi/4,pi/4]\n\n");
printf("3 -- две области:
[pi/4, pi/2]\n" );
printf("[-pi/4,pi/4]\n\n");
printf("4 -- одна область:
[-pi/4,pi/4]\n\n");
scanf ( "%d", &StrZ );
if ( StrZ==1 )
{ m = M;
break;}
else
if ( StrZ==2 )
{m = M-1;
break;}
else
if ( StrZ==3 )
{ m = M-2;
break;}
else
if ( StrZ==4 )
{ m = M-3;
break;}
else
printf("\nНеправильно выбрана структура !!!\n\n" );}
if ( StrZ==1 )
{printf("\nПараметры конечномерн.з-чи:\n" );
printf("Размеры: m=%d n1=%d n2=%d n3=%d N=%d\n", m, n1, n2, n3, N );
printf( "h = %lf\n", h );
getchar();
getchar();}
if ( StrZ==2 )
{printf ( "\nПараметры конечномерн.з-чи:\n" );
printf ( "Размеры: m=%d n2=%d n3=%d N=%d\n",
m, n2, n3, N );
printf ( "h = %lf\n", h );
getchar();
getchar();}
if ( StrZ==3 )
{printf("\nПараметры конечномерн.з-чи:\n" );
printf("Размеры: m=%d n3=%d N=%d\n", m, n3, N );
printf ( "h = %lf\n", h );
getchar();
getchar();}
puN1NRo ( &n1, &n2, &n3, h );
//Печ. в файл u(t), J(t), x(t) на [tau,tau+h]:
fprintf ( ru, "%lf %lf\n", tau, u[0] );
fprintf(ru,"%lf %lf\n",tau+h, u[0]);
fprintf(rJ,"%lf %lf\n",tau,J);
tout = tau;
printf ( "tau = %lf\n", tau );
while ( tout < tau+h-0.000001 )
{t = tout;
if ( tau + h - tout > 0.1 )
tout += 0.1;
else
tout = tau + h;
printf ( "\nt = %lf", t );
printf("tout = %lf\n",tout );
//getchar();
iflx = 1;
inte = 1;
while (inte)
{RKF45(NX,t,tout, x, f_x, &hx, ypx, f1x, f2x, f3x,f4x, f5x,
&iflx, &nfex, &kopx, &initx, &jflx, &kflx, &rerr, &aerr, &savrex, &savaex);
if ( iflx==2 )
inte = 0;
else
{printf ("x\n");
prifl0 (&iflx, &rerr, &aerr);}}
fprintf ( rx, "%lf ", tout );
printf ( "x = ( " );
for ( j=0; j<NX; j++ )
{fprintf( rx, "%lf ",x[j]);
printf ( "%lf ", x[j] );}
fprintf ( rx, "\n" );
printf ( ") " );
if ( StrZ==1 )
{printf ( "\n" );
printf("|x(1)-3pi/4|=%lf\n",
fabs( x[0]-3.0*pi/4.0 ) );
printf("|x(1)-5pi/4|=%lf\n",
fabs( x[0]-5.0*pi/4.0));}
else
if ( StrZ==2 )
printf("| x(1) - pi/2 |=%lf\n",fabs( x[0]-pi/2.0));
else
if ( StrZ==3 )
printf("| x(1) - pi/4 | = %lf\n",fabs( x[0]-pi/4.0));
else
if ( StrZ==4 )
printf("| x(1) | = %lf\n", fabs( x[0] )); }
tau += h;
printf ( "\n\n\n tau = %lf\n\n\n", tau );
while (1)
{printf ( "Остановить процесс ? ( 1 -- да, 0 -- нет )" );
scanf ( "%d", &Ostanov );
if ((Ostanov==0)||(Ostanov==1))
break;}
} // while( !Ostanov )
fcloseall();
} // main
void puN1NRo ( int *n1, int *n2, // Прогр.упр.задачи пер.стр.
int *n3, double h )
{double J0;
int i, nz1, nz2, nz3,
NachRe,MinLeft,
Umensh,Uvelich,
KorrektN;
nz1 = *n1;
nz2 = *n2;
nz3 = *n3;
//Программн. упр-ие мин. инт.:
if ( ( StrZ==1 ) || ( StrZ==2 ) || ( StrZ==3 ) )
{//Нач. формир. парам. n1,n2,n3
if (( StrZ==1) && (nz1 < m-3))
{if ( !ProgrRe )
{printf ( "\nНачало прогр. решения:\n" );
ProgrRe = 1;
ii = 0;
nnz = nz1;
} // for if ( !ProgrRe )
if ( ProgrRe )
{if ( ii < nnz )
{ ii++;
u[0] = u[ii];
printf ( "\nu0[] =\n" );
for (i=0; i<N; i++)
{printf ( "%10.6lf", u[i] );}
printf ( "\n\nПрограммное решение:\n" );
printf ( "\nu0[0] = u0[%d] = %10.6lf\n",ii,u[0]);
getchar();
} // for if ( ii < nnz1 )
if ( ii == nnz )
{ printf ( "\n\nКонец программного решения\n\n" );
getchar();
ProgrRe = 0;}
} // for if ( ProgrRe )
goto endfunc;
} // for if ( ( StrZ==1 ) && ( nz1 < m-3 ) )
if ((StrZ==2) && (nz2 < m-2))
{if ( !ProgrRe )
{ printf ( "\nНачало программного решения:\n" );
ProgrRe = 1;
ii = 0;
nnz = nz2;
} // for if ( !ProgrRe )
if ( ProgrRe )
{ ii++;
u[0] = u[ii];
printf ( "\nu0[] =\n" );
for (i=0; i<N; i++)
{printf("%10.6lf", u[i]);}
printf ( "\n\nПрограммное решение:\n" );
printf ( "\nu0[0] = u0[%d] = %10.6lf\n",ii, u[0]);
getchar();
} // for if ( ii < nnz2 )
if ( ii == nnz )
{printf ( "\n\nКонец программного решения\n\n" );
getchar();
ProgrRe = 0;}
} // for if ( ProgrRe )
goto endfunc;
} // for if ((StrZ==2)&&(nz2< m-2))
if ((StrZ==3) && (nz3 < m-1))
{if ( !ProgrRe )
{ printf ( "\nНачало программного решения:\n" );
ProgrRe = 1;
ii = 0;
nnz = nz3;
} // for if ( !ProgrRe )
if ( ProgrRe )
{if ( ii < nnz )
{ ii++;
u[0] = u[ii];
printf ( "\nu0[] =\n" );
for (i=0; i<N; i++)
printf ( "%10.6lf", u[i] );}
printf ( "\n\nПрограммное решение:\n" );
printf ( "\nu0[0] = u0[%d] = %10.6lf\n",ii, u[0]);
getchar();
} // for if ( ii < nnz3 )
if ( ii == nnz )
{ printf ( "\n\nКонец программного решения\n\n" );
getchar();
ProgrRe = 0;}
} // for if ( ProgrRe )
goto endfunc;
} // for if ( ( StrZ==3 ) && ( nz3 < m-1 ) )
mm1:NachRe = 0;
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = 1.0/u[N];
NachRe = 1;}
else
{if ( StrZ==1 )
printf("При n1=%d n2=%d n3=%d решение не найдено!\n",nz1,nz2,nz3);
else
if ( StrZ==2 )
printf("При n2=%d n3=%d решение не найдено\n",nz2,nz3);
else
if ( StrZ==3 )
printf("При n3=%d решение не найдено !!!\n",nz3);}
mm2:if ( !NachRe )
if ( StrZ==1 )
{ printf ( "n1 = " );
scanf ( "%d", &nz1 );
printf ( "n2 = " );
scanf ( "%d", &nz2 );
printf ( "n3 = " );
scanf ( "%d", &nz3 );
goto mm1;}
else
if ( StrZ==2 )
{ printf ( "n2 = " );
scanf ( "%d", &nz2 );
printf ( "n3 = " );
scanf ( "%d", &nz3 );
goto mm1;}
else
if ( StrZ==3 )
{ printf ( "n3 = " );
scanf ( "%d", &nz3 );
goto mm1;}
//Оптимизация парам. n1, n2,n3
if ( StrZ==1 )
{printf ( "n1 = %d n2 = %d n3 = %d\n", nz1, nz2, nz3 );
printf("J = %.12lf\n\n\n",J0);
//getchar();
MinLeft = 0; // <--- ---> nz1
while(1) // <--- nz1
{if ( nz1 > 1 )
{while (1)
{printf("Продолжить уменьшение n1?( 1 -- да, 0 -- нет)");
scanf ( "%d", &Umensh );
if ( ( Umensh==0 ) || ( Umensh==1 ) )
break;}
if ( Umensh==0 )
break;
nz1 -= 1;
printf("Размеры: m=%d n1=%d n2=%d n3=%d N=%d\n",m,nz1,
nz2,nz3,N);
getchar();
//Программн. упр-ие миним. инт.:
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf ( "n1 = %d n2 = %d n3 = %d\n",nz1, nz2, nz3 );
printf("J = %.12lf\n\n\n",J);
getchar();
if ( J<J0 )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = J;
MinLeft = 1;}
else
{nz1 += 1;
break;}}
else // for if ( nop==m )
{nz1 += 1;
break;}}
else // for if ( nz1 > 1 )
break;} // while(1)
if ( !MinLeft ) // ---> nz1
{while(1)
{if ( nz1 < nz2-1 )
{while (1)
{ printf ( "Увеличить n1 ? ( 1 -- да, 0 -- нет )" );
scanf ( "%d", &Uvelich );
if ((Uvelich==0)||(Uvelich==1))
break;}
if ( Uvelich==0 )
break;
nz1 += 1;
printf("Размеры: m=%d n1=%d n2=%d n3=%d N=%d\n",m, nz1,
nz2, nz3, N);
getchar();
//Программн. упр-ие мин. инт.:
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf ( "n1 = %d n2 = %d n3 = %d\n",nz1,nz2,nz3 );
printf("J = %.12lf\n\n\n",J);
getchar();
if ( J<J0 )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = J;}
else
{ nz1 -= 1;
break;}}
else // for if ( nop==m )
{ nz1 -= 1;
break;}}
else // for if ( nz1 < nz2-1 )
break;
} // while(1)
} // if ( !MinLeft ) // end for <--- ---> nz1
m1:MinLeft = 0; // <--- ---> nz2
while(1) // <--- nz2
{if ( nz2 > nz1+1 )
{while (1)
{printf("Продолжить уменьшение n2? (1 -- да, 0 -- нет )");
scanf ( "%d", &Umensh );
if ((Umensh==0)||(Umensh==1))
break;}
if ( Umensh==0 )
break;
nz2 -= 1;
printf("Размеры: m=%d n1=%d n2=%d n3=%d N=%d\n", m, nz1, nz2, nz3, N );
getchar();
//Программн. упр-ие миним. инт.:
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf ( "n1 = %d n2 = %d n3 = %d\n",nz1, nz2, nz3 );
printf("J = %.12lf\n\n\n",J);
getchar();
if ( J<J0 )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = J;
MinLeft = 1;}
else
{ nz2 += 1;
break;}}
else //for if( nop==m )
{ nz2 += 1;
break;}}
else // for if (nz2>nz1+1)
break;
} // while(1)
if ( !MinLeft ) // ---> nz2
{while(1)
{if ( nz2 < nz3-1 )
{while (1)
{printf ( "Увеличить n2 ?
( 1 -- да, 0 -- нет )" );
scanf ( "%d", &Uvelich );
if ( ( Uvelich==0 ) || ( Uvelich==1 ) )
break;}
if ( Uvelich==0 )
break;
nz2 += 1;
printf("Размеры: m=%d n1=%d n2=%d n3=%d N=%d\n", m, nz1, nz2, nz3, N );
getchar();
//Программн. упр-ие миним. инт.:
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf("n1 = %d n2 = %d n3 = %d\n",nz1, nz2, nz3);
printf("J = %.12lf\n\n\n",J); getchar();
if ( J<J0 )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = J;}
else
{ nz2 -= 1;
break;}}
else // for if ( nop==m )
{ nz2 -= 1;
break;}}
else // for if (nz2<nz3-1)
break;
} // while(1)
} // if ( !MinLeft ) // end for <--- ---> nz2
MinLeft = 0; // <--- ---> nz3
while(1) // <--- nz3
{if ( nz3 > nz2+1 )
{while (1)
{printf("Продолжить уменьшение n3?(1--да,0--нет)");
if ((Umensh==0)||(Umensh==1))
break;}
if ( Umensh==0 )
break;
nz3 -= 1;
printf("Размеры: m=%d n1=%d n2=%d n3=%d N=%d\n", m, nz1, nz2, nz3, N );
getchar();
//Программн. упр-ие миним. инт.:
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf ( "n1 = %d n2 = %d n3 = %d\n",nz1, nz2, nz3 );
printf("J = %.12lf\n\n\n",J);
getchar();
if ( J<J0 )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = J;
MinLeft = 1; }
else
{ nz3 += 1;
break;}}
else // for if ( nop==m )
{ nz3 += 1;
break;}}
else //for if (nz3>nz2+1)
break;
} // while(1)
if ( !MinLeft ) // ---> nz3
{while(1)
{if ( nz3 < N-1 )
{while (1)
{printf ( "Увеличить n3 ? ( 1 -- да, 0 -- нет )" );
scanf ( "%d", &Uvelich );
if ((Uvelich==0)||(Uvelich==1))
break;}
if ( Uvelich==0 )
break;
nz3 += 1;
printf("Размеры: m=%d n1=%d n2=%d n3=%d N=%d\n", m, nz1, nz2, nz3, N );
getchar();
//Программн. упр-ие миним. инт.:
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf("n1 = %d n2 = %d n3 = %d\n",nz1, nz2, nz3 );
printf("J=%.12lf\n\n\n",J);
getchar();
if ( J<J0 )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = J;}
else
{ nz3 -= 1;
break;}}
else // for if ( nop==m )
{ nz3 -= 1;
break;}}
else //for if (nz3< N-1)
break;
} // while(1)
} // if ( !MinLeft ) // end for <--- ---> nz3
for ( i=0; i<N; i++ )
u[i] = u0[i];
J = J0;
printf ( "n1 = %d n2 = %d n3 = %d\n", nz1, nz2, nz3 );
printf("J = %.12lf\n\n\n",J);
getchar();
KorrektN = 0;
printf("\nИзменить n1, n2, n3?( 1 -- да, 0 -- нет)");
scanf ( "%d", &KorrektN );
if ( KorrektN )
{ printf ( "n1 = " );
scanf ( "%d", &nz1 );
printf ( "n2 = " );
scanf ( "%d", &nz2 );
printf ( "n3 = " );
scanf ( "%d", &nz3 );
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = 1.0/u[N];
printf ( "n1 = %d n2=%d n3 = %d\n",nz1, nz2, nz3 );
printf ("J= %.12lf\n\n\n",J0);
getchar();
goto m1;}
else // for if ( nop==m )
goto mm2;}
} // if ( StrZ==1 )
if ( StrZ==2 )
{printf ( "n2 = %d n3 = %d\n", nz2, nz3 );
printf ("J=%.12lf\n\n\n",J0 );
//getchar();
MinLeft = 0; /* <--- ---> nz2 */ while(1) /* <--- nz2 */
{if ( nz2 > 1 )
{while (1)
{printf("Продолжить уменьшение n2 ? ( 1 -- да, 0 -- нет )");
scanf ( "%d", &Umensh );
if ( ( Umensh==0 ) || ( Umensh==1 ) )
break;}
if ( Umensh==0 )
break;
nz2 -= 1;
printf ( "Размеры: m=%d n2=%d n3=%d N=%d\n",m, nz2, nz3, N );
getchar();
//Программн. упр-ие миним. инт.
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf ( "n2 = %d n3 = %d\n", nz2, nz3 );
printf ("J=%.12lf\n\n\n",J);
getchar();
if ( J<J0 )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = J;
MinLeft = 1;}
else
{ nz2 += 1;
break;}}
else // for if ( nop==m )
{ nz2 += 1;
break;}}
else // for if (nz2 > 1)
break;
} // while(1)
if ( !MinLeft ) // ---> nz2
{while(1)
{if ( nz2 < nz3-1 )
{while (1)
{printf ( "Увеличить n2 ? ( 1 -- да, 0 -- нет )" );
scanf ( "%d", &Uvelich );
if ((Uvelich==0)||(Uvelich==1))
break;}
if ( Uvelich==0 )
break;
nz2 += 1;
printf ( "Размеры: m=%d n2=%d n3=%d N=%d\n",m, nz2, nz3, N );
getchar();
//Программн. упр-ие миним. инт.:
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf ( "n2 = %d n3 = %d\n", nz2, nz3 );
printf("J = %.12lf\n\n\n",J);
getchar();
if ( J<J0 )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = J;}
else
{ nz2 -= 1;
break;}}
else // for if ( nop==m )
{ nz2 -= 1;
break;}}
else // for if (nz2<nz3-1)
break;
} // while(1)
} // if ( !MinLeft ) end for <--- ---> nz2
m2: MinLeft = 0; // <--- ---> nz3
while(1) // <--- nz3
{if ( nz3 > nz2+1 )
{while (1)
{printf("Продолжить уменьшение n3 ? ( 1 -- да,0 -- нет)");
scanf ( "%d", &Umensh );
if ((Umensh==0)||(Umensh==1))
break;}
if ( Umensh==0 )
break;
nz3 -= 1;
printf ( "Размеры: m=%d n2=%d n3=%d N=%d\n",m, nz2, nz3, N );
getchar();
//Программн. упр-ие миним. инт.:
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf ( "n2 = %d n3 = %d\n", nz2, nz3 );
printf("J = %.12lf\n\n\n",J);
getchar();
if ( J<J0 )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = J;
MinLeft = 1;
else
{nz3 += 1;
break;}}
else // for if ( nop==m )
{ nz3 += 1;
break;}}
else // for if (nz3>nz2+1)
break;
} // while(1)
if ( !MinLeft ) // ---> nz3
{while(1)
{if ( nz3 < N-1 )
{while (1)
{ printf ( "Увеличить n3 ? ( 1 -- да, 0 -- нет )" );
scanf ( "%d", &Uvelich );
if ((Uvelich==0)||(Uvelich==1))
break;}
if ( Uvelich==0 )
break;
nz3 += 1;
printf ( "Размеры: m=%d n2=%d n3=%d N=%d\n", m, nz2, nz3, N );
getchar();
//Программн. упр-ие миним. инт.:
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf ( "n2 = %d n3 = %d\n", nz2, nz3 );
printf("J= %.12lf\n\n\n",J );
getchar();
if ( J<J0 )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = J;}
else
{ nz3 -= 1;
break;}}
else // for if ( nop==m )
{ nz3 -= 1;
break;}}
else // for if ( nz3 < N-1 )
break;
} // while(1)
} // if ( !MinLeft ) end for <--- ---> nz3
for ( i=0; i<N; i++ )
u[i] = u0[i];
J = J0;
printf ( "n2 = %d n3 = %d\n", nz2, nz3 );
printf("J=%.12lf\n\n\n",J);
getchar();
KorrektN = 0;
printf ( "\nИзменить n2, n3? ( 1 -- да, 0 -- нет )" );
scanf ( "%d", &KorrektN );
if ( KorrektN )
{printf ( "n2 = " );
scanf ( "%d", &nz2 );
printf ( "n3 = " );
scanf ( "%d", &nz3 );
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = 1.0/u[N];}
printf ( "n2 = %d n3 = %d\n", nz2, nz3 );
printf("J = %.12lf\n\n\n",J0);
getchar();
goto m2;}
} // if ( StrZ==2 )
if ( StrZ==3 )
{printf ( "n3 = %d\n", nz3 );
printf("J=%.12lf\n\n\n",J0 );
//getchar();
m3: MinLeft = 0; // <--- ---> nz3
while(1) // <--- nz3
{if ( nz3 > 1 )
{while (1)
{printf("Продолжить уменьшение n3 ? ( 1 -- да, 0 -- нет )");
scanf ( "%d", &Umensh );
if ((Umensh==0)||(Umensh==1))
break;}
if ( Umensh==0 )
break;
nz3 -= 1;
printf ( "Размеры: m=%d n3=%d N=%d\n",m, nz3, N );
getchar();
//Программн. упр-ие мин. инт.:
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf ( "n3 = %d\n", nz3 );
printf("J=%.12lf\n\n\n",J);
getchar();
if ( J<J0 )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = J;
MinLeft = 1;}
else
{nz3 += 1;
break;}}
else // for if ( nop==m )
{ nz3 += 1;
break;}}
else // for if ( nz3 > 1 )
break;
} // while(1)
if ( !MinLeft ) // ---> nz3
{while(1)
{if ( nz3 < N-1 )
while (1)
{ printf ( "Увеличить n3 ? ( 1 -- да, 0 -- нет )" );
scanf ( "%d", &Uvelich );
if ((Uvelich==0)||(Uvelich==1))
break;}
if ( Uvelich==0 )
break;
nz3 += 1;
printf("Размеры: m=%d n3=%d N=%d\n",m, nz3, N );
getchar();
//Программн. упр-ие мин. инт.:
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf ( "n3 = %d\n", nz3 );
printf("J=%.12lf\n\n\n",J);
getchar();
if ( J<J0 )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = J;}
Else
{ nz3 -= 1;
break;}}
else // for if ( nop==m )
{ nz3 -= 1;
break;}}
else // for if ( nz3 < N-1 )
break;
} // while(1)
} // if ( !MinLeft ) end for <--- ---> nz3
for ( i=0; i<N; i++ )
u[i] = u0[i];
J = J0;
printf ( "n3 = %d\n", nz3 );
printf ("J = %.12lf\n\n\n",J);
getchar();
KorrektN = 0;
printf ( "\nИзменить n3? ( 1 -- да, 0 -- нет ) " );
scanf ( "%d", &KorrektN );
if ( KorrektN )
{ printf ( "n3 = " );
scanf ( "%d", &nz3 );
nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{for ( i=0; i<N; i++ )
u0[i] = u[i];
J0 = 1.0/u[N];}
printf ( "n3 = %d\n", nz3 );
printf ("J=%.12lf\n\n\n",J0);
getchar();
goto m3;}
} // if ( StrZ==3 )}
else // for if ((StrZ==1)||
(StrZ==2 ) || ( StrZ==3 ) )
{ nop = 0;
puRo ( nz1, nz2, nz3, h );
if ( nop==m )
{J = 1.0/u[N];
printf("J=%.12lf\n",J );
getchar();}
else
{printf ("Нет решения !!!\n" );
getchar();}
} //end else for if (( StrZ==1 ) || ( StrZ==2 ) || ( StrZ==3 ))
endfunc:
*n1 = nz1-1;
*n2 = nz2-1;
*n3 = nz3-1;
} // puN1NRo
void puRo ( int n1, int n2, // Прогр.упр. мин.инт.
int n3, double h )
{ int i, j, k;
//Формирование параметров конечномерн. задачи:
formParam ( n1, n2, n3, h );
//Реш.конечномерн.з-чи дв. методом:
//Открытие файла для передачи в прогр. *.pas (двойств.метод)
if ( ( d = fopen ( "d.d", "wt" ) ) == NULL )
{ perror ( "d.d" );
exit (-1);}
//Печать параметров задачи в файл
fprintf(d,"%d %d\n", m, N1 ); // размеры m и N1
for ( i=0; i<m; i++ ) // матр.A, вект.b
{for ( j=0; j<N1; j++ )
fprintf ( d, "%12.6lf ", A[i][j] );
fprintf ( d, "\n" );
fprintf ( d, "%11.6lf %11.6lf\n", b[i], b[i] );}
for ( j=0; j<N1; j++ ) // вект. dn, dw, c
fprintf( d, "%4.1lf %4.1lf %11.6lf\n", dn[j], dw[j], c[j] );
fclose (d);
system ( "lplbig.exe" );
//printf ( "system()\n");
//Открытие файла для чтения из прогр. *.pas (двойств.метода)
if ( ( r = fopen ( "sol.d", "r" ) ) == NULL )
{perror ( "sol.d" );
exit (-1);}
fscanf ( r, "%d", &nop ); // Размер опоры
for ( i=0; i<nop; i++ )
{ fscanf ( r, "%d", &k );
Jop[i] = k-1;}
for (j=0; j<N1; j++)
{ fscanf ( r, "%lf", &ur );
u[j] = ur;}
for (j=0; j<N; j++)
{ u[j] = u[j]/u[N];}
printf ( "\nu0[0] = %10.6lf\n", u[0] );
fclose (r);
printf ( "\nu0[] =\n" );
for ( i=0; i<10; i++ )
printf ( "%7.1lf", u[i] );
printf ( "\n" );
for ( i=10; i<20; i++ )
printf ( "%7.1lf", u[i] );
printf ( "\n" );
for ( i=20; i<N; i++ )
printf ( "%7.1lf", u[i] );
printf ( "\n" );
//getchar();
} // puRo
void formParam ( int n1, int n2, // Форм.парам.конечном.з-чи
int n3, double h )
{ double t1_tn,t1_tw,t2_tn,
t2_tw,t3_tn,t3_tw,
t_tn,t_tw,t2_t1,
t3_t2,t_t3,
te,t1,t2,t3;
int i, j;
for ( j=0; j<N; j++ )
c[j] = 0.0;
c[N] = 1.0;
if ( StrZ==1 )
{t2_t1 = n2*h - n1*h;
t3_t2 = n3*h - n2*h;
t_t3 = N*h - n3*h;
t1 = n1*h;
for ( j=0; j<n1; j++ ) // матрица A
{t1_tn = n1*h - j*h;
t1_tw = n1*h - (j+1)*h;
A[0][j]=cos(t1_tw)-cos(t1_tn);
A[1][j]=sin(ga*t2_t1)*(sin( t1_tn)-sin(t1_tw))/ga;
A[2][j]=sinh(ga*t3_t2)*cos(ga*t2_t1)*(sin(t1_tn)-sin(t1_tw))/ga;
A[3][j]=sinh(t_t3)*cosh(ga*t3_t2)*cos(ga*t2_t1)*(sin(t1_tn)-sin(t1_tw));
A[4][j]=cosh(t_t3)*cosh(ga*t3_t2)*cos(ga*t2_t1)*(sin(t1_tn)- sin(t1_tw));}
for ( j=n1; j<n2; j++ )
{t2_tn = n2*h - j*h;
t2_tw = n2*h - (j+1)*h;
A[0][j]=0.0;
A[1][j]=cos(ga*t2_tw)-cos(ga*t2_tn);
A[2][j]=sinh(ga*t3_t2)*sin(ga*t2_tn)-sin(ga*t2_tw));
A[3][j]=ga*sinh(t_t3)*cosh(ga*t3_t2)*(sin(ga*t2_tn)-sin(ga*t2_tw));
A[4][j]=ga*cosh(t_t3)*cosh(ga*t3_t2)*(sin(ga*t2_tn)-
sin(ga*t2_tw ));}
for ( j=n2; j<n3; j++ )
{t3_tn = n3*h - j*h;
t3_tw = n3*h - (j+1)*h;
A[0][j]=0.0;
A[1][j]=0.0;
A[2][j]=cosh(ga*t3_tw)-cosh(ga*t3_tn);
A[3][j]=ga *sinh(t_t3)*(sinh(ga*t3_tw-sinh(ga*t3_tn));
A[4][j]=ga*cosh(t_t3)*(sinh(ga*t3_tw)-sinh(ga*t3_tn));}
for ( j=n3; j<N; j++ )
{t_tn = N*h - j*h;
t_tw = N*h - (j+1)*h;
A[0][j]=0.0;
A[1][j]=0.0;
A[2][j]=0.0;
A[3][j]=cosh(t_tw)-cosh(t_tn);
A[4][j]=sinh(t_tw -sinh(t_tn);}
A[0][N]=-(3.0*pi/4.0-cos(t1)* x[0]-sin(t1)*x[1]-pi*(1.0-cos(t1)));
A[1][N]=-(pi/2.0-3.0*pi*cos(ga*t2_t1)/4.0+sin(ga*t2_t1)*sin(t1)*
x[0]/ga-sin(ga*t2_t1)*cos(t1)*x[1]/ga-pi*sin(ga*t2_t1)* sin(t1)/ga-(3.0-pi/2.0)*(1.0-cos(ga*t2_t1))/(ga*ga));
A[2][N]=-(pi/4.0-pi*cosh(ga*t3_t2)/2.0+3.0*pi*sinh(ga*t3_t2 )* sin(ga*t2_t1)/4.0+sinh(ga*t3_t2)*cos(ga*t2_t1)*sin(t1)*x[0]/ga-sinh(ga*t3_t2)*cos(ga*t2_t1)*
cos(t1)*x[1]/ga-pi*
sinh(ga*t3_t2)* cos(ga*t2_t1)*sin(t1)/ga-(3.0-pi/2.0)*sinh(ga*t3_t2)*
sin(ga*t2_t1 )/(ga*ga));
A[3][N]=-(-pi*cosh(t_t3)/4.0-pi*ga*sinh(t_t3)*sinh(ga*t3_t2)/2.0+3.0*pi*ga*sinh(t_t3)*
cosh(ga*t3_t2)*sin(ga*t2_t1)/4.0+sinh(t_t3)*cosh(ga*t3_t2)*cos(ga*t2_t1)*sin(t1)*x[0]-sinh(t_t3)*cosh(ga*t3_t2)*
cos(ga*t2_t1)*cos(t1)*x[1]-pi*sinh(t_t3)*cosh(ga*t3_t2)*
cos(ga*t2_t1)*sin(t1)-(3.0-pi/2.0)*sinh(t_t3)*cosh(ga*
t3_t2)*sin(ga*t2_t1)/ga-(pi/2.0-1.0)*sinh(t_t3)*
sinh(ga*t3_t2)/ga );
A[4][N]=-(-pi*sinh(t_t3)/4.0-pi*ga*cosh(t_t3)*sinh(ga*t3_t2)/2.0+3.0*pi*ga*cosh(t_t3)*
cosh(ga*t3_t2)*sin(ga*t2_t1)/4.0+cosh(t_t3)*cosh(ga * t3_t2)*
cos(ga*t2_t1)*sin(t1)*x[0]-cosh(t_t3)*cosh(ga*t3_t2)*
cos(ga*t2_t1)*cos(t1)*x[1]-pi*cosh(t_t3)*cosh(ga*t3_t2)*os(ga*t2_t1)*sin(t1)-(3.0-pi/2.0)*cosh(t_t3)*
cosh(ga*t3_t2)*sin(ga*t2_t1)/ga-(pi/2.0-1.0)*cosh(t_t3)*
sinh( ga*t3_t2)/ga);}
else
if ( StrZ==2 )
{t3_t2 = n3*h - n2*h;
t_t3 = N*h - n3*h;
t2 = n2*h;
for ( j=0; j<n2; j++ )
{ t2_tn = n2*h - j*h;
t2_tw = n2*h - (j+1)*h;
A[0][j]=os(ga*t2_tw)-cos(ga*t2_tn);
A[1][j]=sinh(ga*t3_t2)*(sin(ga*t2_tn)-sin(ga*t2_tw));
A[2][j]=ga*sinh(t_t3)*cosh(ga *t3_t2)*sin(ga*t2_tn)- sin(ga*t2_tw));
A[3][j]=ga*cosh(t_t3)*cosh(ga*3_t2)*(sin(ga*t2_tn)-
sin(ga*t2_tw)); }
for ( j=n2; j<n3; j++ )
{t3_tn = n3*h - j*h;
t3_tw = n3*h - (j+1)*h;
A[0][j]=0.0;
A[1][j]=cosh(ga*t3_tw)-cosh(ga* t3_tn);
A[2][j]=ga*sinh(t_t3)*(sinh(ga*t3_tw)-sinh(ga*t3_tn));
A[3][j]=ga*cosh(t_t3)*(sinh(ga*t3_tw)-sinh(ga*t3_tn));}
for ( j=n3; j<N; j++ )
{t_tn = N*h - j*h;
t_tw = N*h - (j+1)*h;
A[0][j]=0.0;
A[1][j]=0.0;
A[2][j]=cosh(t_tw)-cosh(t_tn);
A[3][j]=sinh(t_tw)-sinh(t_tn);}
// вектор b
A[0][N]=-(pi/2.0-cos(ga*t2)*x[0]-sin(ga*t2)*x[1]/ga-(3.0-pi/2.0)*
Подобные документы
Описание подхода по использованию методов оптимального управления для задачи следящих систем. Сопровождающая линейно-квадратичная задача оптимального управления. Свойства и алгоритм построения оптимальной стартовой обратной связи и дискретного управления.
дипломная работа [871,4 K], добавлен 20.08.2013Обзор методик учета физических и геометрических характеристик тел. Обзор кусочно-линейных и кусочно-постоянных операторов. Методы выделения областей образца с постоянным характером физических свойств. Реализация математической модели на языке C/C++
дипломная работа [748,4 K], добавлен 25.02.2014Определение ускорения свободного падения с помощью физического маятника. Период колебания физического маятника. Нахождение ускорения свободного падения методом наименьших квадратов. Решение задач методами Гаусса-Ньютона и квазиньютоновскими методами.
лабораторная работа [32,4 K], добавлен 29.03.2015Разработка имитационной модели для изучения движения нелинейного маятника с графическим отображением в ГИС Maple в режиме функционирования системы наблюдений без задержки времени. Гармонические и периодические колебания маятника. Теорема Гюйгенса.
курсовая работа [1,3 M], добавлен 29.05.2014Анализ преимуществ и недостатков различных численных методов решения дифференциальных уравнений высших порядков. Обоснование выбора метода Рунге-Кутта четвертого порядка. Разработка программы, моделирующей физическое и математическое поведение маятника.
курсовая работа [1,6 M], добавлен 11.07.2012Исследование характера движения математического маятника в идеальных условиях, то есть без учёта сил сопротивления, что позволяет маятнику совершать гармонические колебания неограниченное количество времени. Рассмотрение алгоритма решения задачи на ЭВМ.
курсовая работа [231,1 K], добавлен 07.03.2013Назначение и возможности пакета MATLAB. Цель интерполирования. Компьютерная реализация решения инженерной задачи по интерполяции табличной функции различными методами: кусочно-линейной интерполяцией и кубическим сплайном, а также построение их графиков.
контрольная работа [388,3 K], добавлен 25.10.2012Значение методов оптимального управления для создания следящей системы. Построение алгоритма работы регулятора, реализующего обратные связи, стабилизирующие систему в равновесии путем реализации обратной связи линейно-квадратичных задач с ограничениями.
дипломная работа [955,3 K], добавлен 15.08.2013Структуры и алгоритмы обработки данных, представленных в виде пирамиды (максимальной или минимальной – по выбору пользователя). Преобразование массива в пирамиду. Включение элемента в пирамиду и удаление элемента из пирамиды. Вывод пирамиды на экран.
курсовая работа [2,4 M], добавлен 16.03.2011Анализ микросхемы МАХ232, принцип ее работы. Особенности программы imagecraft, предназначенной для программирования AVR микроконтроллеров. Основные режимы работы цифро-аналогового преобразователя: выходной ток, выходное напряжение. Листинг программы.
контрольная работа [961,1 K], добавлен 27.03.2012