Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная№1 вариант№4 / Отчет_по_лр_№1

.doc
Скачиваний:
7
Добавлен:
01.05.2014
Размер:
66.12 Кб
Скачать

Министерство Образования РФ

Санкт-Петербургский Государственный Электротехнический Университет

Лабораторная работа 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;

}

Соседние файлы в папке Лабораторная№1 вариант№4