Практическая работа 1. Анализ алгоритмов и программ. Задание
![]()
|
Задание. Найти локальный минимум (максимум) функции вида f(x) = ![]() Методом «деления отрезка» пополам; Методом «золотого сечения»; Методом «Фибоначчи». Провестианализ разработанного алгоритма и программы и сравнить с аналогичным решением с помощью алгоритма «пассивного поиска». Вход: вид функции, границы отрезка, требуемая точность Выход (на экране и в файле): таблица пошаговых приближений, количество итераций (шагов поиска), значение точки минимума, значение функции в этой точке. Справочный материал к заданию. Время работы программы Директива препроцессора: include Начальное время работы программы:srand(time(0)) Конечное время работы программы(в секундах): clock()/1000.0 «Пассивный поиск» Графический вид для заданной в задаче функции: ![]() Пример Программы, которая осуществляет поиск локального минимума функции на интервале ![]() ![]() #include #include #include #include #include using namespace std; int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); srand(time(0)); // начальное время floatmin=0,x,y,k,h=1;// описание используемых в программе переменных intstep=0; for(x=-5.0;x<=-2.0;x=x+h)// основной цикл вычисления значений функции на { step++; // заданном промежутке y=x*x*x-x+exp(-x); printf(" %d. x = %fy = %f\n",step,x,y); // вывод на экран if(y { min=y; k=x; }; printf("минимальное значение функции на [-5,-2] \n"); printf("y = %f, точка минимума x = %f\n",min,k); printf("количество шагов = %d\n",step); cout<< "Время работы программы = " <<clock()/1000.0< } Ответы:
Очевидно, что с ростом количества вычислений пропорционально (с некоторым коэффициентом) растет и время работы программы. Легко подсчитать, что сложность алгоритма равна О(n). Также видно, что точные значения и функции, и точки, в которой эта функция достигает минимума можно определить только с некоторой погрешностью. Поэтому для вычисления экстремумов функций используют методы, которые определяют значение с некоторой, заранее заданной точностью. Например, чтобы приблизительное решение отличалось от «истинного» с погрешностью ε=0.001.Из примера «пассивного поиска» можно заметить, что искомый минимум лежит где-то в интервале |-3.679099 ![]() Метод «деления отрезка пополам» Поставим задачу: найти отрезок длины не более ![]() ![]() ![]() ![]() ![]() ![]() Д ![]() ля удобства пояснения алгоритма метода обозначим исходный отрезок ![]() ![]() ![]() ![]() ![]() Если ![]() ![]() ![]() ![]() В первом случае в качестве приближения ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Приведенный алгоритм является классическим. Заметим, что в нем на каждом шаге необходимо произвести два вычисления значения функции: ![]() ![]() Пример. Определим с точностью ![]() ![]() ![]() ![]() Установим ![]() Первая итерация: вычислим ![]() ![]() ![]() ![]() сравним ![]() ![]() ![]() ![]() и так как условия Δ1= ![]() ![]() Итерационный процесс будем продолжать до тех пор, пока для установленного вновь отрезка локализации данные условия не будут выполнены. Результаты итераций сведем в таблицу 1. Таблица 1
Из таблицы видно, что искомый результат на 14-ом шаге вычислений. При этом: ![]() Метод «золотого сечения» Отличие метода золотого сечения от метода деления отрезка пополам заключается в специальном разбиении отрезка локализации относительно его центра точками. Термин «золотое сечение» ввел Леонардо да Винчи. Принципы, заложенные в основу этого сечения, широко использовались при композиционном построении многих произведений искусства античности и эпохи Возрождения: особенно в живописи и архитектуре. Определение. Золотым сечениемотрезка ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Замечательно также, что точки ![]() ![]() ![]() ![]() ![]() ![]() Итерационный процесс локализации минимума функции на заданном числовом отрезке в данном методе ведется аналогично локализации минимума функции в методе деления отрезка пополам. В отличие от него точки ![]() ![]() ![]() Свойства золотого сечения позволяют также несколько упростить процедуру поиска точки локализации ![]() ![]() ![]() ![]() ( ![]() ![]() ![]() ![]() ![]() ![]() ![]() Метод Фибоначчи Данный метод обеспечивает максимальное гарантированное сокращение отрезка локализации при заданном числе N вычислений функции и основан на использовании чисел Фибоначчи ![]() ![]() ![]() ![]() Метод Фибоначчи состоит из ![]() Вначале определяется такое число Фибоначчи ![]() ![]() ![]() Очередной ![]() ![]() ![]() ![]() ![]() ![]() где ![]() ![]() Аналогично методу деления отрезка пополам определяется новый отрезок локализации: если ![]() ![]() если ![]() ![]() В первом случае за очередное приближение к точке минимума ![]() ![]() ![]() ![]() Примерная схема алгоритма: ![]() Все 4 метода реализовать для поиска экстремальных точек в интервалах переменной x—[-5,-3], [0,3] —точки минимума и [-3,0] — точка максимума. |