Скачиваний:
6
Добавлен:
01.05.2014
Размер:
77.31 Кб
Скачать

Санкт-Петербургский государственный

электротехнический университет «ЛЭТИ»

кафедра ВТ

Лабораторная работа №2

Исследование методов полиномиальной

интерполяции для поиска минимума целевых функций.

Выполнили: студенты гр. 3372

Варакин Д.

Манакова М.

Проверил:

Санкт-Петербург,

2005 г.

Цель работы:

Изучить методы полиномиальной интерполяции для поиска минимума унимодальной функции и реализовать в виде программы метод дихотомии-Пауэлла.

Вариант:

Вар. 3: функция f(x) = x4 – 14x3 + 60x2 – 70x, начальная точка x = 2, точность локализации минимума =10–2, значение минимума 0.780884.

Описание метода:

Метод Пауэлла:

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

  1. Выбрать ε1, ε2, h.

  2. Взять 3 точки a, b, c на равных на равных интервалах. Предполагается, что сработал метод Свенна и получен интервал [a, b].

a=a;

c=b;

b=(a+c)/2;

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

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

на последующих итерациях по формуле:

  1. Проверить критерии близости двух точек:

;

Если он выполняется, принять и остановиться.

Если не выполняется, то из 2-х точек b и d выбрать «лучшую» - в которой наименьшее значение функции, обозначить её как b, а 2 соседние с ней – a и c. Далее рассмотреть 4 ситуации аналогично ЗС-2.

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

Спецификация основных переменны и функций:

Имя

Тип

Входные данные

Вых. данные

Описание

Epsilon

double

-

-

Точность вычислений.

a, b, c, d

double

-

-

Значения промежуточных инетрвалов.

Func()

-

double x

double Func(x)

Заданная функция.

Swann()

-

double *a, *b

double *a, *b

Реализация алгоритма Свенна.

Dihotomy

-

double a, b, *k

double x

Реализует алгоритм дихотомии.

Pauell

-

double a, b, *k

double x

Реализует алгоритм Пауэлла.

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

#include "math.h"

#include "conio.h"

#include "stdio.h"

// Точность вычислений

#define Epsilon 0.001

#define Delta 0.0001

#define min(a,b) (((a) < (b)) ? (a) : (b))

#define max(a,b) (((a) > (b)) ? (a) : (b))

double Mod (double a)

{

return a * (a > 0 ? 1 : -1);

}

// Заданная функция

double Func (double x)

{

return pow(x, 4) - 14*pow(x, 3) + 60*pow(x, 2) - 70*x;

}

// Реализация алгоритма Свенна (сокращение интервала поиска)

void Swann (double *a, double *b)

{

double x1 = 2; // Начальная точка поиска

double h = Func(x1)*0.001; // Начальный шаг

if (Func(x1) < Func(x1+h)) h *= -1; // Выбор направления поиска

while (Func(x1) > Func(x1+h)) // Сокращение интервала с удвоением шага

{

x1 += h;

h *= 2;

}

*a = min(x1+h, x1-h/2);

*b = max(x1+h, x1-h/2);

}

double Dihotomy (double a, double b, int *k)

{

*k = 0;

double x1, x2;

while (b-a > Epsilon)

{

x1 = (a+b-Delta) / 2;

x2 = (a+b+Delta) / 2;

if (Func(x1) < Func(x2))

b = x2;

else

a = x1;

(*k)++;

}

return (a+b) / 2;

}

double Pauell (double a, double b, int *k)

{

double c = b, d = 0;

b = (a+c) / 2;

*k = 0;

while ((Mod((b-d)/b) >= Epsilon) || (Mod((Func(a)-Func(b))/Func(b)) >= Epsilon))

{

if (!(*k) || (*k))

d = 0.5 * (Func(a)*(b*b-c*c) + Func(b)*(c*c-a*a) + Func(c)*(a*a-b*b)) /

(Func(a)*(b-c) + Func(b)*(c-a) + Func(c)*(a-b));

else

d = (a+b)/2 + 0.5 * ((pow(Func(a)-Func(b), 2) * (b-c) * (c-a)) /

(Func(a)*(b-c) + Func(b)*(c-a) + Func(c)*(a-b)));

if (Func(b) > Func(d))

{

c = b;

b = d;

}

else

{

a = b;

b = d;

}

(*k)++;

}

return (b+d) / 2;

}

int main (void)

{

double a, b;

int k1, k2;

Swann(&a, &b);

//printf ("a=%f, b=%f", a, b);

double min1 = Dihotomy (a, b, &k1);

printf ("1. Dihotomy:\n Minimum = %f\n Made %d iterations.\n\n", min1, k1);

double min2 = Pauell (a, b, &k2);

printf ("2. Pauell:\n Minimum = %f\n Made %d iterations.\n", min2, k2);

//printf ("%f %f", a, b);

getch ();

return 0;

}

Примеры выполнения программы:

Точность

Результаты

E = 10-4

1. Dihotomy:

Minimum = 0.780882

Made 15 iterations.

2. Pauell:

Minimum = 0.780884

Made 9 iterations.

E = 10-3

1. Dihotomy:

Minimum = 0.780621

Made 11 iterations.

2. Pauell:

Minimum = 0.780884

Made 9 iterations.

E = 10-2

1. Dihotomy:

Minimum = 0.780963

Made 8 iterations.

2. Pauell:

Minimum = 0.786531

Made 1 iterations.

Ответы на контрольные вопросы:

  1. Когда целесообразно использовать методы полиномиальной интерполяции?

Целесообразно сперва использовать Свенна, потом Золотое сечение, Фибоначчи или дихотомии, потом методы полиномиальной интерполяции.

  1. Сравнить организацию поиска в методах ДСК и Пауэлла.

В отличии от метода Пауэлла в методе Дск организован алгоритм Свенна 3 на который ДСК периодически возвращается и итерационное уточнение с h=h/2 позволяет быстрее отыскать min.

  1. Как строится система из четырех уравнений в методе кубической интерполяции?

F(a)=A*a^3+B*a^2+C*a+D

F(b)=A*b^3+B*b^2+C*b+D

F(c)=A*c^3+B*c^2+C*c+D

F(d)=A*d^3+B*d^2+C*d+D

  1. Перечислить достоинства и недостатки методов интерполяции в задачах оптимизации.

Достоинства:

Ускоряется поиск на заключительных итерациях, эффективны если x0 лежит вблизи x*.

Недостатки:

Выигрыш достигается ценой ограничений. Часто требуют ускорителей.

  1. Почему при минимизации целевых функций используют комбинированные стратегии поиска?

Ускоряется поиск на заключительных итерациях, а вначале эффективнее ЗС, Фиб, Д

  1. Перечислите известные Вам варианты метода Свенна.

Свенна 1,2,3.

  1. Может ли применение метода Давидона привести к неверному определению x*?

Выводы:

Мы сравнили метод дихотомии и метод Пауэлла и пришли к выводу, что метод Пауэлла находит минимум унимодальной функции быстрее примерно в полтора раза, чем метод дихотомии.