Автор работы: Пользователь скрыл имя, 03 Ноября 2010 в 11:46, Не определен
В пояснительной записке изложены основы прямого поиска для определения минимума функции n переменных. Выбран метод оптимизации поиска Нелдера-Мида. В расчетной части метод Нелдера-Мида реализован программно, в среде Turbo Pascal, представлены блок схема алгоритма оптимизации, листинг программы.
Федеральное агентство по образованию
Государственное образовательное учреждение высшего
профессионального образования
Самарский 
государственный технический 
Факультет автоматики и информационных технологий
Кафедра 
информационно-измерительной 
Расчетно-пояснительная 
записка 
 
 
к курсовой работе Оптимизация прямого поиска для определения минимума функции n переменных методом Нелдера-Мида.
  
по курсу      
Системы автоматического 
проектирования 
Нормоконтроль Петрова Т. А.
   Руководитель 
работы  Хавлин 
О.В.   
Студент Бромберг Е.Е.
Группа 5-АИТ-5
   Срок 
выполнения ____________________________ 
   Работа 
защищена с оценкой___________ 
 
 
 
 
 
 
 
 
 
 
     г. 
Самара 2008  
 
 
 
 
 
Реферат 
    Пояснительная 
записка содержит 16страниц, 5 рисунков 
и 2 источника. 
    ЭКСТРЕМУМ 
ФУНКЦИИ, БАЗИСНАЯ ТОЧКА, 
СИМПЛЕКС, ОТРАЖЕНИЕ, 
РАСТЯЖЕНИЕ, СЖАТИЕ, 
ДЛИНА ШАГА, МЕТОД НЕЛДЕРА-МИДА. 
    В 
пояснительной записке изложены 
основы прямого поиска для определения 
минимума функции n переменных. Выбран 
метод оптимизации поиска Нелдера-Мида. 
В расчетной части метод Нелдера-Мида 
реализован программно, в среде Turbo Pascal, 
представлены блок схема алгоритма оптимизации, 
листинг программы. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                               | 
  |
     
  Введение……………………………………………………..
 
 
 
  | 
    4    5    9    10  16  | 
 
ВВЕДЕНИЕ
На разработку методов прямого поиска для определения минимума функции n переменных было затрачено много усилий. Методы прямого поиска являются методами, в которых используются только значения функции. Один из наиболее надежных метод Нелдера-Мида, являющийся одним из самых эффективных, если
Рассмотрим функцию двух переменных. Ее линии постоянного уровня представлены на рис. 1. Линией постоянного уровня называется кривая в двухмерном сечении пространственных параметров ( в данном случае – в плоскости ), значение функции на которой константа. Минимум функции лежит в точке , где -где ряд значений от 0,1 до 1 с шагом 0,1.
    
 
 
 
 
 
 
 
Метод Нелдера-Мида является развитием симплексного метода Спендли, Хекста и Химсворта. Множество значений й равноудаленной точки в n-мерном пространстве называется регулярным симплексом. Эта конфигурация рассматривается в методе Спендли, Хекста и Химсворта. Следовательно, в двумерном пространстве симплексом является равносторонний треугольник, а в трехмерном пространстве – правильный тетраэдр.
Идея метода состоит в сравнении значений функции в вершинах симплекса и перемещении симплекса в направлении оптимальной точки с помощью итерационной процедуры. В симплексном методе, предложенным первоначально, регулярный симплекс использовался на каждом этапе. Нелдер и Мид предложили несколько модификаций этого метода, допускающих, чтобы симплексы были неправильными. В результате получился очень надежный метод прямого поиска, являющийся одним из самый эффективных, если
В данном методе симплекс перемещается с помощью трех основных операций: отражение, растяжение и сжатия. Рассмотрим основные шаги процедуры:
А. Найдем значения функции
в вершинах симплекса.
Б. Найдем наибольшее значение функции , следующее за набольшим значением функции , наименьшее значение функции и соответствующие им точки .
В. Найдем центр тяжести всех точек, за исключением точки . Пусть центром тяжести будет
И вычислим .
Г. Удобнее всего начать перемещение от точки . Отразим точку относительно точки , получим точку и найдем .
Операция отражения иллюстрируется рис. 1. Если коэффициент отражения, то положение точки определяется следующим образом:
       
 
 
 
 
Д. Сравним значения функции и .
       1. Если 
<
, то мы получим наименьшее значение 
функции. Направление из точки 
 в точку 
 наиболее удобно для перемещения. 
Таким образом, мы производим растяжение 
в этом направлении и находим точку 
 и значение 
. Рисунок 2 иллюстрирует операцию растяжения 
симплекса. Коэффициент растяжения 
 можно найти из следующих соотношений: 
       
 
 
 
2. Если > , но то является лучшей точкой по с сравнению с другими двумя точками симплекса и мы заменяем точку на точку и, если сходимость не достигнута, возвращаемся на шаг Б.
3. Если > и > , то перейдите на шаг Е.
Е. Сравним значения функции и .
1. Если > , то переходим непосредственно к шагу Е, 2.
Если < , то замещаем точку на точку и значение функции на значение . Запоминаем значение > из шага Д,2. приведенного выше. Затем переходим на шаг Е, 2.
       2. В этом случае 
>
, поэтому ясно, что мы переместились 
далеко от точки 
 к точке 
. Попытаемся исправить это, найдя точку 
 с помощью шага сжатия, показанного 
на рисунке 3. 
       
 
 
 
Если > , то сразу переходим к шагу сжатия и находим точку из соотношения:
Если < , то сначала заменим точку на точку , а затем произведем сжатие. Тогда точку найдем из соотношения (см. рис.4):
       
 
 
 
 
Коэффициенты в вышеприведенной процедуре являются соответственно коэффициентами отражения, сжатия и растяжения. Нелдер и Мид рекомендуют брать
       Рекомендация 
основана на результатах экспериментов 
с различными комбинациями значений. Эти 
значения параметров позволяют методу 
быть эффективным, но работать в различных 
сложных ситуациях. 
       В 
данной программе точка 
 является начальной точкой, затем 
в программе формируются точки 
       
 
Где - произвольная длина шага, а - единичный вектор.
Обозначения, используемые в программе, в целом соответствуют обозначениям, приведенным в тексте.
 
       Шаги 
этой процедуры представлены в виде 
блок-схемы алгоритма на рисунке 
5. 
 
Program Nidelermid;
Uses Crt;
Var n, i, j, g, h: integer;
S: array[1..10,1..10] of real;
x, xh,xg,xl,xo,xr,xc,xe: array[1..10] of real;
f: array[1..10] of real;
shag, l: integer;
al,be,ga: real;
k, fh, fl,fg,fo,fr,FE,fc,s1,s2,sig: real;
    label 
620,1520,1700,1920,2060,2200, 1300, 1600, 1440,2220; 
function z(x1,x2,x3,x4: REAL): real;
begin
       
Z:=100*(x2-x1*x1)*(x2-x1*x1)+(
inc(shag);
    end; 
begin
clrscr;
shag:=0;
g:=1;
h:=1;
l:=1;
Writeln('Simpleksniy method Nidlera mida');
       
Writeln('Function: F(x)=100(x1-x2^2)^2+(1-x1)^2')
Writeln('Vvedite chislo peremennih');
Readln(n);
Writeln('Vvedite nachalnoe pribligenie');
for j:=1 to n do
readln(s[1,j]);
Writeln('Vvedite dlinny shaga');
       
Readln(k); 
for i:=2 to n+1 do
for j:=1 to n do
if j=i-1 then
s[i,j]:=s[1,j]+k
else s[i,j]:=s[1,j];
Writeln('Vvedite Alfa, beta, gamma');
readln(al, be, ga);
for i:=1 to n+1 do
begin
for j:=1 to n do x[j]:=s[i,j];
f[i]:=z(x[1],x[2],x[3],x[4]);
          
end; 
620:
fh:=-0.00000000000000000001;
fl:=0.00000000000000000001;
for i:=1 to n+1 do
begin
if f[i]>fh then
begin
fh:=f[i];
h:=i;
end;
if f[i]<fl then
begin
fl:=f[i];
l:=i;
end;
end;
fg:=0.00000000000000000001;
for i:=1 to n+1 do
if i<>h then
if f[i]>fg then