Лабораторная№1 вариант№4 / Отчет_по_лр_№1
.docМинистерство Образования РФ
Санкт-Петербургский Государственный Электротехнический Университет
Лабораторная работа 1
Исследование методов одномерного поиска минимума унимодальных функций
Выполнил:
Преподаватель:
Дмитревич Г.Д.
Санкт-Петербург
2009
Цель работы:
На языке программировании С/С++ реализовать алгоритмы одномерного поиска минимума унимодальных функций.
Для функции x4-14x3+60x2-70x найти локальный минимум методами Свенна и Фибоначчи2. Начальная точка x1=2, точность локализации минимума – 10-2.
Описание методов:
Метод Свенна.
С помощью этого метода получаем начальный интервал локализации минимума.
Начальный этап:
1) задать x0 – произвольная начальная точка.
2) выбрать шаг h равным 0.001 или 0.01*|x0|.
Основной этап:
Шаг 1:
Установить направление убывания целевой функции. Для этого надо взять x2=x1+h. Если f1<f2, то надо поменять направление движения(h=-h и взять x2=x1+h).
Шаг 2:
Вычислять fk в точках xk+1=xk+hk, где hk=2hk-1, k=2,3,…,n-1 до тех пор, пока не придём в точку xn такую что fn>fn-1.
Шаг 3:
Установить начальный интервал локализации минимума a1=xn-2 и b1=xn.
Метод Фибоначчи-2.
Метод Фибоначчи является процедурой линейного поиска минимума унимодальной функции f(x) на замкнутом интервале [a, b], отличающейся от процедуры золотого сечения тем, что очередная пробная точка делит интервал локализации в отношении двух последовательных чисел Фибоначчи. Последовательность чисел Фибоначчи задаётся условиями F0 = F1 = 1, Fk+1 = Fk + Fk-1, k = 1,2,... Начальными членами последовательности будут 1, 1, 2, 3, 5, 8, 13,... Стратегия поиска Фибоначчи требует заранее указать n - число вычислений минимизируемой функции и - константу различимости двух значений f(x). Рассмотрим один из возможных вариантов метода.
Начальный этап
(1) Задать константу , начальный интервал [a1, b1], длину конечного интервала Ln и определить число n так, чтобы выполнялось условие Fn > (b1 - a1)/Ln.
(2) Взять две пробные точки 1 = a1 + (Fn-2/Fn)(b1 - a1) и 1 = a1 + (Fn-1/Fn)(b1-a1). Положить k = 1.
Основной этап
Шаг 1. Сократить текущий интервал локализации:
(1) Если f(k) < f(k), то положить ak+1 = ak, bk+1 = k,k+1 =k и вычислить новую точку k+1 = ak+1 + (Fn-k-2/Fn-k)Lk+1, где Lk+1 = bk+1 - ak+1; перейти на шаг 2.
(2) Если f(k)≥ f(k),то положить ak+1 =k, bk+1 = bk, k+1 = k и вычислить k+1 = ak+1 + (Fn-k-1/Fn-k) Lk+1.
Шаг 2. Проверить критерий окончания поиска:
(1) Заменить k на k+1. (2) Если k = n - 1, перейти на шаг 3, иначе - на шаг 1.
Шаг 3. Найти аппроксимирующий минимум х(*):
(1) Положить k = k + .
(2) Если f(k) > f(k), то x(*) = (k + bk)/2. В противном случае - x(*) = (ak + k)/2.
Пооператорная блок-схема находиться в приложении 1.
Текст программы находиться в приложении 2.
Результаты тестирования программы:
Вариант 1:
Function: x^4-14*x^3+60*x^2-70*x
Begin point: 2.000000
Eps: 0.010000
Method Svenna
Iteration 1. x1=2.000000 x2=1.000000 x3=0.000000 d=-2.000000
Svenn return interval = (0.000000,2.000000)
Method Fibonachchi
Iteration 1: (0.000000,1.236052)
Iteration 2: (0.472103,1.236052)
Iteration 3: (0.472103,0.944206)
Iteration 4: (0.652361,0.944206)
Iteration 5: (0.652361,0.832618)
Iteration 6: (0.721030,0.832618)
Iteration 7: (0.763948,0.832618)
Iteration 8: (0.763948,0.806867)
Iteration 9: (0.763948,0.789700)
Iteration 10: (0.772532,0.789700)
Fibonachchi result: 0.781824
Вариант 2:
Function: x^4-14*x^3+60*x^2-70*x
Begin point: 2.000000
Eps: 0.001000
Method Svenna
Iteration 1. x1=2.000000 x2=1.000000 x3=0.000000 d=-2.000000
Svenn return interval = (0.000000,2.000000)
Method Fibonachchi
Iteration 1: (0.000000,1.236068)
Iteration 2: (0.472136,1.236068)
Iteration 3: (0.472136,0.944272)
Iteration 4: (0.652477,0.944272)
Iteration 5: (0.652477,0.832817)
Iteration 6: (0.721362,0.832817)
Iteration 7: (0.763932,0.832817)
Iteration 8: (0.763932,0.806502)
Iteration 9: (0.763932,0.790248)
Iteration 10: (0.773994,0.790248)
Iteration 11: (0.773994,0.784056)
Iteration 12: (0.777864,0.784056)
Iteration 13: (0.777864,0.781734)
Iteration 14: (0.779412,0.781734)
Iteration 15: (0.780186,0.781734)
Fibonachchi result: 0.781073
Вариант 3:
Function: x^4-14*x^3+60*x^2-70*x
Begin point: 20.000000
Eps: 0.010000
Method Svenna
Iteration 1. x1=20.000000 x2=19.000000 x3=18.000000 d=-2.000000
Iteration 2. x1=19.000000 x2=18.000000 x3=14.000000 d=-4.000000
Iteration 3. x1=18.000000 x2=14.000000 x3=6.000000 d=-8.000000
Iteration 4. x1=14.000000 x2=6.000000 x3=-10.000000 d=-16.000000
Svenn return interval = (-10.000000,14.000000)
Method Fibonachchi
Iteration 1: (-0.832817,14.000000)
Iteration 2: (-0.832817,8.334365)
Iteration 3: (-0.832817,4.832817)
Iteration 4: (-0.832817,2.668731)
Iteration 5: (-0.832817,1.331269)
Iteration 6: (-0.006192,1.331269)
Iteration 7: (0.504644,1.331269)
Iteration 8: (0.504644,1.015480)
Iteration 9: (0.699690,1.015480)
Iteration 10: (0.699690,0.894737)
Iteration 11: (0.699690,0.820433)
Iteration 12: (0.746130,0.820433)
Iteration 13: (0.746130,0.792570)
Iteration 14: (0.764706,0.792570)
Iteration 15: (0.773994,0.792570)
Fibonachchi result: 0.783638
Вариант 4:
Function: x^4-14*x^3+60*x^2-70*x
Begin point: 20.000000
Eps: 0.001000
Method Svenna
Iteration 1. x1=20.000000 x2=19.000000 x3=18.000000 d=-2.000000
Iteration 2. x1=19.000000 x2=18.000000 x3=14.000000 d=-4.000000
Iteration 3. x1=18.000000 x2=14.000000 x3=6.000000 d=-8.000000
Iteration 4. x1=14.000000 x2=6.000000 x3=-10.000000 d=-16.000000
Svenn return interval = (-10.000000,14.000000)
Method Fibonachchi
Iteration 1: (-0.832816,14.000000)
Iteration 2: (-0.832816,8.334369)
Iteration 3: (-0.832816,4.832816)
Iteration 4: (-0.832816,2.668737)
Iteration 5: (-0.832816,1.331263)
Iteration 6: (-0.006211,1.331263)
Iteration 7: (0.504659,1.331263)
Iteration 8: (0.504659,1.015528)
Iteration 9: (0.699794,1.015528)
Iteration 10: (0.699794,0.894930)
Iteration 11: (0.699794,0.820393)
Iteration 12: (0.745856,0.820393)
Iteration 13: (0.745856,0.791918)
Iteration 14: (0.763443,0.791918)
Iteration 15: (0.774331,0.791918)
Iteration 16: (0.774331,0.785218)
Iteration 17: (0.778518,0.785218)
Iteration 18: (0.778518,0.782706)
Iteration 19: (0.780193,0.782706)
Iteration 20: (0.780193,0.781868)
Fibonachchi result: 0.781112
Сводный результат тестирования:
x4-14x3+60x2-70x |
10-2 |
10-3 |
||
X0=2 |
k |
X* |
k |
X* |
Метод Свенна |
1 |
[0.0000,2.0000] |
1 |
[0.0000,2.0000] |
Метод Фибоначчи |
10 |
0.781824 |
15 |
0.781073 |
x4-14x3+60x2-70x |
10-2 |
10-3 |
||
X0=20 |
k |
X* |
k |
X* |
Метод Свенна |
4 |
[-10.0000,14.0000] |
4 |
[-10.0000,14.0000] |
Метод Фибоначчи |
15 |
0.783638 |
20 |
0.781112 |
Ответы на контрольные вопросы:
1. Сравните метод золотого сечения, Фибоначчи и дихотомического поиска по числу вычислений значений функций для достижения заданной точности при локализации минимума.
Метод дихотомии наиболее прост в реализации, но по сравнению с методом золотого сечения он менее эффективен. Метод Фибоначчи использует числа Фибоначчи и поэтому он быстрее сходится к искомому минимуму, чем метод золотого сечения. 2.Указать отличие метода золотого сечения 1 от метода золотого сечения 2?
ЗС-1 опирается на точное вычисление точек на каждой итерации, а ЗС-2 использует соблюдения правила симметрии и для старта требуется указать одну и только одну точку.
3. Как сокращается текущий интервал локализации минимума в методах Фибоначчи-1 и Фибоначчи-2? Фиб1: Начальный этап
(1) Задать константу , начальный интервал [a1, b1], длину конечного интервала Ln и определить число n так, чтобы выполнялось условие Fn > (b1 - a1)/Ln.
(2) Взять две пробные точки 1 = a1 + (Fn-2/Fn)(b1 - a1) и 1 = a1 + (Fn-1/Fn)(b1-a1). Положить k = 1.
Основной этап
Шаг 1. Сократить текущий интервал локализации:
(1) Если f(k) < f(k), то положить ak+1 = ak, bk+1 = k,k+1 =k и вычислить новую точку k+1 = ak+1 + (Fn-k-2/Fn-k)Lk+1, где Lk+1 = bk+1 - ak+1; перейти на шаг 2.
(2) Если f(k)>> f(k),то положить ak+1 =k, bk+1 = bk, k+1 = k и вычислить k+1 = ak+1 + (Fn-k-1/Fn-k) Lk+1.
Шаг 2. Проверить критерий окончания поиска:
(1) Заменить k на k+1. (2) Если k = n - 1, перейти на шаг 3, иначе - на шаг 1.
Шаг 3. Найти аппроксимирующий минимум х(*):
(1) Положить k = k + .
(2) Если f(k) > f(k), то x(*) = (k + bk)/2. В противном случае - x(*) = (ak + k)/2.
Фиб2 : сокращение происходит аналогично, только вначале берется не 2 точки а одна, которая откладывается от любого из концов интервала, и все последующие точки берутся по правилу симметрии Х2 = Ак+Вк–Х1 и сравнением 4ех ситуаций (как в методе ЗС-2) происходит сокращение интервала.
4. Определите достоинства и недостатки методов Ньютона и трехточечного поиска.
Метод трехточечного поиска позволяет сократить интервал локализации минимума на основе сравнения значений функции в пробных точках без вычисления производных. А в методе Ньютона минимизация f(x) основывается на использовании квадратичной аппроксимации функции f(x) в точке xk:
F(x) = f(xk) + f '(xk)(x - xk) + f ''(xk)(x - xk)2 * 1/2
В качестве приближения хk+1 к минимуму х* берется точка, в которой производная F'(x) равна нулю, т.е. f '(xk) + f ''(xk)(xk+1 -xk) = 0.
Таким образом, xk+1 = xk - f '(xk)/f ''(xk).
Итерационный процесс строит последовательность точек {xk}, которая при определенных условиях квадратично сходится к некоторой стационарной точке х* функции f(x), т.е. к точке, в которой f ' (x*) = 0. Процесс останавливается, когдаxk+1 - xk ≤ и f '(xk) ≤ , где > 0 - заранее заданное малое число.
Существенными недостатками метода Ньютона являются: 1) сложность задания начального приближения х1 в малой окрестности искомого минимума х*; 2) необходимость вычисления вторых производных минимизируемой функции.
5.Что такое унимодальная функция и каково её значение в теории оптимизации?
Унимодальная функция – это функция которая имеет единственный минимум и монотонна по обе стороны от него. При этом у неё не должно быть горизонтальных участков. Унимодальная функция является основой в теории поиска, так как она разработана для большинства методов поиска.
6.Сформулировать необходимые и достаточные условия минимума функции одной переменной? Как преобразовать задачу на поиск максимума в задачу на минимум?
Аналитическое условие экстремума, т.е. равенство производной функции в данной точке, является необходимым и достаточным условием минимума. Задача на поиск максимума преобразуется в задачу на поиск минимума противоположной функции, т.е. задача на поиск максимум функции F(x), а на поиск минимума (-F(x))
7.Характерные особенности организации одномерного поиска?
Линейный поиск, рассматриваются только унимодальные функции.
Начальный интервал локализации минимума находится методом Свенна
Меньший интервал локализации получается путём рассмотрения значений функции в двух точках на ТИЛ, или в производной в одной точке, и выборе новых границ интервала.
8. Дайте геометрическую интерпретацию 2-х способов выбора последних точек в методе Фибоначчи.
Точки в методе Фибоначчи 1 находятся по формулам:
k+1 = ak+1 + (Fn-k-2/Fn-k)Lk+1 и k+1 = ak+1 + (Fn-k-1/Fn-k) Lk+1.
А очередная точка в методе Фибоначчи 2 находится по правилу симметрии Х2 = Ак+Вк–Х1
Приложение 1.1
Блок схема основной программы.
Приложение 1.2
Блок схема метода Свенна.
Приложение 1.3
Блок схема метода Фибоначчи.
Приложение 2
Текст программы.
#include <conio.h>
#include <stdio.h>
#include <math.h>
//структура для передачи интервала
struct interval
{
double min_val;
double max_val;
};
//расчет значения функции в точке Х
double function(double x)
{
double x2 = x*x;
return (x2*x2-14*x2*x+60*x2-70*x);
}
//Реализация метода Свенна
struct interval Svenn(double x0)
{
struct interval result;
double d = 1;
int k;
double x1,x2,x3;
//Начальный этап
double func_x0 = function(x0);
double func_x1 = function(x0-d);
double func_x2 = function(x0+d);
double func_x3;
printf("\nMethod Svenna\n");
//Определяем направление поиска интервала
if (func_x1 <= func_x0 && func_x0 <= func_x2)
d *= -1;
//Если условие выполняется, то интервал найден
if (func_x1 > func_x0 && func_x0 <= func_x2)
{
result.min_val = x0-fabs(d);
result.max_val = x0+fabs(d);
return result;
}
//Получить точки Х1 и Х2
k = 0;
x1 = x0;
x2 = x0+d*(1<<k);
k++;
//Получить точку Х3
x3 = x1+d*(1<<k);
//Рассчитать значения функций в этих точках
//для уменьшения кол-ва вычислений функции
func_x1 = function(x1);
func_x2 = function(x2);
func_x3 = function(x3);
printf("Iteration %d. x1=%f x2=%f x3=%f d=%f\n",k,x1,x2,x3,d*(1<<k));
//Основной этап
while (func_x3 < func_x2)
{
k++;
//Находим следующие точки
x1 = x2;
x2 = x3;
x3 += d*(1<<k);
printf("Iteration %d. x1=%f x2=%f x3=%f d=%f\n", k, x1, x2, x3, d*(1<<k));
func_x2 = func_x3;
func_x3 = function(x3);
}
//Возвращаем найденный интервал
if (x1 > x3)
{
result.min_val = x3;
result.max_val = x1;
}
else
{
result.min_val = x1;
result.max_val = x3;
}
return result;
}
//Получение числа Фибоначчи
//Рекурсивная функция
int FNumber(int n)
{
if (n <= 1)
return 1;
else
return FNumber(n-1)+FNumber(n-2);
}
//Реализация метода Фибоначчи
double Fibonachchi(struct interval val,double eps)
{
int n;
double l,m;
//Начальный этап.
int k = 1;
printf("\nMethod Fibonachchi\n");
//Находим начальное число Фибоначчи
double Lk = val.max_val-val.min_val;
for (n=1;n<30;n++)
{
if ((double)FNumber(n) >= Lk/eps)
break;
}
//Находим две пробные точки
l = val.min_val+((double)FNumber(n-2)/(double)FNumber(n))*(val.max_val-val.min_val);
m = val.min_val+((double)FNumber(n-1)/(double)FNumber(n))*(val.max_val-val.min_val);
//Основной этап.
while (k < n-1)
{
//Сокращаем ТИЛ
//и находим новые точки для проверки
if (function(l)<function(m))
{
val.max_val = m;
m = l;
l = val.min_val + (double)FNumber(n-k-2)/(double)FNumber(n-k)*(val.max_val - val.min_val);
}
else
{
val.min_val = l;
l = m;
m = val.min_val+(double)FNumber(n-k-1)/(double)FNumber(n-k)*(val.max_val - val.min_val);
}
printf("Iteration %d: (%f,%f)\n",k,val.min_val,val.max_val);
k++;
}
//Находим аппроксимирующий минимум.
m = l + eps;
if (function(l) > function(m))
return (l+val.max_val)/2;
else
return (val.min_val+m)/2;
}
//Основная программа
int main(int argc,char* argv[])
{
double x;
double eps;
struct interval sv;
double res;
clrscr();
//Установка начальных данных
x = 2;
eps = 1e-2;
printf("Function: x^4-14*x^3+60*x^2-70*x\n");
printf("Begin point: %f\n",x);
printf("Eps: %f\n",eps);
//Получение интервала методом Свенна.
sv = Svenn(x);
printf("Svenn return interval = (%f,%f)\n",sv.min_val,sv.max_val);
//Получение локального минимума методом Фибоначчи
res = Fibonachchi(sv,eps);
printf("Fibonachchi result: %f\n",res);
return 0;
}