Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой проект.docx
Скачиваний:
27
Добавлен:
05.09.2014
Размер:
184.74 Кб
Скачать

Алгоритм Фибоначчи-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.

Метод Давидона

Начальный этап

  1. Выбрать ε, x0, p, α1

  2. Предполагается, что сработал метод Свенна и получен интервал [a, b].

Основной этап

  1. Найти аппроксимирующий минимум, т.е. точку d по формулам:

  1. Проверить КОП: если y`r≤ ε, то остановиться, х=a+αrp. Иначе: сократить ТИЛ: если y`r <0, то [r,b], если y`r >0, то [a,r].

Положить k=k+1 и вернуться на шаг 1.

Блок-схемы

Метод Свенна

Метод ЗС-1

Метод Фибоначчи-1

Метод квадратичной интерполяции – экстраполяции

Метод Давидона

Текст программ на языке С++

Исследование методов одномерного поиска минимума унимодальной функции

Метод Свенн – метод Ньютона

Спецификация программы:

a, b – текущий интервала локализации

h – размер шага

min –минимум

x1 – стартовая точка

k, k1 – счетчики числа итераций.

Текст программы:

#include<conio.h>

#include <math.h>

#include <iostream.h>

long double a,b;

int k1, k;

double fx(double x) // функции

{

// возрат в зависимocти от x

if(x>=0)

return (4*x*x*x-3*x*x*x*x);

else

return (4*x*x*x+3*x*x*x*x);

}

double dif(double x) // производные для ньютона

{ if(x>=0)

return (12*x*x-12*x*x*x);

else

return (12*x*x+12*x*x*x);

}

double dif2(double x)

{ if(x>=0) return (24*x-36*x*x);

else return (24*x+36*x*x);

}

double Sven(long double x1, long double x2, long double h)

{ // Метод Свенн

long double x3,z;

x2=x1+h;

while (1)

{

h=2*h;

x3=x2+h;

if (fx(x3)>fx(x2))

break;

x1=x2;

x2=x3;

k1=k1+1;

}

a=x1;

b=x3;

if(a>b) //a– всегда слева,b- справа

{

z=b;

b=a;

a=z;

}

return h;

}

void main()

{

clrscr();

double x1,x2,h=0.01,e=0.001;

x1=0.4; //Начальная точка

x2=x1+h;

cout<<"\nNach tochka x1: "<<x1;

if ( fx(x2) > fx(x1))

{

h=-h; // меняем знак если функция растет

x2=x1+h;

}

h=Sven (x1,x2,h);

cout << "\n\nsSchag svenn. k= " << k1;

cout << "\nInterval posle Svenn";

cout << "\na= " << a << endl;

cout << "b= " << b << endl;

do // Ньютон

{

x1=a;

x2=b;

x1=x2-dif(x2)/dif2(x2);

k++;

cout<<"\nx1-x2;

}

while(fabs(x1-x2)>e && fabs(dif(x1))>e);

cout << "\n\nsSchag Nuton. k= " << k;

cout << "\n\nMinimum= " << x1;

getch();

}

Результаты работы программы

интервал по Свенну: -2.15 … -0.23

число повторений цикла после установления интервала k=6

минимум функций по Ньютону 1.000000

число повторений цикла после установления интервала k=4

График функции

Соседние файлы в предмете Методы оптимизации