Лабораторная работа №22 / lab2
.docСанкт-Петербургский государственный
электротехнический университет «ЛЭТИ»
кафедра ВТ
Лабораторная работа №2
Исследование методов полиномиальной
интерполяции для поиска минимума целевых функций.
Выполнили: студенты гр. 3372
Варакин Д.
Манакова М.
Проверил:
Санкт-Петербург,
2005 г.
Цель работы:
Изучить методы полиномиальной интерполяции для поиска минимума унимодальной функции и реализовать в виде программы метод дихотомии-Пауэлла.
Вариант:
Вар. 3: функция f(x) = x4 – 14x3 + 60x2 – 70x, начальная точка x = 2, точность локализации минимума =10–2, значение минимума 0.780884.
Описание метода:
Метод Пауэлла:
Начальный этап
-
Выбрать ε1, ε2, h.
-
Взять 3 точки a, b, c на равных на равных интервалах. Предполагается, что сработал метод Свенна и получен интервал [a, b].
a=a;
c=b;
b=(a+c)/2;
Основной этап
-
Найти аппроксимирующий минимум на 1-й итерации по формуле:
на последующих итерациях по формуле:
-
Проверить критерии близости двух точек:
;
Если он выполняется, принять и остановиться.
Если не выполняется, то из 2-х точек b и d выбрать «лучшую» - в которой наименьшее значение функции, обозначить её как b, а 2 соседние с ней – a и c. Далее рассмотреть 4 ситуации аналогично ЗС-2.
-
Положить 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.
Ответы на контрольные вопросы:
-
Когда целесообразно использовать методы полиномиальной интерполяции?
Целесообразно сперва использовать Свенна, потом Золотое сечение, Фибоначчи или дихотомии, потом методы полиномиальной интерполяции.
-
Сравнить организацию поиска в методах ДСК и Пауэлла.
В отличии от метода Пауэлла в методе Дск организован алгоритм Свенна 3 на который ДСК периодически возвращается и итерационное уточнение с h=h/2 позволяет быстрее отыскать min.
-
Как строится система из четырех уравнений в методе кубической интерполяции?
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
-
Перечислить достоинства и недостатки методов интерполяции в задачах оптимизации.
Достоинства:
Ускоряется поиск на заключительных итерациях, эффективны если x0 лежит вблизи x*.
Недостатки:
Выигрыш достигается ценой ограничений. Часто требуют ускорителей.
-
Почему при минимизации целевых функций используют комбинированные стратегии поиска?
Ускоряется поиск на заключительных итерациях, а вначале эффективнее ЗС, Фиб, Д
-
Перечислите известные Вам варианты метода Свенна.
Свенна 1,2,3.
-
Может ли применение метода Давидона привести к неверному определению x*?
Выводы:
Мы сравнили метод дихотомии и метод Пауэлла и пришли к выводу, что метод Пауэлла находит минимум унимодальной функции быстрее примерно в полтора раза, чем метод дихотомии.