Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Методы решения задач оптимизации. Учебное пособие
.pdf
1.2. Метод «золотого сечения»
11
|L2| > , так как 4,94432 > 0,8;
следовательно, условие окончания не выполнено, увеличиваем значение
переменной цикла k = k + 1 и возвращаемся к шагу 3.
41. Вычисляем значения функции f(z1):
f(z1) = 2(0,11136)2 +6(0,11136) – 8 = 0,0248020992 + 0,66816 – 8 =
= –7,3070379008 –7,307.
Значение функции f в точке y1 = z0 = –1,05568 уже было вычислено
нами на предыдущей итерации алгоритма: f(y1) = f(z0) = –12,1051594752
–12,105.
Сравним
полученные значения
f(y1), f(z1)
между собой. Поскольку
f(y1) < f(z1), то принимаем a2 = a1 = –2,94432; b2 = z1 = 0,11136; z2 = y1 =
= –1,05568; y2 = a2 + b2 – y1 = –2,94432 + 0,11136 – (–1,05568) = –1,77728.
Получаем новый интервал неопределенности: [a2, b2] = [–2,94432; 0,11136].
51. Определяем длину текущего интервала неопределенности: |L3| =
= |b2 – a2| = 0,11136 – (–2,94432) = 3,05568 и проверяем, выполняется ли
условие окончания алгоритма:
|L3| > , так как 3,05568 > 0,8;
следовательно, условие окончания не выполнено, увеличиваем значение
переменной цикла k = k + 1 и возвращаемся к шагу 3.
42. Вычисляем значения функции f(y2):
f(y2) = 2(–1,77728)2 +6(–1,77728) – 8 = 6,3174483968 – 10,66368 – 8 =
= –12,3462316032 –12,346.
Значение функции f в точке z2 = y1 = –1,05568 уже было вычислено
нами на предыдущей итерации алгоритма: f(z2) = f(y1) = –12,1051594752
–12,105.
Сравним
значения
f(y2), f(z2)
между собой. Поскольку
f(y2) < f(z2), то
принимаем a3 = a2 = –2,94432; b3 = z2 = –1,05568; z3 = y2 = –1,77728; y3 =
= a3 + b3 – y2 = –2,94432 + (–1,05568) – (–1,77728) = –2,22272. Таким обра-
зом, после данной итерации получаем новый интервал неопределенности:
[a3, b3] = [–2,94432; –1,05568].
52. Определяем длину текущего интервала неопределенности: |L4| =
= |b3 – a3| = –1,05568 – (–2,94432) = 1,88864 и проверяем, выполняется ли
условие окончания алгоритма:

1. Методы одномерного поиска
12
|L4| > , так как 1,88864 > 0,8;
следовательно, условие окончания не выполнено, увеличиваем значение
переменной цикла k = k + 1 и возвращаемся к шагу 3.
43. Вычисляем значения функции f(y3):
f(y3) = 2(–2,22272)2 +6(–2,22272) – 8 = 9,8809683968 – 13,33632 – 8 =
= –11,4553516032 –11,455.
Значение функции f в точке z3 = y2 = –1,77728 уже было вычислено
нами на предыдущей итерации алгоритма: f(z3) = f(y2) = –12,3462316032
–12,346.
Сравним
значения
f(y3), f(z3)
между собой. Поскольку
f(y3) > f(z3), то
принимаем a4 = y3 = –2,22272; b4 = b3 = –1,05568; y4 = z3 = –1,77728; z4 =
= a4 + b4 – z3 = –2,22272 + (–1,05568) – (–1,77728) = –1,50112. Таким обра-
зом, после первой итерации получаем новый интервал неопределенности:
[a4, b4] = [–2,22272; –1,05568].
53. Определяем длину текущего интервала неопределенности: |L5| =
= |b4 – a4| = –1,05568 – (–2,22272) = 1,16704 и проверяем, выполняется ли
условие окончания алгоритма:
|L5| > , так как 1,16704 > 0,8;
следовательно, условие окончания не выполнено, увеличиваем значение
переменной цикла k = k + 1 и возвращаемся к шагу 3.
44. Вычисляем значения функции f(z4):
f(z4) = 2(–1,50112)2 +6(–1,50112) – 8 = 4,5067225088 – 9,00672 – 8 =
= –12,4999974912 –12,500.
Значение функции f в точке y4 = z3 = –1,77728 уже было вычислено
нами на предыдущей итерации алгоритма: f(z3) = f(y2) = –12,3462316032
–12,346.
Сравним
значения
f(y4), f(z4)
между собой. Поскольку
f(y4) > f(z4),
то принимаем a5 = y4 = –1,77728; b5 = b4 = –1,05568; y5 = z4 = –1,50112;
z5 = a5 + b5 – z4 = –1,77728 + (–1,05568) – (–1,50112) = –1,33184. Таким
образом, получаем новый интервал неопределенности: [a5, b5] =
= [–1,77728; –1,05568].

1.3. Метод Фибоначчи
13
54. Определяем длину текущего интервала неопределенности: |L6| =
= |b5 – a5| = –1,05568 – (–1,77728) = 0,7216 и проверяем, выполняется ли
условие окончания алгоритма:
|L6| < , так как 0,7216 < 0,8.
Условие окончания алгоритма выполнено, процесс вычисления за-
вершен. Точка оптимума (минимума) функции f(x) = 2x2 + 6x – 8 принадлежит текущему интервалу неопределенности L6:
x* [–1,77728; –1,05568].
В процессе выполнения алгоритма было вычислено 6 значений переменных y и z (N = 6). Приближенное значение переменной x* вычислим
по формуле
x* (–1,77728 + (–1,05568)) / 2 = –1,41648.
Можно также вычислить значение функции f(x*), которое она принимает в точке x*:
x* = 2(–1,41648)2 +6(–1,41648) – 8 = 4,0128311808 – 8,49888 – 8 =
= –12,4860488192 –12,486.
1.3. Метод Фибоначчи
Метод основан на анализе значений функции в двух точках, при
этом как и в методе «золотого сечения» на всех итерациях алгоритма,
кроме первой вычисляется только одна новая внутренняя точка, а качестве второй точки используется одна из точек, вычисленных на предыдущей итерации алгоритма. Внутренние точки, в которых происходит вычисление значения исследуемой функции, определяются на основе использования числовой последовательности (числового ряда) Фибоначчи
[3, 4]. Числовой ряд Фибоначчи определяется по формуле
F0 = F1 = 1, Fk = F
k–1
+ F
k–2
, k = 2, 3, 4, ...
Числовой ряд Фибоначчи представляется как последовательность
чисел 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... Алгоритм поиска на основе чисел Фибо-
наччи может быть сформулирован следующим образом [4].

1. Методы одномерного поиска
14
Шаг 1. Задаются исходные данные задачи: длина начального ин-
тервала неопределенности L0 = [a0, b0]; допустимая длина конечного интервала неопределенности > 0; некоторая малая величина > 0.
Шаг 2. Определяем количество итераций алгоритма. Для этого
находим наименьшее целое число, для которого выполняется условие
0
N
L
Fl
, причем FN – это число из последовательности Фибоначчи F0,
F1, ..., FN.
Шаг 3.
Принимаем текущее значение переменной цикла k = 0.
Шаг 4. Вычисляем внутренние точки
2
0 0 0 0
( );
N
N
F
y a b a
F
1
0 0 0 0
()
N
N
F
z a b a
F
, в которых будет проведен анализ значений функ-
ции f.
Шаг 5.
Вычисляем значения функции
f(yk), f(zk)
в точках
yk и zk,
сравниваем их между собой
и определяем новые границы интервала не-
определенности:
а) если f(yk) f(zk), то принимаем a
k+1
= ak; b
k+1
= zk; z
k+1
= yk;
3
1 1 1 1
1
( ),
Nk
k k k k
Nk
F
y a b a
F
выполняем процедуру «исключения от-
резка» и переходим к шагу 6;
б) если f(yk) > f(zk), то принимаем a
k+1
= yk; b
k+1
= bk; y
k+1
= zk,
2
1 1 1 1
1
( ),
Nk
k k k k
Nk
F
z a b a
F
выполняем процедуру «исключения отрез-
ка» и переходим к шагу 6.
Шаг 6. Проверяем выполнение условия окончания алгоритма:
а) если текущее значение k N – 3, увеличиваем переменную цикла
k = k + 1 и возвращаемся на шаг 5;
б) если k = N – 3, то в этом случае внутренние точки отрезка совпадают
22
22
()
2
NN
NN
ab
yz
, следовательно, отсутствует точка для
вычисления нового значения функции. В этом случае воспользуемся за-

1.3. Метод Фибоначчи
15
данной величиной , чтобы произвести последнее N-е вычисление значения функции. Для этого принимаем: y
N–1
= y
N–2
= z
N–2
; z
N–1
= y
N–1
+ . В точ-
ках y
N–1
и z
N–1
вычисляем значения функции и определяем границы конеч-
ного интервала неопределенности:
если f(y
N–1
) f(z
N–1
), то принимаем a
N–1
= a
N–2
, b
N–1
= z
N–1
;
если f(y
N–1
) > f(z
N–1
), то принимаем a
N–1
= y
N–1
, b
N–1
= b
N–2
.
Алгоритм завершается, искомая точка минимума принадлежит те-
кущему интервалу неопределенности: x* [a
N–1
, b
N–1
]. В качестве при-
ближенного решения задачи, соответствующего точке минимума функции, обычно принимают середину последнего интервала:
11
.
2
kk
ab
x
Пример 1.3. Найти минимум функции f(x) = 2x2 + 6x – 8 методом
Фибоначчи.
1. Задаем исходные данные задачи: длина начального интервала
неопределенности L0 = [–6; 2]; минимальное значение конечного интервала = 0,8; величина
= 0,01
.
2. Определяем количество вычислений значения функции f (итера-
ций алгоритма).
0
6
8
13 10
0,8
L
Fl
, следовательно, N = 6. То есть мы исполь-
зуем первые числа ряда Фибоначчи с F0 по F6: F0 = F1 = 1, F2 = 2, F3 = 3,
F4 = 5, F5 = 8, F6 = 13.
3. Принимаем текущее значение переменной цикла k = 0.
4. Вычисляем точки
y0 и z0:
y0 = –6 + (5/13)(2 – (–6)) –2,923; z0 = –6 + (8/13)(2 – (–6)) –1,077.
50. Вычисляем значения функции f(y0), f(z0):
f(y0) = 2(–2,923)2 + 6(–2,923) – 8 = 17,087858 – 17,538 – 8 =
= –8,450142 –8,45;
f(z0) = 2(–1,077)2 + 6(–1,077) – 8 = 2,319858 – 6,462 – 8 =
= –12,142142 –12,142.

1. Методы одномерного поиска
16
Сравним
полученные значения
f(y0), f(z0)
между собой. Поскольку
f(y0) > f(z0), то принимаем a1 = y0 = –2,923; b1 = b0 = 2; y1 = z0 = –1,077; z1 =
= a1 +
62
61
F
F
(b1 – a1) = –2,923 + (5/8)(2 – (–2,923)) = 0,153875 0,154. Таким
образом, после первой итерации получаем новый интервал неопределенности: [a1, b1] = [–2,923; 2].
60. Проверяем условие окончания вычислений: текущее значение
переменной цикла k = 0; N –3 = 6 – 3 = 3; следовательно, k N – 3, условие
не выполняется. Увеличиваем переменную цикла k = k + 1 и возвращаемся
на шаг 5.
51. Вычисляем значения функции f(z1):
f(z1) = 2(0,154)2 + 6(0,154) – 8 = 0,047432 + 0,924 – 8 = –7,028568 –7,029.
Значение функции f в точке y1 = z0 = –1,077 уже было вычислено
нами на предыдущей итерации алгоритма: f(y1) = f(z0) = –12,142142
–12,142.
Сравним
полученные значения
f(y1), f(z1)
между собой. Поскольку
f(y1) < f(z1), то принимаем a2 = a1 = –2,923; b2 = z1 = 0,154; z2 = y1 = –1,077;
y2 = a2 +
64
62
F
F
(b2 – a2) = –2,923 + (2/5)(0,154 – (–2,923)) = –1,692. Таким
образом, получаем новый интервал неопределенности: [a2, b2] = [–2,923;
0,154].
61. Проверяем условие окончания вычислений: текущее значение
переменной цикла k = 1; N –3 = 6 – 3 = 3; следовательно, k N – 3, условие
не выполняется. Увеличиваем переменную цикла k = k + 1 и возвращаемся
на шаг 5.
52.
Вычисляем значения функции
f(y2):
f(y2) = 2(–1,692)2 +6(–1,692) – 8 = 5,725728 – 10,152 – 8 =
= –12,426272 –12,426.
Значение функции f в точке z2 = y1 = –1,077 уже было вычислено
нами на предыдущей итерации алгоритма: f(z2) = f(y1) = –12,142142
–12,142.

1.3. Метод Фибоначчи
17
Сравним
значения
f(y2), f(z2)
между собой. Поскольку
f(y2) < f(z2), то
принимаем a3 = a2 = –2,923; b3 = z2 = –1,077; z3 = y2 = –1,692; y3 = a3 +
+
65
63
F
F
(b3 – a3) = –2,923 + (1/3)( –1,077 – (–2,923)) –2,308. Таким обра-
зом, после данной итерации получаем новый интервал неопределенности:
[a3, b3] = [–2,923; –1,077].
62. Проверяем условие окончания вычислений: текущее значение
переменной цикла k = 2; N –3 = 6 – 3 = 3; следовательно, k N – 3, условие
не выполняется. Увеличиваем переменную цикла k = k + 1 и возвращаемся
на шаг 5.
53.
Вычисляем значения функции
f(y2):
f(y3) = 2(–2,308)2 +6(–2,308) – 8 = 10,653728 – 13,848 – 8 =
= –11,194272 –11,194.
Значение функции f в точке z3 = y2 = –1,692 уже было вычислено
нами на предыдущей итерации алгоритма: f(z3) = f(y2) = –12,42611832
–12,426.
Сравним
значения
f(y3), f(z3)
между собой. Поскольку
f(y2) > f(z2), то
принимаем a4 = y3 = –2,308; b4 = b3 = –1,077; y4 = z3 = –1,692; z4 = a4 +
+
65
64
F
F
(b4 – a4) = –2,308 + (1/2)(–1,077 – (–2,308)) –1,692. Внутренние
точки отрезка совпали: y4 = z4 = –1,692. Текущий интервал неопределенности: [a4, b4] = [–2,308; –1,077].
63. Проверяем условие окончания вычислений: текущее значение
переменной цикла k = 3; N –3 = 6 – 3 = 3; следовательно, k = N – 3, условие
окончания алгоритма выполнено. Используем в качестве первой внутренней точки y5 отрезка [a4, b4] точку: y5 = y4 = z4 = –1,692. Чтобы найти вторую внутреннюю точку используем выражение: z5 = y5 + = –1,692 +
+ 0,01 = –1,682.
Вычислим значение функции в точках f(z5) и f(y5):
f(z5) = 2(–1,682)2 +6(–1,682) – 8 = 5,658248 – 10,092 – 8 =
= –12,433752 –12,434.
Значение функции в точке y5 = y4 = –1,692 было вычислено нами
ранее: f(y5) = –12,426.

1. Методы одномерного поиска
18
Так как f(y5) > f(z5), то a5 = y5 = –1,692; b5 = b4 = –1,077. Следовательно, точка, соответствующая оптимальному значению функции f, принадлежит интервалу:
x* [a5, b5] = [–1,692; –1,077]; |L6| = –1,077 – (–1,692) = 0,615 < = 0,8.
В процессе выполнения алгоритма было вычислено 6 значений переменных y и z (N = 6). Приближенное значение переменной x* вычислим
по формуле
x* (–1,077 + (–1,692)) / 2 = –1,3845.
Можно также вычислить значение функции f(x*), которое она принимает в точке x*:
x* = 2(–1,3845)2 +6(–1,3845) – 8 = 3,8336805 – 8,307 – 8 =
= –12,4733195 –12,473.
Сравним результаты решения, полученные каждым из трех рассмотренных методов (табл. 1.1).
Таблица 1.1
Сравнение методов прямого поиска
N
x*
f(x*)
Метод дихотомии
8
–1,2698
–12,393
Метод «золотого сечения»
6
–1,4165
–12,486
Метод Фибоначчи
6
–1,3845
–12,473
Из таблицы видно, что скорость убывания длины интервала неопределенности в зависимости от числа N вычисленных значений минимизируемой функции в методах «золотого сечения» и Фибоначчи оказалась выше по сравнению с методом дихотомии. В то же время качество
полученного решения в методе «золотого сечения» оказалось выше по
сравнению с двумя другими методами.

2.1. Метод градиентного спуска с постоянным шагом
19
2. МЕТОДЫ ГРАДИЕНТНОГО ПОИСКА
Методы градиентного поиска предназначены для решения задач
нелинейного программирования с дважды непрерывно дифференцируемыми функциями без ограничений на переменные. Основная идея методов градиентного поиска состоит в построении последовательности точек,
с учетом направления градиента исследуемой функции [3, 4]. Необходимо
построить такую последовательность векторов
01
, , ,
kn
x x x R
, чтобы
выполнялось условие
01
( ) ( ) ( )
k
f x f x f x
2.1. Метод градиентного спуска с постоянным шагом
Необходимо построить последовательность точек {xk}, k = 0, 1, ...,
для которых выполняется условие: f(x
k+1
) < f(xk), k = 0, 1, ... Для определе-
ния такой последовательности используем формулу [4]
x
k+1
= xk – tkf(xk), k = 0, 1, ...
Начальная точка последовательности x0 задается пользователем [4].
Величина шага tk, также задается пользователем и остается постоянной до
тех пор, пока выполняется условие f(x
k+1
) < f(xk), т.е. значение функции
уменьшается в каждой следующей точке последовательности.
Вычисления заканчиваются в точке xk, для которой справедливо
условие [4]: ||f(xk)|| <
1
, где
1
– заданное малое положительное число,
или k N, где N – предельное число итераций, или при двукратном одновременном выполнении двух неравенств ||x
k+1
– xk|| <
2
, |f(x
k+1
) – f(xk)| <
2
,
где
2
– малое положительное число.
Шаг 1. Задание исходных данных: начальная точка x0, 0 < < 1,
1
> 0,
2
> 0, N – максимальное число итераций. Вычисляем градиент
функции в произвольной точке x:
1
( ) ( )
( ) , , .
T
n
f x f x
x
xx

2. Методы градиентного поиска
20
Шаг 2. Задаем текущее значение переменной цикла k = 0.
Шаг 3. Вычисляем значение производной f(xk).
Шаг 4. Проверка условия окончания вычислений: ||f(xk)|| <
1
:
а) если критерий выполнен, расчет закончен, x* = xk;
б) если критерий не выполнен, то переходим к шагу 5.
Шаг 5. Проверка выполнения неравенства k N:
а) если неравенство выполнено, то расчет окончен: x* = xk;
б) если нет, то переходим к шагу 6.
Шаг 6. Задать величину шага tk.
Шаг 7. Вычисляем новую точку последовательности
x
k+1
= xk – tkf(xk).
Шаг 8. Проверяем выполнение условия:
f(x
k+1
) – f(xk) < 0 (или f(x
k+1
) – f(xk) < –||f(xk)||2):
а) если условие выполнено, то переходим к шагу 9;
б) если условие не выполнено, уменьшаем величину шага tk = tk / 2
и переходим к шагу 7.
Шаг 9. Проверить выполнение условий
||x
k+1
– xk|| <
2
, |f(x
k+1
) – f(xk)| <
2
:
а) если оба условия выполнены при текущем значении k и k = k – 1,
то расчет окончен, x* = x
k+1
;
б) если хотя бы одно из условий не выполнено, положить k = k + 1 и
перейти к шагу 3.
Пример 2.1. Найти локальный минимум функции
f(x) = 2x
1
2
– 12x1 + x
2
2
.
I. Определение точки xk, для которой выполняется, по крайней мере, один из критериев окончания расчетов.
1. Задаём начальные значения параметров алгоритма: x0,
1
,
2
, M;
x0 = (5; 3)T,
1
= 0,1;
2
= 0,15; M = 10. Найдем градиент функции в точке x:
f(x) = (4x1 – 12; 2x2)T.
2. Положим k = 0.
30. Вычислим значение f(x0): f(x0) = 45 – 12; 23 = (8; 6)T.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
