Поиск минимума функции многих переменных методом Нелдера - Мида
Курсовая работа, 16 Октября 2013, автор: пользователь скрыл имя
Описание работы
Впервые метод деформируемого многогранника был предложен Нелдером и Мидом. Они предложили метод поиска, оказавшийся весьма эффективным и легко осуществляемым на ЭВМ.
Чтобы можно было оценить стратегию Нелдера и Мида, кратко опишем симплексный поиск Спендли, Хекста и Химсворта, разработанный в связи со статистическим планированием эксперимента.
Содержание работы
Введение 3
1. Постановка задачи 5
2. Методика решения задачи 7
3. Алгоритм метода Нелдера–Мида. 8
4. Блок-схема 10
4.1 Блок-схема основной программы 10
4.2 Блок-схема процедуры calcMinimum 11
4.3 Блок-схема функции 12
5. Программа на языке Pascal 13
5.1 Основная программа 13
5.2 Unit 14
6. Результаты тестирования 18
Выводы 20
Литература 21
Файлы: 1 файл
курсовик.doc
— 169.00 Кб (Скачать файл)НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Курсовая работа
по информатике
Тема:
"Поиск минимума функции многих переменных
методом Нелдера-Мида"
Чернов Д.С.
Нижний Новгород
2011 г.
Содержание
Введение
Впервые метод деформируемого многогранника был предложен Нелдером и Мидом. Они предложили метод поиска, оказавшийся весьма эффективным и легко осуществляемым на ЭВМ. Чтобы можно было оценить стратегию Нелдера и Мида, кратко опишем симплексный поиск Спендли, Хекста и Химсворта, разработанный в связи со статистическим планированием эксперимента. Вспомним, что регулярные многогранники в en являются симплексами. Например, как видно из рисунка 1, для случая двух переменных регулярный симплекс представляет собой равносторонний треугольник (три точки); в случае трёх переменных регулярный симплекс представляет собой тетраэдр (четыре точки) и т.д.
а б
Рисунок 1.
Регулярные
симплексы для случая двух (а) и трёх (б)
независимых переменных. Стрелка указывает
направление наискорейшего улучшения.
При поиске минимума целевой функции f(x) пробные векторы x могут быть выбраны в точках en, находящихся в вершинах симплекса, как было первоначально предложено Спендли, Хекстом и Химсвортом. Из аналитической геометрии известно, что координаты вершин регулярного симплекса определяются следующей матрицей d, в которой столбцы представляют собой вершины, пронумерованные от 1 до (n+1), а строчки – координаты, i принимает значения от 1 до n:
где
t – расстояние между двумя вершинами
1. Постановка задачи
Целевая функция может быть вычислена
в каждой из вершин симплекса; из вершины,
где целевая функция
Рисунок 2.
Последовательность регулярных симплексов, полученных
при минимизации f(x).
----- проекция
Определённые практические трудности,
встречающиеся при
В методе Нелдера и Мида минимизируется функция n независимых переменных с использованием n+1 вершин деформируемого многогранника в en. Каждая вершина может быть идентифицирована вектором x. Вершина (точка) в en, в которой значение f(x) максимально, проектируется через центр тяжести (центроид) оставшихся вершин. Улучшенные (более низкие) значения целевой функции находятся последовательной заменой точки с максимальным значением f(x) на более «хорошие точки», пока не будет найден минимум f(x)..
2. Методика решения задачи
В методе Нелдера–Мида вокруг начальной точки поиска в пространстве переменных размещается начальный симплекс – конфигурация из (n+1)-й точки (в пространстве R 2 они образуют вершины треугольника, а в R 3 – вершины пирамиды). Затем происходит перемещение симплекса путем отражения вершины с наибольшим значением функции относительно центра тяжести противолежащего основания симплекса. При этом используются специальные операции, связанные с растяжением симплекса в направлении убывания функции и операции сжатия при неудачных пробных перемещениях
С помощью операции растяжения и сжатия размеры и форма деформируемого многогранника адаптируются к топографии целевой функции. В результате многогранник вытягивается вдоль длинных наклонных поверхностей, изменяет направление в изогнутых впадинах, сжимается в окрестности минимума, что определяет эффективность рассмотренного метода.
Метод Нелдера–Мида имеет тот недостаток, что для сильно овражных функций может происходить вырождение симплекса, особенно при числе переменных N > 2.
Термин «вырождение» означает, что
все точки симплекса с
В диалоговой системе оптимизации выход из подпрограммы, реализующей метод деформируемого многогранника, осуществляется при предельном сжатии многогранника.
3. Алгоритм метода Нелдера–Мида.
Шаг 0. Задаем векторы h1,h2,…,hN+1, определяющие положение вершин стандартного симплекса с центром в начале координат, и числа S1,S 2,… ,SN+1, определяющие размеры начального симплекса; параметры останова; –параметры отражения, растяжения, сжатия к основанию, сжатия к лучшей вершине ( >0, >1, 0< <1, ). Задаем также начальную точку y 0.
Шаг 1. Формируем начальный симплекс с координатами вершин y1,…, y N+1
y j = y 0+ S j h j ; (j = 1,…,N+1) .
Вычисляем f j = f(y j). (При этом в y 0 вычисление не выполняется).
Шаг 2. Определяем номера худшей и лучшей вершины
f h = max{fj : j=1,...N+1} ; f e = min{ fj: j=1,...N+1}.
Шаг 3. Определяем центр тяжести основания
Шаг 4. Проверяем критерий останова
Если и , то выполняем останов, выдаем оценку решения y e, f e. Если условия останова не выполнены, переходим на шаг 5.
Шаг 5. Выполняем отражение с коэффициентом a>0
и вычисляем f* = f(y*) .
Шаг 6. Если , то выполняем растяжение
при заменяем y h:= y**, f h:= f** и переходим на шаг 2;
при f** > f* заменяем y h:=y*, f h:=f* и переходим на шаг 2;
если f* > f e, то переходим на шаг 7.
Шаг 7. Если для любого j=1,…,N+1, но , выполняется f e < f * < f j, то заменяем
y h:=y*, f h:=f* и переходим на шаг 2, иначе — на шаг 8.
Шаг 8. Если f* < f h, то выполняем сжатие к основанию. Для этого вычисляем
заменяем y h:=y ^, f h:=f ^ и переходим на шаг 2.
Если , то выполняем сжатие к лучшей вершине
Переходим на шаг 2.
4. Блок-схема
4.1 Блок-схема основной программы
4.2 Блок-схема процедуры calcMinimum
4.3 Блок-схема функции
5. Программа на языке Pascal
5.1 Основная программа
program MNM;
uses crt, unit1;
function f(x:SimplexPoint):double; far;
var q:integer; {использование "дальней" адресации для того, чтобы}
{эту функцию можно было
begin {нахождения минимума}
F := (x[1]-3)*(x[1]-3)+(x[2]-2)*(x[
end;
const a:double = 1;
beta:double = 0.5;
gamma:double = 2.9;
var e, y0: SimplexPoint;
i,q,n:integer;
x0:simplex;
l:real;
begin
clrscr;
writeln('************ Метод Нелдера-Мида ************');
write('Введите размерность пространства: '); readln(n);
write('Введите коэффициент a (a>0, а=1): '); readln(a);
write('Введите коэффициент
write('Введите коэффициент
for i:=1 to n+1 do
for q:=1 to n do x0[i][q] :=0;
{ вводим вектора определяющие
положение вершин первого
writeln('Введите начальную точку y0:');
for q:=1 to n do
begin
write(' y0[',q,']: ');
readln(Y0[q]);
end;
writeln('Введите вектора вершин симплекса и их длины :');
for i:=1 to n+1 do
begin
writeln('вектор x',i,':');
for q:=1 to n do
begin
write(' x',i,'[',q,']: ');
readln(x0[i][q]);
end;
write(' Введите длину вектора x',i,': '); readln(L);
for q:=1 to n do
x0[i][q] := x0[i][q]*L+Y0[q];
end;
{ вводим вектор останова}
write('Введите желаемую точность: ');
read(E[1]);
for q:=2 to n do E[q]:=E[1];
{*****************************
calcMinimum(f, n, x0, e, a, beta, gamma);
{*****************************
{ вывод результатов вычисления}
writeln('=====================
writeln('Результат: ');
for i:=1 to n+1 do
begin
writeln(' Точка ', i, ': Значение функции: ',f(x0[i]):3:6);
write(' [');
for q:=1 to n do
begin
write(x0[i][q]:3:5);
if q<>n then write(', ');
end;
writeln(']');
end;
readkey;
end.
5.2 Unit
unit unit1;
interface
const n_max=20; {размерность пространства}
type
SimplexPoint = array[1..n_max] of double; { точка }
Simplex = array[1..n_max+1] of SimplexPoint; { симплекс }
tFunc=function(point:
procedure CalcMinimum( formula:tFunc; {функция}
n:integer; {размерность пространства}
var N_kub:Simplex; {начальное приближение}
E:SimplexPoint {необходимая точность решения};
a,beta,gamma:real);
implementation
uses crt;
procedure CalcMinimum( formula:tFunc; {функция}
n:integer; {размерность пространства}
var N_kub:Simplex; {начальное приближение}
E:SimplexPoint; {необходимая точность решения}
a,beta,gamma:real);
var q:integer;
F, Fmax, Fmin, len, len_max :double;
i, j, num_H, num_L, pr :integer;
Point, Point_H, Point_new, Point_new2 :SimplexPoint;
F_new, F_new2:double;
k:integer;
begin
{ бесконечный цикл}
k:=0;
while TRUE do
begin
k:=k+1;
Writeln('==Shag ',k);
for i:=1 to n+1 do
begin
write(' x[', i, ']=[');
for q:=1 to n do
begin
write(n_kub[i][q]:3:5);
if q<>n then write(', ');
end;
writeln('], f(x[', i, '])=',formula(n_kub[i]):3:6);
end;
if readkey=#27 then break;
{ вычисляем номер самой удаленной(худшей) точки симплекса}
{ вычисляем
номер самой лучшей точки
Fmax := Formula(N_kub[1]);
Fmin := Fmax;
num_H := 1;
num_L := 1;
for i:=2 to n+1 do
begin
F := Formula(N_kub[i]);
if F>Fmax then begin Fmax := F;num_H := i;end;
if F<Fmin then begin Fmin := F;num_L := i;end;