Федеральноеагентство по образованию
Московскийгосударственный открытый университет
Чебоксарскийполитехнический институт
Курсовойпроект
подисциплине: «Оптимальные системы автоматического управления»
на тему: «Анализметодов определения минимального, максимального значения функции при наличииограничений»
Выполнил:
студент 5 курса,
ФУИТС, гр. И-52/06,
Терсенидис М. Г.
Проверила:
Изосимова Т. А.
Чебоксары –2010
Задание
Дана несепарабельная квадратичнаяфункция двух переменных:
/>,
где a = 1, b = 0.5, c = 1,d = 0, e = 1, f = 0.333.
Дана начальная точкапоиска A0(x0, y0), где x0= 0.5, y0 = 2.5.
1. Найти безусловныйэкстремум функции f(x,y):
· методомнаискорейшего спуска;
· методомсопряженных направлений.
Точность вычислений:
/>
2. Найти условныйэкстремум этой же функции f(x,y) методомсимплексных процедур при наличии ограничений:
1.5x + у – 3.75 ≥ 0;
0.5х + у — 3.75 ≤ 0;
x — у — 2 ≤ 0.
3. Выполнить синтезоптимальной по быстродействию системы с помощью принципа максимума Понтрягина(критерий по быстродействию), передаточная функция объекта:
/>, где k = 4, T1 = 10, T2 = 5.
· разработать модель для данного типаОСАУ;
· провестиисследование ОСАУ с применением программного продукта «20-sim Pro 2.3»;
· снять переходные и импульсныехарактеристики.
Содержание
Введение
1. Анализметодов определения минимального и максимального значенияфункции многих переменных без ограничений
2. Нахождениеэкстремума функции без ограничения
3. Анализметодов определения минимального, максимального значения функции при наличииограничений
4. Нахождениеэкстремума функции при наличии ограничений
5. Синтез оптимальной по быстродействию системы с помощьюпринципа максимума Понтрягина
Заключение
Списокиспользованной литературы
Приложение
функция переменная экстремум максимум
Введение
При решении конкретнойзадачи оптимизации исследователь прежде всего должен выбрать математическийметод, который приводил бы к конечным результатам с наименьшими затратами навычисления или же давал возможность получить наибольший объем информации обискомом решении. Выбор того или иного метода в значительной степениопределяется постановкой оптимальной задачи, а также используемойматематической моделью объекта оптимизации.
В настоящее время длярешения оптимальных задач применяют в основном следующие методы:
· методы исследования функций классическогоанализа;
· методы, основанные на использованиинеопределенных множителей Лагранжа;
· вариационное исчисление;
· динамическое программирование;
· принцип максимума;
· линейное программирование;
· нелинейное программирование.
Как правило, нельзя рекомендоватькакой-либо один метод, который можно использовать для решения всех безисключения задач, возникающих на практике. Одни методы в этом отношенииявляются более общими, другие — менее общими. Наконец, целую группу методов(методы исследования функций классического анализа, метод множителей Лагранжа,методы нелинейного программирования) на определенных этапах решения оптимальнойзадачи можно применять в сочетании с другими методами, например динамическимпрограммированием или принципом максимума.
Отметим также, чтонекоторые методы специально разработаны или наилучшим образом подходят длярешения оптимальных задач с математическими моделями определенного вида. Так,математический аппарат линейного программирования, специально создан длярешения задач с линейными критериями оптимальности и линейными ограничениями напеременные и позволяет решать большинство задач, сформулированных в такойпостановке.
Динамическоепрограммирование хорошо приспособлено для решения задач оптимизациимногостадийных процессов, особенно тех, в которых состояние каждой стадиихарактеризуется относительно небольшим числом переменных состояния.
Пожалуй, наилучшим путемпри выборе метода оптимизации, наиболее пригодного для решения соответствующейзадачи, следует признать исследование возможностей и опыта применения различныхметодов оптимизации.
1. Анализ методовопределения минимального и максимального значения функции многих переменных безограничений
В данном разделе будетрассматриваться задача безусловной оптимизации, т.е. данная задачахарактеризуется тем, что минимум функции f: Rm ® R ищется на всем пространстве: f(x) ® min, x Î Rm.
Методы безусловнойоптимизации функции многих переменных отличаются относительно высоким уровнемразвития по сравнению с другими методами нелинейного программирования. Условноих можно разбить на три широких класса по типу используемой информации:
· методы прямого поиска, основанные на вычислении только значений целевойфункции;
· градиентные методы, в которых используются точные значения первыхпроизводных f (x);
· методы второгопорядка, в которыхнаряду с первыми производными используются также вторые производные функции f(x).Методы прямогопоиска
Здесь предполагается, чтоf(x) непрерывна и унимодальная. Если рассматриваемые методы применяются дляанализа мультимодальных функций, то приходится ограничиваться идентификациейлокальных минимумов. К особенностям этих методов можно отнести:
· относительная простотасоответствующих вычислительных процедур, которые быстро реализуются и легкокорректируются;
· не требуют явного выраженияцелевой функции в аналитическом виде;
· может требоватьболее значительных затрат времени по сравнению с методами, основанными напроизводных.Метод поиска посимплексу
Процедура симплексногометода базируется на регулярном симплексе. Регулярный симплекс в N-мерномпространстве представляет собой многогранник, образованный N+1 равностоящимидруг от друга точками — вершинами. Так в задаче с двумя переменными симплексомявляется равносторонний треугольник, с тремя — тетраэдр.
Работа алгоритмасимплексного поиска начинается с построения регулярного симплекса впространстве независимых переменных и оценивания значений целевой функции вкаждой из вершин симплекса. При этом отбрасывается вершина, которойсоответствует наибольшее значение целевой функции.
Преимущества метода:
· сравнительная простота логическойструктуры метода и, соответственно, программы для ЭВМ;
· используется сравнительнонебольшое число заранее установленных параметров;
· невысокий уровень требований кЭВМ;
· алгоритм эффективен даже в техслучаях, когда ошибка вычисления значений целевой функции велика, т.к. при егореализации используют наибольшие значения функции в вершинах, а не меньшие.
Недостатки метода:
· возникает проблемамасштабирования, поскольку все координаты вершин симплекса зависят от одногомасштабного множителя. Чтобы избежать такого рода проблем в практическихзадачах, следует промасштабировать все переменные с тем, чтобы их значения былисравнимы по величине;
· алгоритм работает достаточномедленно, т.к. полученная на предыдущих итерациях информация не используетсядля ускорения поиска;
· не существуетпростого способа расширения симплекса. Требуется перерасчет значений целевойфункции во всех точках образца.Градиентныеметоды
Важность прямых методовнеоспорима, т.к. в практических задачах информация о значениях целевой функцииявляется единственно надежной информацией, которой располагает инженер. Однако,если существует и непрерывны целевая функция f(x) и ее первые производные, a также они могут быть записаны в аналитическом виде (или сдостаточно высокой точностью вычислены при помощи численных методов), тоцелесообразно использовать методы, основанные на использовании градиентацелевой функции.
Градиент функции F(x) –это вектор, составляющие которого равны частным производным функции F(x) посоответствующим переменным, т.е.
/>
Направление вектораградиента совпадает с направлением наискорейшего возрастания функции. Векторпротивоположного знака -ÑF(x) называется антиградиентом, его направление совпадает с направлениемнаискорейшего убывания функции.
Матрица вторыхпроизводных Ñ2F(x) –это симметричная квадратная матрица порядка n вторых частных производныхфункции F(x). Эту матрицу называют матрицей Гессе и обозначают H(x) = Ñ2F(x). Ее элемент, расположенный напересечении i-й строки и j-го столбца, равен:
/>
Пусть хТ=[x1,x2,…, xn] – вектор переменных. Для наличия в точке x*локального минимума (максимума) необходимо, чтобы выполнялось равенство ÑF(x*) =0и матрица Гессе H(x*) = Ñ2F(x*) была положительно (отрицательно)полуопределенной, т.е. xTHx ³0 ( xTHx £0).
Достаточным условиемсуществования минимума (максимума) в точке x* является положительная(отрицательная) определённость матрицы Гессе в этой точке, т.е. xTHx>0 ( xTHx
Все методы основаны наитерационной процедуре, реализуемой в соответствии с формулой xk+1 = xk + ak s(xk), где
xk — текущееприближение к решению x*;
ak — параметр, характеризующий длину шага;
s(xk) — направление поиска в N — мерном пространстве управляемых переменных xi,i = 1, 2,..., N.
Способ определения ak и s(xk) на каждой итерации связан сособенностями применяемого метода. Обычно выбор ak осуществляется путем решения задачи минимизации f(x) в направлении s(xk). Поэтомупри реализации градиентных методов необходимо использовать эффективныеалгоритмы одномерной минимизации.Простейший градиентный метод
В основе метода лежитследующая итерационная модификация формулы
xk+1 = xk + a k s(xk),
xk+1 = xk — a k Ñ f(xk),где
a — заданный положительныйкоэффициент;
Ñ f(xk) — градиент целевой функции первого порядка.
Недостатки:
· необходимость выбора подходящегозначения ;
· медленнаясходимость к точке минимума ввиду малости f(xk) в окрестности этой точки.Метод наискорейшего спуска
Свободен от первогонедостатка простейшего градиентного метода, т.к. ak вычисляется путем решения задачиминимизации Ñ f(xk) вдоль направления Ñ f(xk) с помощью одного из методов одномерной оптимизацииxk+1 = xk — a k Ñ f(xk).
Данный метод иногданазывают методом Коши.
Алгоритм характеризуетсянизкой скоростью сходимости при решении практических задач. Это объясняетсятем, что изменения переменных непосредственно зависит от величины градиента,которая стремится к нулю в окрестности точки минимума и отсутствует механизмускорения на последних итерациях. Поэтому, учитывая устойчивость алгоритма,метод наискорейшего спуска часто используется как начальная процедура поискарешения (из точек, расположенных на значительных расстояниях от точкиминимума).Метод сопряженных направлений
Общая задача нелинейногопрограммирования без ограничений сводится к следующему: минимизировать f(x), xÎ En, гдеf(x) являетсяцелевой функцией. При решении этой задачи мы используем методы минимизации,которые приводят к стационарной точке f(x), определяемой уравнением Ñf(x*)=0. Метод сопряженных направлений относится к методамминимизации без ограничений, использующим производные. Задача: минимизировать f(x), xÎ En, гдеf(x) являетсяцелевой функцией n независимых переменных. Важнойособенностью является быстрая сходимость за счет того, что при выборе направленияиспользуется матрица Гессе, которая описывает область топологии поверхностиотклика. В частности, если целевая функция квадратичная, то можно получитьточку минимума не более чем за количество шагов, равное размерности задачи.
Для применения метода напрактике его необходимо дополнить процедурами проверки сходимости и линейнойнезависимости системы направлений. Методы второго порядкаМетод Ньютона
Последовательноеприменение схемы квадратичной аппроксимации приводит к реализацииоптимизационного метода Ньютона по формуле
xk+1 = xk — Ñ2 f(xk-1) Ñ f(xk).
Недостатком методаНьютона является его недостаточная надежность при оптимизации не квадратичныхцелевых функций. Поэтому его часто модифицируют:
xk+1 = xk — ak Ñ2 f(xk-1) Ñ f(xk), где
ak — параметр, выбираемый таким образом, чтобы f(xk+1) ® min.2. Нахождениеэкстремума функции без ограничения
Дана некоторая функция f(х) на открытом интервале (а, в)изменения аргумента х. Предполагаем, что exst внутри этого интервала существует (нужно сказать, чтов общем случае математически заранее это утверждать не могут; однако втехнических приложениях очень часто наличие exst внутри некоторого интервала изменения интервалаизменения аргумента может быть предсказано из физических соображений).
Определение exst. Функция f(x) заданная наинтервале (а, в) имеет в точке x*max(min), если эту точку можно окружить таким интервалом (x*-ε, x*+ε),содержащимся в интервале (а, в), что для всех ее точек х, принадлежащихинтервалу (x*-ε, x*+ε),выполняется неравенство:
f(x) ≤ f(x*) → для max
f(x) ≥ f(x*) → для min
Это определение ненакладывает никаких ограничений на класс функций f(x), что, конечно,очень ценно.
Если ограничится дляфункций f(x), достаточно распространенным, но все же более узким классомгладких функций (под гладкими функциями мы будем понимать такие функции,которые непрерывны вместе со своими производными на интервале измененияаргумента), то можно воспользоваться теоремой Ферма, которая дает необходимыеусловия существования exst.
Теорема Ферма. Пустьфункция f(x) определена в некотором интервале (а, в) и в точке «с»этого интервала принимает наибольшее (наименьшее) значение. Если существует вэтой точке двухсторонняя конечная производная />,то существования необходимо exst />.
Примечание. Двухсторонняяпроизводная характеризуется свойством /> инымисловами, речь идет о том, что в точке «с» производная в пределе одна ита же при подходе к точке «с» слева и справа, т.е. f(x) – гладкая функция.
*В случае /> имеетместо min, а при /> →max. Наконец, если при х=х0 />, то использование 2-ой производнойне помогает и нужно воспользоваться, например, определением exst.
При решении задачи I необходимые условия exst (т.е.теорема Ферма) используется очень часто.
Если уравнение exst /> имеет вещественные корни, то точки, соответствующиеэтим корням, являются подозрительными на exst (но не обязательно самыми экстремумами, ибо имеем дело с необходимыми,а не с необходимыми и достаточными условиями). Так, например, в точке перегиба Хпимеет место />, однако, какизвестно, это не экстремум.
/>
Заметим ещё, что:
· из необходимых условий нельзя сказать,какой вид экстремума найден max или min: для определения этого нужны дополнительныеисследования;
· из необходимых условий нельзя определить,глобальный это экстремум или локальный.
Поэтому, когда находят точкиподозрительные на exst, их дополнительноисследуют, например, на основе определения exst или 2-ой производной.Методнаискорейшего спуска
Метод наискорейшегоспуска является градиентным методом с переменным шагом. На каждой итерациивеличина шага ak выбирается из условия минимумафункции f(x) в направлении спуска, т.е.
/>.
Это условие означает, что движениевдоль антиградиента происходит до тех пор, пока значение функции f (x) убывает. Сматематической точки зрения на каждой итерации необходимо решать задачуодномерной минимизации по a функции
j (a)=f (x(k)-aÑf (x(k)))
Воспользуемся для этого методомзолотого сечения.
Алгоритм метода наискорейшегоспуска состоит в следующем.
1. Задаются координаты начальной точки x(0).
2. В точке x(k), k = 0, 1, 2, …,вычисляется значение градиентаÑf (x(k)).
3. Определяется величина шага ak путем одномернойминимизации по aфункции
j (a)=f (x(k)-aÑf (x(k))).
4. Определяются координаты точки x(k):
xi(k+1)=xi(k)-akÑfi (x(k)), i=1, …, n.
5. Проверяется условие останова итерационного процесса:
||Ñf (x(k+1))||£e .
Если оно выполняется, то вычисленияпрекращаются. В противном случае осуществляется переход к п. 1. Геометрическаяинтерпретация метода наискорейшего спуска представлена на рис. 1.
/>
/>
Рис. 2.1. Блок схемаметода наискорейшего спуска.Реализация метода в программе:
Методнаискорейшего спуска.
/>
Рис. 2.2. Реализацияметода наискорейшего спуска.
Вывод:В нашем случае метод сошёлся за 7 итераций. Точка А7 (0,6641; -1,3313) являетсяточкой экстремума.Метод сопряженных направлений. Для квадратичных функций можно создать градиентный метод, прикотором время сходимости будет конечным и равно числу переменных n.
Назовем некоторое направление/> и /> сопряженными по отношению кнекоторой положительно определенной матрице Гесса H, если выполняется:
/> Если />,
Тогда /> т.е. />. Значит при единичной H, сопряженное направление означает ихперпендикуляр. В общем же случае H неединичная. В общемслучае сопряженность — это применение матрицы Гесса к вектору /> - означает поворот этого векторана некоторый угол /> и его растяжениеили сжатие.
/>
А теперь вектору /> вектор /> ортогонален т. е. сопряженностьэто не ортогональность векторов /> и />, а ортогональность повернутоговектора /> т.е. /> и />.
/>
/>
Рис. 2.3. Блок-схемаметода сопряженных направлений.Реализация метода в программе: Метод сопряженных направлений.
/>
Рис. 2.4. Реализацияметода сопряженных направлений.
/>
Рис. 2.5. График методасопряженных направлений.
Вывод:Точка А3 (0,6666; -1,3333), была найдена за 3 итерации и является точкойэкстремума.3. Анализ методовопределения минимального, максимального значения функции при наличииограничений
Напомним, что общаязадача условной оптимизации выглядит так
f(x) ® min, x Î W,
где W — собственное подмножество Rm.Подкласс задач с ограничениями типа равенств выделяетсятем, что множество задается ограничениями вида
fi(x) = 0, где fi: Rm ®R (i = 1, …, k).
Таким образом,W = {x Î Rm: fi(x) = 0,i = 1, …, k}.
Нам будет удобно писать уфункции f индекс «0». Таким образом, задачаоптимизации с ограничениями типа равенств записывается в виде
f0(x) ® min, (3.1)
fi(x) = 0, i = 1, …, k.(3.2)
Если обозначить теперьчерез f функцию на Rm со значениями в Rk, координатнаязапись которой имеет вид f(x) = (f1(x), …, fk(x)), то (3.1)–(3.2)можно также записать в виде
f0(x) ® min, f(x) = Q.
Геометрически задача сограничениями типа равенств — это задача о поиске наинизшей точки графикафункции f0над многообразием (см. рис. 3.1).
/>
Рис. 3.1.
Точки, удовлетворяющиевсем ограничениям (т. е. точки множества ), обычно называют допустимыми. Допустимая точка x* называется условным минимумом функции f0при ограничениях fi(x)= 0, i = 1, ..., k (или решением задачи (3.1)–(3.2)), если при всех допустимыхточках x f0(x*) f0(x). (3.3)
Если (3.3) выполняетсятолько для допустимых x, лежащих в некоторой окрестности Vx* точки x*,то говорят о локальном условном минимуме. Естественнымобразом определяются понятия условных строгих локальногои глобального минимумов.Правило множителей Лагранжа
Описываемый ниженеобходимый признак локального условного минимума был сформулирован Лагранжем.Определим F: Rm ® Rk+1, положив F(x) = (f0(x), f1(x),..., fk(x)). Заданная на Rm×Rk+1скалярная функция Лагранжа M по определению принимаетзначения в R и задается равенством
M(x, m) =(m, F(x)) = /> mi fi(x) (x Î Rm, m Î Rk+1).
Координаты вектора m, т. е. числа m0, m1,..., mk называются множителямиЛагранжа или двойственными переменными. Оказывается,имеет место следующая теорема, часто именуемая правиломмножителей Лагранжа:
Теорема. Пусть F Î C1 и x* — локальныйусловный минимум функции f0при ограничениях fi(x) = 0 (i= 1, ..., k). Тогда найдется ненулевой вектор m* такой, что x* является стационарной точкой функции xM(x, *):
M¢x(x, m*)|x=x*=/>m*i f ¢i(x*)= Q.
Правило множителейЛагранжа доставляет необходимое условие локального условного минимума и поэтомупозволяет искать точки, «подозрительные» на экстремум. В самом деле,для нахождения точки (x*, m*) Î Rm+k+1,т. е. для нахождения m + k + 1 неизвестных, мы имеем m + k уравнений
f(x) = Q, M¢x(x,l)= Q.
Поскольку, очевидно, множителиЛагранжа можно искать с точностью до постоянного множителя, то в общей ситуацииэтих уравнений хватает для отыскания x*.
Регулярные точки
Допустимая точка x задачи(3.1)–(3.2) называется регулярной, если векторы {f i(x)}ki=1линейнонезависимы. Оказывается, что если x* — регулярная точка минимума, то в векторе *можно считать *0ненулевым, а поскольку множители Лагранжаопределяются с точностью до множителя, можно считать, что *0= 1. Чтобы сформулировать это утверждение более точно, введем следующиеобозначения. Пусть Rk, а функцияЛагранжа в регулярном случае определяется равенством
L(x, l) = f0(x) + (l, f(x)) = f0(x) +/>li fi(x) (x Î Rm, l Î Rk).
Очевидно, L(x, l) = M(x, m), где m = (1, l).
Теорема(правило множителей Лагранжа в регулярном случае)
Пусть F C1, а x* —регулярное локальное решение задачи (3.1)–(3.2). Тогда найдется ненулевойвектор * Rk такой, что
L¢x(x*,l*)= Q.
Одно достаточное условиелокального минимума
Говорят, что линейныйоператор A положительно определен на подпространстве E,если (Ax, x) > 0 при всех x E. Касательнымподпространством к многообразию в точке y называется множество Ty= {x Rm: (f (y), x) = 0, i = 1, ..., k}. Касательной гиперплоскостью к многообразию в точкеy называется множество
W¢y = {x Î Rm: fi(y) + (f ¢(y), xy) = 0, i = 1, ..., k}.
Теорема(достаточное условие минимума)
Пусть F Î C2, а x* — регулярная стационарнаяточка функции Лагранжа, т. е., в частности, L¢(x*, *) = принекотором ненулевом * Rk. Тогда, если Lxx¢¢(x*, l*)положительно определен на Tx*, тоточка x* является локальным решением задачи (3.1)–(3.2).Методы решения задач с ограничениямитипа равенств
Мы будем рассматриватьниже только регулярный случай. Один из естественных подходов к решению задачтипа (3.1)–(3.2) основывается на необходимом условии экстремума — правилемножителей Лагранжа. Если бы можно было утверждать, что решению x* задачи (3.1)–(3.2)соответствует экстремум (x*, *)функции Лагранжа L,то к функции Lможно было бы применять разработанные методы решения безусловных задач. Однако,так утверждать нельзя. В самом деле, если в точке x ограничения не выполняются,то за счет выбора функцию L(поскольку по она линейна) можно сделать как сколь угодно большой положительной, так и скольугодно большой отрицательной. Поэтому естественно искать решение x* как первые mкоординат стационарной точки функции Лагранжа, например, методом Ньютона, мыприходим к методу Ньютона решения задач с ограничениямитипа равенств — это просто метод Ньютона решения уравнения L(x, )= (в регулярном случае):
L¢(xn, ln) + L¢¢(xn, ln)(xn+1 xn, ln+1 — ln) = Q
в«координатной» форме
L¢x(xn,ln)+ L¢¢xx(xn,ln)(xn+1 — xn) + L¢¢xl(xn,ln)(ln+1 — ln) = Q,
L¢l(xn,ln)+ L¢¢xl(xn,ln)(xn+1 — xn) + L¢¢ll(xn,ln)(ln+1 — ln) = Q.
Остается подставить в этиуравнения явные выражения производных функции Лагранжа (учитывая, в частности,что L¢¢ll(xn,ln) = Q):
f ¢0(xn)+ [f ¢(xn)]*ln+ (f ¢¢0(xn)+ />lnif ¢¢i(xn)) (xn+1 xn)+[f ¢(xn)]*(ln+1 ln) = Q,
f(xn) + f ¢(xn)(xn+1 xn) = Q
и мы получаем m+kлинейных уравнений для нахождения m+k неизвестных (xn+1, ln+1).
Описанный метод обладаетвсеми достоинствами и всеми недостатками метода Ньютона решения безусловныхзадач, в частности, он лишь локально сходится и требует большого объемавычислений. Поэтому попытаемся модифицировать градиентный метод, приспособивего к решению условной задачи (3.1)–(3.2). Поскольку, как сказано выше, точка (x*,*) — это седловая точка функции Лагранжа, то естественно пытаться с помощьюградиентного метода минимизировать ее по x, одновременно максимизируя ее по :
xn+1 = xn aL¢x(xn,ln), ln+1 = ln + aL¢l(xn,ln),
или, что то же xn+1 = xn a(f ¢0(xn)+ [f ¢(xn)]*ln), ln+1 = ln + af(xn).
Можно доказать, что этотметод (его обычно называют методом Эрроу — Гурвица) приестественных ограничениях на гладкость и при условии положительнойопределенности оператора L¢¢xx(x*,l*) локально линейносходится.
Описанные методыотносятся к разряду двойственных методов, поскольку витерационном процессе участвуют как прямые (x), так и двойственные (l) переменные.
Можно строить также прямые методы решения условных задач. Например, реализоватьидею о том, что следующее приближение градиентного метода. Приближение xn+1ищется как минимум функции x ® (f ¢0(xn),x xn)+ a||x xn||2на касательной гиперплоскости W¢xn. Здесь «штрафной член» ||x xn||2позволяет «минимизировать» линейную функцию x ® (f ¢0(xn),x xn). Такимобразом, мы приходим к прямому методу
xn+1 = argmin [(f ¢0(xn),x xn) + a||x xn||2], (3.4)
fi(xn) + (f ¢i(xn),x xn) = 0, i = 1, ..., k. (3.5)
Ограничения (3.5) в этомметоде — это, очевидно, линеаризации ограничений (3.2) в точке xn:минимум ищется на касательной гиперплоскости W¢xn.
Один из распространенныхметодов решения задач с ограничениями, с которым мы еще столкнемся — такназываемый метод штрафов. Он позволяет сводить задачу сограничениями к задаче без ограничений и суть его заключается в наказании заневыполнение ограничений. Именно, вместо минимизации функции f0сограничениями (3.2) минимизируется функция fs(x) = f0(x)+ s||f(x)||2 без ограничений, в которой s — положительный параметр.
Теперь рассмотримпостановку задач с ограничениями типа неравенств gj(x) £ 0, j = 1, ..., l (3.6).
/>
Рис. 3.2.
Определяются допустимыеточки, локальный и />глобальный, />строгийи нестрогий минимумы. Так же мы будем использовать обозначения f и g дляфункций из Rm в Rk и Rl, соответственно,определяемые координатами fi и gj. Поэтому задачу (3.1)- (3.3),(3.6) можно записывать в виде
f(x) = Q, g(x) £ Q.
/>(напомним,что неравенство g(x) £ Q означает покоординатные неравенства).
f0(x) ® min, f(x) = Q, g(x)£Q.
Через J(x)будет обозначаться множество индексов так называемых активныхограничений: J(x) = {j Î {1, ..., l}: gj(x) = 0} — это номера ограничений,которые в данной точке существенны.
Теорема(обобщенное правило множителей Лагранжа)
Пусть f0, f, g Î C1, а x* — локальноерешение задачи f0(x) ® min, f(x) = Q, g(x) £ Q.Тогда найдутся такие l*0Î R, l* Î Rk, m* Î Rl, не равныеодновременно нулю, такие, что m*j ³ 0 при j Î J(x*) и
/>l*0f ¢0(x*)+/>l*i f ¢i(x*)+/>m*j g¢j(x*) = Q. (3.7)
Регулярный случай
Так же, как и в случае ограничений-равенств,в случае общей задачи нелинейной оптимизации, необходимый признак, информативентолько в случае, если l*0¹ 0. В этой ситуации можно разделить (3.7) на l*0и, следовательно,считать его равным единице. Это позволяет ввести функцию Лагранжа L: Rm×Rk×Rk® R (в регулярном случае) равенством
(x, l, m) = f0(x) + (l, f(x)) + (m, g(x)).
Условие регулярности вслучае общей задачи выглядит сложнее. Именно, допустимая точка x называется регулярной, если векторы f ¢1(x),..., f ¢k(x) линейно независимы и для некоторого ненулевого вектора
hÎRm (f ¢i(x),h) = 0 при i = 1, ..., k и (g¢j(x),h)
/>
Геометрически, этиусловия означают, что, во-первых, вектор h является касательным к многообразию,выделяемому ограничениями-равенствами (т. е. ортогонален всем градиентам f ¢i(x)), и, во-вторых, он образует с градиентами g¢j(x) активных ограничений (указывающими, очевидно, вовнемножества W) тупой угол.
/>
Рис. 3.3.Методы возможных направлений
Эти методы основываютсяна следующем простом понятии. Вектор (направление) z в допустимой точке xназовем возможным для задачи (3.1), (3.3), если малоеперемещение в этом направлении уменьшает значение функции f0и невыводит из множества допустимых точек, т. е. если при достаточно малых s точка xs= x + sz допустима и f(xs) Методы проекции градиента
Проекцией PWx точки x Î Rm на множество W Ì Rm называется любая ближайшая к x точка множестваW:
||x PWx|| £ ||x y|| при всех y Î W.
В тех случаях, когда проекциюточки на множество допустимых точек задачи (3.1), (3.3) найти достаточно легко(например, когда — линейное подпространство, полупространство, шар, Rmи т. д.) используют метод проекции градиента:
xn+1 = PW(xn anf ¢0(xn))
(см. рис. 3.4),являющийся прямым обобщением градиентного метода.
/>
Рис. 3.4.
Можно доказать, например,что если функция f0Î C1 сильно выпукла и f ¢ удовлетворяет условию Липшица, амножество W замкнуто иограничено, то метод проекции градиента сходится со скоростью геометрическойпрогрессии.Методы линеаризации
Суть этих методов, какследует из названия, состоит в линеаризации минимизируемой функции иограничений в очередной точке xn строящейся релаксационнойпоследовательности и объявлении следующим значением xn+1решения получающейся линейной задачи, т. е. задачи
(f ¢0(xn),x xn) ® min, (3.8)
gi(xn) + (g¢i(xn),x xn) £ 0, i = 1,..., l. (3.9)
Чтобы эта (линейная)задача была разрешима либо добавляют штраф в минимизируемую функцию, заменяя (3.8),например, задачей
(f ¢0(xn), x xn) + d||x xn||2 ® min,
либо добавляя к (3.9)простые ограничения, которые делают множество допустимых точек этой задачиограниченным, например, (линейные) ограничения
xi xnian £ 0, xi + xnian £ 0 (i = 1, ..., m). Методыштрафов
Основная идеяздесь заключается в переходе от задачи (3.1), (3.3) к задаче безусловнойоптимизации, в которой «наказывается» либо удаление от множества W допустимых точек (внешнийштраф), либо приближение изнутри множества W к его границе (внутренний штраф).Различают методы внешних штрафов и внутренних штрафов. При методе внешнихштрафов задачу решают тем или иным методом решения безусловных задач,увеличивая на каждом шаге штраф s. Как и в случае задач с ограничениями-равенствами,основным недостатком метода штрафов является рост числа обусловленности s. Нанесколько другой идее основываются так называемые методывнутренних штрафов или барьеров. Образно его можноописать так: у границы множества W возводятся барьеры, не позволяющиеприближаться к его границе.
Ни один метод или классметодов не выделяется своей собственной высокой эффективностью при решенииоптимизационных задач различных типов, т.е. универсальностью./>Симплекс — метод
Симплекс-метод – один изнаиболее эффективных методов численного решения задач ЛП. Суть понятия «симплекс»заключается в следующем. Для тела в k-мерном пространстве симплексом называетсямножество, состоящее из k+1 вершин этого тела. Так, при k = 2, т.е. наплоскости, симплексом будут вершины треугольника; при k = 3 симплексом являютсявершины четырехгранника, например тетраэдра, и т.д. Такое название методу данопо той причине, что в его основе лежит последовательный перебор вершин ОДЗП сцелью определения координат той вершины, в которой функция цели имеетэкстремальное значение.
Решение задачи с помощьюсимплекс-метода разбивается на два основных этапа. На первом этапе находят одноиз решений, удовлетворяющее системе ограничений. Системы, в которых переменныхбольше, чем ограничений N > m, называются неопределенными. Они приводятся копределенным системам (N = m) путем приравнивания к нулю N-m каких-либопеременных.
При этом остается системаm уравнений с m неизвестными, которая имеет решение, если определитель системыотличен от нуля. В симплекс-методе вводится понятие базисных переменных, илибазиса. Базисом называется любой набор из m таких переменных, что определитель,составленный из коэффициентов при этих переменных в m-ограничениях, отличен отнуля. Остальные N-m переменных называются небазисными или свободнымипеременными.
Если принять, что всенебазисные переменные равны нулю, и решать систему ограничений относительнобазисных переменных, то получим базисное решение.
В системе из m уравненийс N неизвестными общее число базисных решений при N > m определяется числомсочетаний
/>
Базисное решение, вкотором все xi ≥ 0, i = [1,m], называется допустимым базисным решением.Таким образом, первый этап завершается нахождением допустимого базисногорешения, хотя бы и неудачного.
На втором этапепроизводится последовательное улучшение найденного решения. При этомосуществляется переход от одного допустимого базисного решения к другому такимобразом, чтобы значение целевой функции улучшилось. Процесс продолжается до техпор, пока не будет достигнуто наименьшее (или наибольшее) значение функциицели. Геометрически это означает переход по ребрам из одной вершины многогранникадопустимых значений в другую по направлению к той, в которой значение функциицели достигает экстремума. Симплекс-метод дает оптимальную процедуру переборабазисных решений и обеспечивает сходимость к экстремальной точке за конечноечисло шагов. Вычисления на втором этапе ведутся по следующей схеме:
· базисные переменные и функция целивыражаются через небазисные переменные;
· по определенному правилувыбирается та из небазисных переменных, изменение значения которой способноулучшить значение F(x), и она вводится в базис;
· определяется, какая из базисныхпеременных должна быть выведена из базиса, при этом новый набор базисныхпеременных, образующийся на каждом шаге, отличается от предыдущего только однойпеременной;
· базисные переменные и функция целивыражаются через новые небазисные переменные, и повторяются операции 2 и 3.
Если на определенном шагеокажется, что изменение значений любой из небазисных переменных не можетулучшить F(x), то последнее базисное решение оказывается оптимальным.4. Нахождениеэкстремума функции при наличии ограниченийМетодсимплексных процедур
Симплексом в пространствеn-измерений называют выпуклыймногогранник, имеющий n+1вершин, не лежащих в подпространстве размерности, меньшей n.
Решение задачи нахожденияусловного экстремума функции двух переменных может находиться либо на границахвыпуклого многогранника, либо на его вершинах.
Согласно методусимплексных процедур экстремум функции обязательно лежит среди допустимыхбазисных решений. Это позволяет наметить путь к решению задачи, число которыхконечно, а также найти все допустимые базисные решения и для каждого вычислитьзначение целевой функции, а затем выбрать из них min/max,хотя данный метод достаточно трудоемок.
/>
Рис. 4.1. Блок-схемаметода симплексных процедур. Реализацияметода в программе:
/>
Рис. 4.2. Реализацияметода симплексных процедур.
/>
Рис. 4.3. График методасимплексных процедур.
Вывод:Минимальное значениефункция принимает в точке А2 (2.3, 0.3). F(2.3, 0.3) = 7,003.
5. Синтезоптимальной по быстродействию системы с помощью принципа максимума Понтрягина Синтезсистемы
Критерий управления, какотмечалось ранее, в этом случае
/>
Мера ошибки в критерии H =1, а верхний предел T неизвестен. Начальная Х(0) = Х0и конечная Х(T) = ХT точки закреплены.
Запишем функциюГамильтона и условия трансверсальности:
/>
/> />(T) и /> (0)-произвольны.
Согласно принципумаксимума Понтрягина, стратегия управления состоит в минимизации функцииГамильтона относительно u.Минимум Г будет тогда, когда /> min по и или /> min по и
Отсюда
/> (5.2)
Таким образом, стратегияуправления и характер u*(t) определены: оптимальное управление — это релейное управление,максимальное по величине, причем переключение управления производится тогда, когдафункция />ТВ пересекаетось времени t.
По изложенной методикеопределим оптимальное управление />,которое произвольное начальное состояние (х10, x20) переводит в начало координат заминимальное время Т.
Представим объект /> (5.1) в виде уравнения состояния (нормальная форма)
/> (5.3)
В рассматриваемом примерематрица />, вектор />. Образуем матрицу />.
Матрица G — невырожденная, поэтому система (3) будет нормальной.Характеристические числа матрицы A /> = 0, /> =-2, это числа вещественные, поэтому система (3) удовлетворяет условиям теоремыоб n-интервалах. Оптимальное управление u*(t) являетсякусочно-постоянным и имеет не более двух интервалов постоянства.
Таким образом,управляющие последовательности в зависимости от начального состояния будут: {+1}, {-1},{+1,-1}, {-1, + 1}.
Обозначим u* = ∆=±1 и найдем общее решение системы при и* = ∆.
/>
/>
/>
/>
/>
/>
/>
Обозначим /> – множество начальныхсостояний, которые переводятся в начало координат управляющейпоследовательностью и* = {+1}, />–множество начальных состояний, которые переводятся в начало координатуправляющей последовательностью и* = {-1}. Эти множества описываются уравнениями
/>
Если принять /> то множество /> запишется в виде
/>
Закон управления
/> (5.4)
Линия /> представляет собой линию переключения.
Введем функцию />, характеризующуюрасстояние от текущего положения фазовой точки />(x1,x2) до линии переключения:
/> (5.5)
Когда фазовая точкаокажется на линии переключения, то правая часть уравнения (5) будет равна нулю(/> = 0) и управляющееустройство должно произвести переключение знака управления на противоположный. Покафазовая точка находится над линией переключения, /> >0 и управление должно быть отрицательным и (t) = -U. Когда фазовая точка находится подлинией переключения, />
/>
Все изложенное позволяетзаписать алгоритм оптимального по быстродействию регулятора для объекта (1):
/>
/>
/>=0, если />,/>х2
По алгоритму решениясоставим структурную схему системы, реализующей закон управления
/>
Рис. 5.1. Структурнаясхема системы
Моделирование объекта
По алгоритму решения
/>
/>,
полученному ранее,составим структурные схемы для построения переходной и импульсной характеристиксистемы, реализующие закон управления для объекта />, где k = 1, T1 = 10, T2 = 8.
/>
Рис. 5.2. Структурнаясхема модели ОСАУ для переходной характеристики
/>
Рис. 5.3. Вводимыепараметры
/>
Рис. 5.4. Графикпереходной характеристики
tp = 31.6 c.
/>
Рис. 5.5. Структурнаясхема модели ОСАУ для импульсной характеристики
/>
Рис. 5.6. Вводимыепараметры
/>
Рис. 5.7. Графикимпульсной характеристики
tp = 19,6 c.
Заключение
В теоретической частикурсового проекта были рассмотрены методы поиска безусловного экстремумафункции (методы прямого поиска, градиентные методы, методы второго порядка) иметоды поиска экстремума функции при наличии ограничений (методы возможныхнаправлений, методы проекции градиента, методы линеаризации, методы штрафов),указаны их основные достоинства и недостатки.
На примере былирассмотрены 2-а градиентных метода поиска безусловного экстремума функции.Метод «Наискорейшего спуска» и метод «Сопряженных направлений»,где второй показал много большую скорость сходимости, в чем и заключается егопреимущество. Оба метода на порядок быстрее, чем «прямой поиск» таккак шаг приближения, пересчитывается на каждой итерации.
Метод «Симплексныхпроцедур» является лучшим выбором, при нахождении экстремумов нелинейнойфункции, в условиях ограничений типа неравенств. Его достоинство – не сложностьподсчетов и точность, подкреплённая теоремой Лагранжа. Минус – многовычислений.
На языке программированиявысшего уровня Delphi реализованы алгоритмы вышеназванныхметодов.
С помощью принципамаксимума Понтрягина был выполнен синтез оптимальной по быстродействию системыдля объекта />, также была разработана модель ОСАУ для данного объекта. С применением программного продукта «20-sim Pro 2.3» было проведено исследование и сняты переходная характеристика (tp = 31.6 c) и импульсная характеристика (tp = 19,6 c). Метод показал прекрасные показатели регулирования.
Списокиспользованной литературы
1. Акулич И. Л.Математическое программирование в примерах и задачах. – М: Высшая школа, 1986.
2. Болтянский В. Г.Математические методы оптимального управления. – М: Наука, 1969.
3. Иванов В. А.,Фалдин Н. В. Теория оптимальных систем автоматического управления. – М: Наука,1981.
4. Чураков Е. П.Оптимальные адаптивные системы. – М: Энергоатомиздат, 1987.
5. Пупков К.А.,Егупов Н.Д., Методы классической и современной теории автоматическогоуправления: Учебник в 5-и тт.; 2-е изд., — М.: Издательство МГТУ им. Н.Э.Баумана, 2004. — 742 с.
6. Гудвин Г. К.,Гребе С. Ф., Сальгадо М. Э., Проектирование систем управления: Издательство Бином. Лаборатория знаний, 2004. 911 c.
Приложение
unitall_methods;
interface
uses
Windows,Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls, ExtCtrls, DB, IBDatabase, Grids, DBGrids, DBCtrls, Mask,
ADODB,ComCtrls;
type
Vector =array[1..3] of Double;
Matrix =array[1..3] of Vector;
Mass =array[1..10] of Double;
TFMain =class(TForm)
EX: TEdit;
EY: TEdit;
EZ: TEdit;
LX: TLabel;
LY: TLabel;
LZ: TLabel;
BGauss:TButton;
EK: TEdit;
LK: TLabel;
MIter:TListBox;
LFxy: TLabel;
Label2:TLabel;
BClear:TButton;
BSpusk:TButton;
Label11:TLabel;
RBMin:TRadioButton;
RBMax:TRadioButton;
Label13:TLabel;
Label14:TLabel;
EXb: TEdit;
EYb: TEdit;
EU: TEdit;
Label15:TLabel;
GBIn:TGroupBox;
GBOut:TGroupBox;
GBControl:TGroupBox;
BExit:TButton;
BSopr:TButton;
DBGMain:TDBGrid;
DSMain:TDataSource;
EA: TDBEdit;
DBNavigator1:TDBNavigator;
DataSetMain:TADODataSet;
Conn:TADOConnection;
EB: TDBEdit;
EC: TDBEdit;
ED: TDBEdit;
EE: TDBEdit;
EF: TDBEdit;
EX0: TDBEdit;
EY0: TDBEdit;
Im: TImage;
Label18:TLabel;
Label3:TLabel;
Label4:TLabel;
Label5: TLabel;
Label6:TLabel;
Label7:TLabel;
Label8:TLabel;
Label9:TLabel;
RBx:TRadioButton;
RBy:TRadioButton;
Label10:TLabel;
ESkor: TEdit;
Label19:TLabel;
BSimplex:TButton;
GBConstr:TGroupBox;
LC1: TLabel;
LC3: TLabel;
LC2: TLabel;
EVar: TDBEdit;
GridBox:TGroupBox;
GrapfBox:TGroupBox;
LC10: TLabel;
LC20: TLabel;
LC30: TLabel;
LC40: TLabel;
LC4: TLabel;
Q: TADOQuery;
SaveZnak:TButton;
BStop:TButton;
procedureBGaussClick(Sender: TObject);
procedureBSpuskClick(Sender: TObject);
procedureBExitClick(Sender: TObject);
procedureBSoprClick(Sender: TObject);
procedureFormCreate(Sender: TObject);
procedureEVarChange(Sender: TObject);
procedureBSimplexClick(Sender: TObject);
procedureLC10Click(Sender: TObject);
procedureLC20Click(Sender: TObject);
procedureLC30Click(Sender: TObject);
procedureLC40Click(Sender: TObject);
procedureGaussSystem(N:Integer);
procedureZapoln();
procedureZnakConstrain();
procedureSaveZnakClick(Sender: TObject);
procedureClear();
procedureBClearClick(Sender: TObject);
procedureBStopClick(Sender: TObject);
private
{ Privatedeclarations }
public
{ Publicdeclarations }
end;
var
FMain: TFMain;
xr, yr: Word; //координаты центра окружности
dr: byte;
a, b, c, d, e,f:Double; //
Am:array[1..4,1..2] of Double;
Bm: array[1..4]of Double;
Fm: Mass;
Xm, Ym:array[1..10] of Double;
znak1, znak2,znak3, znak4, nomer:Integer;
_BoolStop:Boolean;
implementation
{$R *.dfm}
Function fz(x,y, a, b, c, d, e, f: Double): Double;
begin
Result :=a*x*x+2*b*x*y+c*y*y+2*d*x+2*e*y+f;
end;
//---------------------------------------------
Function xi(y,b, d, a: Double): Double;
begin
Result :=-(b*y+d)/a;
end;
//---------------------------------------------
Function yi(x,b, e, c: Double): Double;
begin
Result :=-(b*x+e)/c;
end;
//---------------------------------------------
Function dx(x,y, b, d, a: Double): Double;
begin
Result :=2*a*x+2*b*y+2*d;
end;
//---------------------------------------------
Function dy(x,y, b, e, c: Double): Double;
begin
Result :=2*b*x+2*c*y+2*e;
end;
procedureDelay(dwMilliseconds: Longint);
var
iStart, iStop:DWORD;
begin
iStart :=GetTickCount;
repeat
iStop :=GetTickCount;
Application.ProcessMessages;
until (iStop — iStart) >= dwMilliseconds;
end;
procedure Ris;
Var ImW, ImH,sm, sm2, k, sm3, sm4, step :Integer;
begin
with FMain do
try
ImW:=Im.Width;
ImH:=Im.Height;
Im.Canvas.Pen.Width:=1;
Im.Canvas.Pen.Color:= clBlack;
Im.Canvas.MoveTo(10,Round(ImH/2));
Im.Canvas.LineTo(ImW-10,Round(ImH/2));
Im.Canvas.MoveTo(Round(ImW/2),10);
Im.Canvas.LineTo(Round(ImW/2),ImH-10);
step:=20;
// вправо
sm:=Round(ImW/2)+step;
sm2:=Round(ImH/2)-step;
sm3:=Round(ImW/2)-step;
sm4:=Round(ImH/2)+step;
for k := 1 to15 do
begin
Im.Canvas.MoveTo(sm,Round(ImH/2)+5);
Im.Canvas.LineTo(sm,Round(ImH/2)-5);
sm:=sm+step;
// вверх
Im.Canvas.MoveTo(Round(ImW/2)+5,sm2);
Im.Canvas.LineTo(Round(ImW/2)-5,sm2);
sm2:=sm2-step;
// влево
Im.Canvas.MoveTo(sm3,Round(ImH/2)+5);
Im.Canvas.LineTo(sm3,Round(ImH/2)-5);
sm3:=sm3-step;
// Вниз
Im.Canvas.MoveTo(Round(ImW/2)+5,sm4);
Im.Canvas.LineTo(Round(ImW/2)-5,sm4);
sm4:=sm4+step;
end;
Im.Canvas.TextOut(Round(ImW/2)+18,Round(ImH/2)+7,'1');
Im.Canvas.TextOut(Round(ImW/2)-11,Round(ImH/2)-27,'1');
Im.Canvas.TextOut(Round(ImW)-12,Round(ImH/2)+7,'X');
Im.Canvas.TextOut(Round(ImW/2)-11,7,'Y');
except
ShowMessage('error');
end;
end;
procedureTFMain.Clear();
begin
with FMain do
begin
Im.Canvas.Brush.Color:= ClWhite;
Im.Canvas.FillRect(Canvas.ClipRect);
Ris;
MIter.Clear;
EU.Text:='';
EX.Text:='';
EY.Text:='';
EZ.Text:='';
EK.Text:='';
EXb.Text:='';
EYb.Text:='';
end;
end;
//---------------------------------------------
procedureTFMain.BClearClick(Sender: TObject);
begin
Clear();
end;
procedureTFMain.BExitClick(Sender: TObject);
begin
Close();
end;
procedureTFMain.BGaussClick(Sender: TObject);
var k, i,ostatok:Integer;
x0, y0, z0, x,y, z, _bez:Double; //a, b, c, d, e, f,
begin
if(RBx.Checked = false) and (RBy.Checked = false) then RBx.Checked := true;
try
if Miter.Count> 0 then MIter.Clear;
EU.Enabled :=false;
k:=0;
Zapoln();
_bez:=(b*d-e*a)/(a*c-b*b);
EYb.Text:=floattostr(_bez);
EXb.Text:=floattostr(-(b*_bez+d)/a);
//-------------------------------
x:=StrToFloat(EX0.Text);
y:=StrToFloat(EY0.Text);
//z:=fz(x,y,a,b,c,d,e,f);
if RBx.Checkedthen ostatok := 1
else ostatok:= 0;
for i := 1 to1000 do
Begin
k:=i-1;
//-------------------Вывод-----------------------------------
MIter.Items.Add('---------------------');
MIter.Items.Add('k='+inttostr(k)+'| '+
'x'+inttostr(k)+'='+floattostr(x)+'| '+
'y'+inttostr(k)+'='+floattostr(y)+'| '+
'F(x,y)='+floattostr(z));
x0:=x;
y0:=y;
z0:=fz(x0,y0,a,b,c,d,e,f);
//------------------------------------------------------------
if (i mod 2) =ostatok then
Begin
x:=x0; //xi(y0,b,d,e);
y:=-(b*x0+e)/c;//yi(x0,b,e,c);
End
else
Begin
x:=-(b*y0+d)/a;//xi(y0,b,d,e);
y:=y0; //yi(x0,b,e,c);
End;
z:=fz(x,y,a,b,c,d,e,f);
//------------------------------------------------------------
if((abs(x-x0)
End;
EX.Text:=floattostr(x);
EY.Text:=floattostr(y);
EZ.Text:=floattostr(z);
EK.Text:=inttostr(k+1);
except
ShowMessage('Не удалось найти экстремум, попробуйте другой метод.');
end;
end;
procedureTFMain.BSpuskClick(Sender: TObject);
var k,i:Integer;
x0, y0, z0, x,y, z, Fx, Fy, M, _bez:Double; // a, b, c, d, e, f,
H:array[1..2,1..2] of Double;
begin
if(RBMin.Checked = false) and (RBMax.Checked = false) then RBMin.Checked := true;
if Miter.Count> 0 then MIter.Clear;
EU.Enabled :=true;
k:=0;
Zapoln();
//-------------------------------
_bez:=(b*d-e*a)/(a*c-b*b);
EYb.Text:=floattostr(_bez);
EXb.Text:=floattostr(-(b*_bez+d)/a);
//-------------------------------
MIter.Items.Add('---------------------');
x:=StrToFloat(EX0.Text);
y:=StrToFloat(EY0.Text);
z:=fz(x,y,a,b,c,d,e,f);
MIter.Items.Add('k='+inttostr(k)+''+
'x'+inttostr(k)+'='+floattostr(x)+''+
'y'+inttostr(k)+'='+floattostr(y)+''+
'F(x,y)='+floattostr(z));
H[1,1]:=2*a;
H[1,2]:=2*b;
H[2,1]:=2*b;
H[2,2]:=2*c;
for i := 1 to1000 do
Begin
k:=k+1;
MIter.Items.Add('---------------------');
x0:=x;
y0:=y;
z0:=fz(x0,y0,a,b,c,d,e,f);
Fx:=dx(x0, y0,b, d, a);
Fy:=dy(x0, y0,b, e, c);
M:=(Fx*Fx +Fy*Fy)/(Fx*(H[1,1]*Fx+H[1,2]*Fy) + Fy*(H[2,1]*Fx+H[2,2]*Fy));
ifRBMin.Checked then
begin
x:=x0-M*Fx;
y:=y0-M*Fy;
end
else ifRBMax.Checked then
Begin
x:=x0+M*Fx;
y:=y0+M*Fy;
End;
z:=fz(x,y,a,b,c,d,e,f);
MIter.Items.Add('k='+inttostr(k)+'| '+
'x'+inttostr(k)+'='+floattostr(x)+'| '+
'y'+inttostr(k)+'='+floattostr(y)+'| '+
'F(x,y)='+floattostr(z)+'| '+
'u'+inttostr(k-1)+'='+floattostr(M));
if((abs(x-x0)
End;
EX.Text:=floattostr(x);
EY.Text:=floattostr(y);
EZ.Text:=floattostr(z);
EK.Text:=inttostr(k);
EU.Text:=floattostr(M);
end;
procedureTFMain.BStopClick(Sender: TObject);
begin
_BoolStop:=true;
end;
FunctionZnak(chislo: Double; Stroka:String): String;
begin
if (chislo> 0) then
if (chislo 1) then Result:='+'+FloatToStr(chislo)+Stroka
elseResult:='+'+Stroka
else if(chislo
if (chislo -1) then Result:=FloatToStr(chislo)+Stroka
elseResult:='-'+Stroka
elseResult:='';
end;
FunctionZnakN(chislo: Double; Stroka:String): String;
begin
if (chislo> 0) then
if chislo 1 then Result:=FloatToStr(chislo)+Stroka
elseResult:=Stroka
else if(chislo
if (chislo -1) then Result:=FloatToStr(chislo)+Stroka
elseResult:='-'+Stroka
elseResult:='';
end;
FunctionZnakKon(chislo: Double): String;
begin
if (chislo> 0) then Result:='+'+FloatToStr(chislo)
else if chislo= 0 then Result:=''
elseResult:=FloatToStr(chislo);
end;
procedureTFMain.Zapoln();
begin
with FMain do
begin
a:=DBGMain.Fields[1].AsFloat;
b:=DBGMain.Fields[2].AsFloat;
c:=DBGMain.Fields[3].AsFloat;
d:=DBGMain.Fields[4].AsFloat;
e:=DBGMain.Fields[5].AsFloat;
f:=DBGMain.Fields[6].AsFloat;
Am[1,1]:=DBGMain.Fields[9].AsFloat;
Am[1,2]:=DBGMain.Fields[10].AsFloat;
Bm[1]:=DBGMain.Fields[11].AsFloat;
Am[2,1]:=DBGMain.Fields[12].AsFloat;
Am[2,2]:=DBGMain.Fields[13].AsFloat;
Bm[2]:=DBGMain.Fields[14].AsFloat;
Am[3,1]:=DBGMain.Fields[15].AsFloat;
Am[3,2]:=DBGMain.Fields[16].AsFloat;
Bm[3]:=DBGMain.Fields[17].AsFloat;
Am[4,1]:=DBGMain.Fields[18].AsFloat;
Am[4,2]:=DBGMain.Fields[19].AsFloat;
Bm[4]:=DBGMain.Fields[20].AsFloat;
end;
end;
procedureTFMain.ZnakConstrain();
begin
with FMain do
begin
nomer:=StrToInt(EVar.Text);
Q.Close;
Q.SQL.Text:='selectznak1, znak2, znak3, znak4 from Znaki where № = '+IntToStr(nomer);
Q.Open;
znak1:=Q.Fields.Fields[0].AsInteger;
znak2:=Q.Fields.Fields[1].AsInteger;
znak3:=Q.Fields.Fields[2].AsInteger;
znak4:=Q.Fields.Fields[3].AsInteger;
if znak1 = 0then LC10.Caption:=Chr(8804)+' 0' // Chr(8805)
else LC10.Caption:=Chr(8805)+'0';
if znak2 = 0then LC20.Caption:=Chr(8804)+' 0'
else LC20.Caption:=Chr(8805)+'0';
if znak3 = 0then LC30.Caption:=Chr(8804)+' 0'
else LC30.Caption:=Chr(8805)+'0';
if znak4 = 0then LC40.Caption:=Chr(8804)+' 0'
else LC40.Caption:=Chr(8805)+'0';
end;
end;
procedureTFMain.EVarChange(Sender: TObject);
begin
with FMain do
begin
Zapoln();
//-----------------------------------------------------------------------------------------------------//
with LFxy do
begin
Caption:='F(x,y)=';
Caption:=Caption+ZnakN(a,'x'+Chr(178));
Caption:=Caption+Znak(2*b,'xy');
Caption:=Caption+Znak(c,'y'+Chr(178));
Caption:=Caption+Znak(2*d,'x');
Caption:=Caption+Znak(2*e,'y');
Caption:=Caption+ZnakKon(f);
end;
//-----------------------------------------------------------------------------------------------------//
LC1.Caption:=ZnakN(Am[1,1],'x')+Znak(Am[1,2],'y')+ZnakKon(Bm[1]);
LC2.Caption:=ZnakN(Am[2,1],'x')+Znak(Am[2,2],'y')+ZnakKon(Bm[2]);
LC3.Caption:=ZnakN(Am[3,1],'x')+Znak(Am[3,2],'y')+ZnakKon(Bm[3]);
LC4.Caption:=ZnakN(Am[4,1],'x')+Znak(Am[4,2],'y')+ZnakKon(Bm[4]);
ZnakConstrain();
end;
end;
procedureTFMain.FormCreate(Sender: TObject);
var FileName,ConStr:String;
begin
FileName:='variants.mdb';//EFileName.Text;//
try
Conn.Connected:=false;
Conn.ConnectionString:=
'Provider=Microsoft.Jet.OLEDB.4.0;UserID=Admin;Data Source='+getCurrentDir+'\'+FileName+';'+
'Mode=ShareDeny None;Extended Properties="";Jet OLEDB:Systemdatabase="";Jet OLEDB:Registry Path="";'+
'JetOLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:DatabaseLocking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;'+
'JetOLEDB:Global Bulk Transactions=1;Jet OLEDB:New DatabasePassword="";Jet OLEDB:Create System Database=False;'+
'JetOLEDB:Encrypt Database=False;Jet OLEDB:Compact Without Replica Repair=False;JetOLEDB:SFP=False';
Conn.Connected:=true;
Conn.Open;
DBGMain.DataSource:=DSMain;
DataSetMain.Active:=false;
DataSetMain.CommandText:='select * from Варианты order by №';
DataSetMain.Active:=true;
DataSetMain.Open;
except
ShowMessage('Не удалосьподключиться к базе вариантов. Вложите базу «variants.mdb» свариантами в папку с программой.');
end;
//--------------------------------------------------------------------
ZnakConstrain();
//--------------------------------------------------------------------
Ris;
end;
FunctionZnak0(str: String): String;
begin
if str =Chr(8804)+' 0' then Result:= Chr(8805)+' 0'
else Result:=Chr(8804)+' 0';
end;
FunctionZnakUpdate(str: String): Integer;
begin
if str =Chr(8804)+' 0' then Result:= 0
else Result:=1;
end;
procedureTFMain.LC10Click(Sender: TObject);
begin
LC10.Caption:=Znak0(LC10.Caption);
end;
procedureTFMain.LC20Click(Sender: TObject);
begin
LC20.Caption:=Znak0(LC20.Caption);
end;
procedureTFMain.LC30Click(Sender: TObject);
begin
LC30.Caption:=Znak0(LC30.Caption);
end;
procedureTFMain.LC40Click(Sender: TObject);
begin
LC40.Caption:=Znak0(LC40.Caption);
end;
procedureTFMain.SaveZnakClick(Sender: TObject);
Varzi:Integer;
begin
with FMain do
try
nomer:=StrToInt(EVar.Text);
znak1:=ZnakUpdate(LC10.Caption);
znak2:=ZnakUpdate(LC20.Caption);
znak3:=ZnakUpdate(LC30.Caption);
znak4:=ZnakUpdate(LC40.Caption);
Q.Close;
Q.SQL.Text:='updateZnaki set znak1='+IntToStr(znak1)
+',znak2='+IntToStr(znak2)
+',znak3='+IntToStr(znak3)
+',znak4='+IntToStr(znak4)
+' where№='+IntToStr(nomer);
Q.ExecSQL;
ShowMessage('Знакиуспешно сохранены.');
except
ShowMessage('Не сохранитьзаписать знаки.');
end;
end;
functionRoundEx(chislo: double): double;
begin
RoundEx :=(Round(chislo*1000))/1000;
end;
FunctionZnakConst(str1, str2, str3: String; X, Y :Double): Integer;
Var zn1, zn2,zn3:Integer;
begin
zn1:=0;zn2:=0; zn3:=0;
if ((str1 =Chr(8804)+' 0') and (RoundEx(Am[1,1]*X+Am[1,2]*Y+Bm[1])
((str1 =Chr(8805)+' 0') and (RoundEx(Am[1,1]*X+Am[1,2]*Y+Bm[1]) >= 0)) then zn1:=1;
if ((str2 =Chr(8804)+' 0') and (RoundEx(Am[2,1]*X+Am[2,2]*Y+Bm[2])
((str2 =Chr(8805)+' 0') and (RoundEx(Am[2,1]*X+Am[2,2]*Y+Bm[2]) >= 0)) then zn2:=1;
if ((str3 =Chr(8804)+' 0') and (RoundEx(Am[3,1]*X+Am[3,2]*Y+Bm[3])
((str3 =Chr(8805)+' 0') and (RoundEx(Am[3,1]*X+Am[3,2]*Y+Bm[3]) >= 0)) then zn3:=1;
Result:=zn1+zn2+zn3;
end;
function FindMin(a:Mass):Double;
var
i,temp:integer;
begin
temp:=1;
for i := 1 to10 do
if(a[i]0) then
temp:=i;
Result:=a[temp]
end;
procedureTFMain.GaussSystem(N:Integer);
var g: Matrix;
bg, xv: Vector;
h: Double;
i,j,k,ns,gi,gN, Fn, ImW, ImH, ms:integer;
str:String;
begin
ms:=StrToInt(ESkor.Text);
ImW:=Im.Width;
ImH:=Im.Height;
//Ввод данных
//Размерность системы
ns := 3;
Zapoln();
MIter.Items.Add('');
MIter.Items.Add('------------------------------------м. Множителей лагранжа: ------------------------------------');
if N=3 thenbegin gN:=3;Fn:=3; end
elsegN:=4;Fn:=6;
for gi := 1 togN do
begin
if _BoolStop =true then break;
//Коэффициенты
g[1,1]:= 2*a;
g[1,2]:= 2*b;
g[1,3]:=Am[gi,1];
g[2,1]:= 2*b;
g[2,2]:= 2*c;
g[2,3]:=Am[gi,2];
g[3,1]:=Am[gi,1];
g[3,2]:=Am[gi,2];
g[3,3]:= 0;
//Правая часть уравнения
bg[1]:= -2*d;
bg[2]:= -2*e;
bg[3]:= -Bm[gi];
//Прямой ход — исключениепеременных
for i:=1 tons-1 do
for j:=i+1 tons do
begin
g[j,i]:=-g[j,i]/g[i,i];
for k:=i+1 tons do
g[j,k]:=g[j,k]+g[j,i]*g[i,k];
bg[j]:=bg[j]+g[j,i]*bg[i];
end;
xv[ns]:=bg[ns]/g[ns,ns];
//Обратный ход — нахождение корней
for i:=ns-1 downto 1 do
begin
h:=bg[i];
for j:=i+1 tons do h:=h-xv[j]*g[i,j];
xv[i]:=h/g[i,i];
end;
Xm[Fn+gi]:=xv[1];
Ym[Fn+gi]:=xv[2];
//-------------Рисование точек-----------------------------//
xr:=Round(ImW/2)+Round(Xm[Fn+gi]*20);;
yr:=Round(ImH/2)-Round(Ym[Fn+gi]*20);
Im.Canvas.Pen.Width:=2;
FMain.Im.Canvas.Pen.Color:= clBlue;
FMain.Im.Canvas.Ellipse(xr-3,yr-3, xr + 3, yr + 3);
Im.Canvas.TextOut(xr+10,yr-10,'L'+inttostr(gi));
Delay(ms);
//Вывод результата
ifZnakConst(LC10.Caption, LC20.Caption, LC30.Caption, xv[1], xv[2]) = 3 then
begin
str:=' — Входит в областьопределения';
Fm[Fn+gi]:=fz(xv[1],xv[2],a,b,c,d,e,f);
end
else
begin
str:=' — Не входит вобласть определения';
Fm[Fn+gi]:=9999;
end;
MIter.Items.Add('x'+IntToStr(gi)+'='+FloatToStr(xv[1])+' | y'+IntToStr(gi)+'='+FloatToStr(xv[2])+' | F(x,y)='+FloatToStr(fz(xv[1],xv[2],a,b,c,d,e,f))+ str);
end;
end;
procedureTFMain.BSimplexClick(Sender: TObject);
Var si, ssi,N, ImW, ImH, ms, yris, xris, NL:Integer; X, Y: array[1..10] of Double;
xg, yg, kg,bg, Xp, Yp:Double;
begin
_BoolStop:=False;
Clear();
ms:=StrToInt(ESkor.Text);
ImW:=Im.Width;
ImH:=Im.Height;
Zapoln();
if(LC4.Caption = '0') or (LC4.Caption = '') then
try
Begin
N:=3;
NL:=3;
for si := 2 toN do
begin
Ym[si-1]:=(Am[si,1]*Bm[1]-Am[1,1]*Bm[si])/(Am[si,2]*Am[1,1]-Am[si,1]*Am[1,2]);
Xm[si-1]:=(Bm[si]*Am[1,2]-Bm[1]*Am[si,2])/(Am[1,1]*Am[si,2]-Am[si,1]*Am[1,2]);//(-Bm[1]-Am[1,2]*Ym[si-1])/Am[1,1];
end;
for si := 3 toN do
begin
Ym[si]:=(Am[si,1]*Bm[2]-Am[2,1]*Bm[si])/(Am[si,2]*Am[2,1]-Am[si,1]*Am[2,2]);
Xm[si]:=(Bm[si]*Am[2,2]-Bm[2]*Am[si,2])/(Am[2,1]*Am[si,2]-Am[si,1]*Am[2,2]);//(-Bm[2]-Am[2,2]*Ym[si])/Am[2,1];
end;
End;
except
ShowMessage('А-юй!');
end
else
Begin
N:=6;
NL:=4;
for si := 2 toN-2 do
begin
Ym[si-1]:=(Am[si,1]*Bm[1]-Am[1,1]*Bm[si])/(Am[si,2]*Am[1,1]-Am[si,1]*Am[1,2]);
Xm[si-1]:=(Bm[si]*Am[1,2]-Bm[1]*Am[si,2])/(Am[1,1]*Am[si,2]-Am[si,1]*Am[1,2]);//(-Bm[1]-Am[1,2]*Ym[si-1])/Am[1,1];
end;
for si := 3 toN-2 do
begin
Ym[si+1]:=(Am[si,1]*Bm[2]-Am[2,1]*Bm[si])/(Am[si,2]*Am[2,1]-Am[si,1]*Am[2,2]);
Xm[si+1]:=(Bm[si]*Am[2,2]-Bm[2]*Am[si,2])/(Am[2,1]*Am[si,2]-Am[si,1]*Am[2,2]);//(-Bm[2]-Am[2,2]*Ym[si-1])/Am[2,1];
end;
Ym[6]:=(Am[4,1]*Bm[3]-Am[3,1]*Bm[4])/(Am[4,2]*Am[3,1]-Am[4,1]*Am[3,2]);
Xm[6]:=(Bm[4]*Am[3,2]-Bm[3]*Am[4,2])/(Am[3,1]*Am[4,2]-Am[4,1]*Am[3,2]);//(-Bm[3]-Am[3,2]*Ym[6])/Am[3,1];
End;
//----------------------------------------------------------------------------------------------
MIter.Items.Add('------------------------------------Граничные точки области определения: ------------------------------------');
for si := 1 toNL do
begin
if _BoolStop =true then break;
//-------------Рисование прямых-----------------------------//
FMain.Im.Canvas.Pen.Color:= clMaroon;
Im.Canvas.Pen.Width:=1;
if Am[si,2] =0 then
if Bm[si] = 0then
begin
xris:=Round(ImW/2);
yris:=Round(ImH/2-100);
Im.Canvas.MoveTo(xris,yris);
yris:=Round(ImH/2+100);
Im.Canvas.LineTo(xris,yris);
end
else
begin
xris:=Round(ImW/2-Bm[si]*20);
yris:=Round(ImH/2-100);
Im.Canvas.MoveTo(xris,yris);
yris:=Round(ImH/2+100);
Im.Canvas.LineTo(xris,yris);
end
else ifAm[si,1] = 0 then
if Bm[si] = 0then
begin
yris:=Round(ImH/2);
xris:=Round(ImW/2+100);
Im.Canvas.MoveTo(xris,yris);
xris:=Round(ImW/2)-100;
Im.Canvas.LineTo(xris,yris);
end
else
begin
yris:=Round(ImH/2+Bm[si]*20);
xris:=Round(ImW/2+100);
Im.Canvas.MoveTo(xris,yris);
xris:=Round(ImW/2)-100;
Im.Canvas.LineTo(xris,yris);
end
else
begin
kg:=-Am[si,1]/Am[si,2];
bg:=-Bm[si]/Am[si,2];
xris:=Round(ImW/2+200);
yris:=(Round(ImH/2)-Round((kg*10+bg)*20));
Im.Canvas.MoveTo(xris,yris);
xris:=Round(ImW/2)-100;
yris:=(Round(ImH/2)-Round((kg*(-5)+bg)*20));
Im.Canvas.LineTo(xris,yris);
end;
Delay(ms);
end;
//----------------------------------------------------------//
for si := 1 toN do
begin
if _BoolStop =true then break;
Fm[si]:=fz(Xm[si],Ym[si],a,b,c,d,e,f);
//-------------Рисование точек-----------------------------//
xr:=Round(ImW/2)+Round(Xm[si]*20);
yr:=Round(ImH/2)-Round(Ym[si]*20);
Im.Canvas.Pen.Width:=2;
FMain.Im.Canvas.Pen.Color:= clRed;
FMain.Im.Canvas.Ellipse(xr-3,yr-3, xr + 3, yr + 3);
Im.Canvas.TextOut(xr+10,yr-10,'A'+inttostr(si));
Delay(ms);
//------------------------------------------------------//
MIter.Items.Add('x'+inttostr(si)+'='+floattostr(Xm[si])+'| y'+inttostr(si)+'='+floattostr(Ym[si])+' | F(x,y)='+FloatToStr(Fm[si]));
end;
//------------------Обвести область-----------------------------------------------------------
for si := 1 toN do
begin
for ssi:=si toN do
begin
if _BoolStop =true then break;
Xp:=Xm[ssi];Yp:=Ym[ssi];
if(ZnakConst(LC10.Caption, LC20.Caption, LC30.Caption, Xp, Yp) = 3)
and(ZnakConst(LC10.Caption, LC20.Caption, LC30.Caption, Xm[si], Ym[si]) = 3)
and(ZnakConst(LC10.Caption, LC20.Caption, LC30.Caption, (Xm[si]+Xp)/2,(Ym[si]+Yp)/2) = 3) then
begin
xr:=Round(ImW/2)+Round(Xp*20);
yr:=Round(ImH/2)-Round(Yp*20);
Im.Canvas.Pen.Width:=2;
FMain.Im.Canvas.Pen.Color:= clRed;
Im.Canvas.MoveTo(xr,yr);
xr:=Round(ImW/2)+Round(Xm[si]*20);
yr:=Round(ImH/2)-Round(Ym[si]*20);
Im.Canvas.LineTo(xr,yr);
Xp:=Xm[si];Yp:=Ym[si];
Delay(ms);
end;
end;
end;
//----------------------------------------------------------------------------------------------
GaussSystem(N);
for si := 1 to10 do
begin
if _BoolStop =true then break;
if FindMin(Fm)= Fm[si] then
begin
MIter.Items.Add('');
MIter.Items.Add('Ответ: F(x,y)='+FloatToStr(Fm[si])+' x='+FloatToStr(Xm[si])+'y='+FloatToStr(Ym[si]));
end;
end;
end;
procedureTFMain.BSoprClick(Sender: TObject);
var k, i, ImW,ImH, r, yris, xris, ms:Integer;
x0, y0, z0, x,y, z, Fx, Fy, M, _bez, xg, yg, kg,bg:Double;
H:array[1..2,1..2] of Double;
S, S0, sp:array[1..2] of Double;
begin
_BoolStop:=False;
Clear();
if(RBMin.Checked = false) and (RBMax.Checked = false) then RBMin.Checked := true;
if Miter.Count> 0 then MIter.Clear;
EU.Enabled :=true;
ms:=StrToInt(ESkor.Text);
ImW:=Im.Width;
ImH:=Im.Height;
k:=0;
Zapoln();
//-------------------------------
_bez:=(b*d-e*a)/(a*c-b*b);
EYb.Text:=floattostr(_bez);
EXb.Text:=floattostr(-(b*_bez+d)/a);
Im.Canvas.Pen.Color:=clred;
Im.Canvas.Pen.Width:=2;
xr:=Round(ImW/2)+Round(StrToFloat(EXb.Text)*20);
yr:=Round(ImH/2)-Round(StrToFloat(EYb.Text)*20);
FMain.Im.Canvas.Pen.Color:= clBlue;
FMain.Im.Canvas.Ellipse(xr-4,yr-4, xr + 4, yr + 4);
Delay(ms);
Im.Canvas.TextOut(xr+10,yr-10,'Aб');
Delay(ms);
//----------------------------------------------------------------------------
MIter.Items.Add('---------------------');
x:=StrToFloat(EX0.Text);
y:=StrToFloat(EY0.Text);
z:=fz(x,y,a,b,c,d,e,f);
//----------------------------------------------------------------------------
MIter.Items.Add('k='+inttostr(k)+'| '+
'x'+inttostr(k)+'='+floattostr(x)+'| '+
'y'+inttostr(k)+'='+floattostr(y)+'| '+
'F(x,y)='+floattostr(z));
//----------------------------------------------------------------------------
xr:=Round(ImW/2)+Round(StrToFloat(EX0.Text)*20);;
yr:=Round(ImH/2)-Round(StrToFloat(EY0.Text)*20);
FMain.Im.Canvas.Pen.Color:= clRed;
FMain.Im.Canvas.Ellipse(xr-2,yr-2, xr + 2, yr + 2);
Delay(ms);
Im.Canvas.TextOut(xr-16,yr-10,'Ao');
Delay(ms);
// Гессиан
H[1,1]:=2*a;
H[1,2]:=2*b;
H[2,1]:=2*b;
H[2,2]:=2*c;
// Направление
S[1]:=1;
S[2]:=1;
// Цикл рассчета метода
for i := 1 to1000 do
Begin
if _BoolStop =true then break;
k:=k+1;
MIter.Items.Add('---------------------');
x0:=x;
y0:=y;
z0:=fz(x0,y0,a,b,c,d,e,f);
Fx:=dx(x0, y0,b, d, a);
Fy:=dy(x0, y0,b, e, c);
S0[1]:=S[1];
S0[2]:=S[2];
// Находим u
M:=(Fx*S0[1] +Fy*S0[2])/(S0[1]*(H[1,1]*S0[1]+H[1,2]*S0[2]) +S0[2]*(H[2,1]*S0[1]+H[2,2]*S0[2]));
sp[1]:=H[1,1]*S0[1]+H[1,2]*S0[2];
sp[2]:=H[2,1]*S0[1]+H[2,2]*S0[2];
S[1]:=sp[2];
S[2]:=-sp[1];
ifRBMin.Checked then
begin
x:=x0-M*S0[1];
y:=y0-M*S0[2];
end
else ifRBMax.Checked then
Begin
x:=x0+M*S0[1];
y:=y0+M*S0[2];
End;
MIter.Items.Add('S'+inttostr(k-1)+'('+floattostr(S0[1])+','+floattostr(S0[2])+')');
z:=fz(x,y,a,b,c,d,e,f);
//------------------Вывод на экран---------------------------------------
MIter.Items.Add('k='+inttostr(k)+'| '+
'x'+inttostr(k)+'='+floattostr(x)+'| '+
'y'+inttostr(k)+'='+floattostr(y)+'| '+
'F(x,y)='+floattostr(z)+'| '+
'u'+inttostr(k-1)+'='+floattostr(M));
// условие выхода из цикла
if((abs(x-x0)
// Промежуточные точки
xr:=Round(ImW/2)+Round(x*20);;
yr:=Round(ImH/2)-Round(y*20);
Im.Canvas.Pen.Width:=2;
FMain.Im.Canvas.Pen.Color:= clOlive;
FMain.Im.Canvas.Ellipse(xr-2,yr-2, xr + 2, yr + 2);
Delay(ms);
// Уравнение прямой ирисование направления
xg:=x+S0[1];
yg:=y+S0[2];
kg:=(yg-y)/(xg-x);
bg:=yg-kg*xg;
FMain.Im.Canvas.Pen.Color:= clBlack;
Im.Canvas.Pen.Width:=1;
yris:=(Round(ImH/2)-Round((kg*5+bg)*20));
Im.Canvas.MoveTo(Round(ImW/2+100),yris);
yris:=(Round(ImH/2)-Round((kg*(-5)+bg)*20));
Im.Canvas.LineTo(Round(ImW/2)-100,yris);
Delay(ms);
End;
EX.Text:=floattostr(x);
EY.Text:=floattostr(y);
EZ.Text:=floattostr(z);
EK.Text:=inttostr(k);
EU.Text:=floattostr(M);
end;
end.