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

Отчет к пр 2

.docx
Скачиваний:
21
Добавлен:
24.01.2023
Размер:
281.44 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

Кафедра безопасности информационных систем

ОТЧЁТ

по практической работе № 2 на тему: «Анализ алгоритмов и программ.»

по дисциплине «Алгоритмы и структуры данных»

Выполнил: студент группы ИСТ-114, Медведева С.Г.,

«14» декабря 2022 г. ___________/Медведева С.Г.

Принял: к.ф.-м.н., доцент, И.А. Моисеев

«14» декабря 2022 г. ___________/ И.А. Моисеев /

1 Основная часть

    1. Цель работы

Найти локальный минимум (максимум) функции вида f(x) = 𝒙^𝟑 − 𝒙 + 𝒆^−𝒙 на заданном интервале [a,b] с заданной точностью ε > 0 способами:

1) Методом «деления отрезка» пополам;

2) Методом «золотого сечения»;

3) Методом «Фибоначчи»

4) «Пассивный поиск»

#include <iostream> #include <cmath> #include <chrono> using namespace std; using namespace std::chrono; double fun(double x){ return pow(x,3) - x + pow(M_E,-x); } void passivSearch (double leftBorder, double rightBorder, double step,int task){ double iteration = 0, minVal{INT32_MAX}, maxVal{INT32_MIN}, minPoint,maxPoint; auto start = high_resolution_clock::now(); for(double i{leftBorder}; i <=rightBorder;i+=step){ iteration++; //cout <<"Шаг:" << iteration << "X = " << i << "\t Y= " << fun(i) << endl; if (minVal > fun(i)){ minVal = fun(i); minPoint = i; } if (maxVal<fun(i)){ maxVal = fun(i); maxPoint =i; } } auto stop = high_resolution_clock::now(); auto duration = duration_cast<microseconds>(stop - start); switch (task) { case 0:{ cout << "Минимальное значение функции на [" << leftBorder <<", " << rightBorder <<"]" << endl << "Y= " << minVal << ", точка минимума х = " << minPoint << endl; cout << "Максимальное значение функции на [" << leftBorder <<", " << rightBorder <<"]" << endl << "Y= " << maxVal << ", точка максимума х = " << maxPoint << endl << "Количество шагов: " << iteration << endl << "Время работы программы: " << duration.count() << " микросек."; break; } case -1:{ cout << "Минимальное значение функции на [" << leftBorder <<", " << rightBorder <<"]" << endl << "Y= " << minVal << ", точка минимума х = " << minPoint << endl << "Количество шагов: " << iteration << endl << "Время работы программы: " << duration.count() << " микросек."; break; } case 1:{ cout << "Максимальное значение функции на [" << leftBorder <<", " << rightBorder <<"]" << endl << "Y= " << maxVal << ", точка максимума х = " << maxPoint << endl << "Количество шагов: " << iteration << endl << "Время работы программы: " << duration.count() << " микросек."; } } } void delMin (double leftBorder, double rightBorder, double step){ double x1; double a1=INT32_MIN,b1 = INT32_MAX; double a0 = leftBorder; double b0 = rightBorder; auto start = high_resolution_clock::now(); int iteration = 0; while(b1-a1 > step) { double omegaega = (b0 - a0) / 10; double alp0 = (a0 + b0) / 2 - omegaega; double bet0 = alp0 + 2 * omegaega; double fAlp = fun(alp0); double fBet = fun(bet0); if (fAlp <= fBet) { x1 = alp0; a1 = a0; b1 = bet0; } else { x1 = bet0; a1 = alp0; b1 = b0; } a0 = a1; b0 = b1; iteration++; //cout <<"Шаг:" << iteration << "X = " << (a1+b1)/2 << "\t Y= " << fun((a1+b1)/2) << endl; } auto stop = high_resolution_clock::now(); auto duration = duration_cast<microseconds>(stop-start); cout << "Минимальное значение функции на [" << leftBorder <<", " << rightBorder <<"]" << endl << "Y= " << fun((a1+b1)/2) << ", точка минимума х = " << (a1+b1)/2 << endl << "Время работы программы: " << duration.count() << " микросек."; } void delMax (double leftBorder, double rightBorder, double step){ double x1; double a1=INT32_MIN,b1 = INT32_MAX; double a0 = leftBorder; double b0 = rightBorder; auto start = high_resolution_clock::now(); int iteration = 0; while(b1-a1 > step) { double omegaega = (b0 - a0) / 10; double alp0 = (a0 + b0) / 2 - omegaega; double bet0 = alp0 + 2 * omegaega; double fAlp = fun(alp0); double fBet = fun(bet0); if (fAlp >= fBet) { x1 = alp0; a1 = a0; b1 = bet0; } else { x1 = bet0; a1 = alp0; b1 = b0; } a0 = a1; b0 = b1; iteration++; //cout <<"Шаг:" << iteration << "X = " << (a1+b1)/2 << "\t Y= " << fun((a1+b1)/2) << endl; } auto stop = high_resolution_clock::now(); auto duration = duration_cast<microseconds>(stop-start); cout << "Максимальное значение функции на [" << leftBorder <<", " << rightBorder <<"]" << endl << "Y= " << fun((a1+b1)/2) << ", точка максимума х = " << (a1+b1)/2 << endl << "Время работы программы: " << duration.count() << " микросек."; } void goldMin(double leftBorder, double rightBorder, double step){ double x1; double a1=INT32_MIN,b1 = INT32_MAX; double a0 = leftBorder; double b0 = rightBorder; auto start = high_resolution_clock::now(); int iteration = 0; while(b1-a1 > step) { double omega = b0 - a0; double alp0 =a0+(2*omega)/(3+sqrt(5)); double bet0 = a0+(2*omega)/(1+sqrt(5)); double fAlp = fun(alp0); double fBet = fun(bet0); if (fAlp <= fBet) { x1 = alp0; a1 = a0; b1 = bet0; } else { a1 = alp0; x1 = bet0; b1 = b0; } a0 = a1; b0 = b1; iteration++; //cout<<"Шаг:" << iteration << " X = " << (a1+b1)/2 << "\t Y= " << fun((a1+b1)/2) << endl; } auto stop = high_resolution_clock::now(); auto duration = duration_cast<microseconds>(stop-start); cout << "Минимальное значение функции на [" << leftBorder <<", " << rightBorder <<"]" << endl << "Y= " << fun((a1+b1)/2) << ", точка минимума х = " << (a1+b1)/2 << endl << "Время работы программы: " << duration.count() << " микросек."; } void goldMax(double leftBorder, double rightBorder, double step){ double x1; double a1=INT32_MIN,b1 = INT32_MAX; double a0 = leftBorder; double b0 = rightBorder; auto start = high_resolution_clock::now(); int iteration = 0; while(b1-a1 > step) { double omega = b0 - a0; double alp0 =a0+(2*omega)/(3+sqrt(5)); double bet0 = a0+(2*omega)/(1+sqrt(5)); double fAlp = fun(alp0); double fBet = fun(bet0); if (fAlp >= fBet) { x1 = alp0; a1 = a0; b1 = bet0; } else { a1 = alp0; x1 = bet0; b1 = b0; } a0 = a1; b0 = b1; iteration++; //cout<<"Шаг:" << iteration << " X = " << (a1+b1)/2 << "\t Y= " << fun((a1+b1)/2) << endl; } auto stop = high_resolution_clock::now(); auto duration = duration_cast<microseconds>(stop-start); cout << "Максильманое значение функции на [" << leftBorder <<", " << rightBorder <<"]" << endl << "Y= " << fun((a1+b1)/2) << ", точка максильманое х = " << (a1+b1)/2 << endl << "Время работы программы: " << duration.count() << " микросек."; } double Fib(int n) { if(n == 0) return 1; if(n== 1) return 1; return Fib(n-1) + Fib(n-2); } void searchFibMin(double leftBorder, double rightBorder, double step) { int f0 = 1; int f1=1; double a0 = leftBorder; double b0 = rightBorder; double d0 = b0-a0; int N = 1; auto start = high_resolution_clock::now(); int iteration = 0; while(d0/Fib(N) >= step) { N++; } double x1=0; double a1=INT32_MIN,b1 = INT32_MAX; int k =0; while(b1-a1 > step) { double om = b0 - a0; double alp0 = a0 + Fib(N-k-2)/Fib(N-k)*om; double bet0 = a0 + Fib(N-k-1)/Fib(N-k)*om; double fAlp = fun(alp0); double fBet = fun(bet0); if (fAlp <= fBet) { x1 = alp0; a1 = a0; b1 = bet0; } else { a1 = alp0; x1 = bet0; b1 = b0; } a0 = a1; b0 = b1; k++; iteration++; // cout<<"Шаг:" << iteration << " X = " << (a1+b1)/2 << "\t Y= " << fun((a1+b1)/2) << endl; } auto stop = high_resolution_clock::now(); auto duration = duration_cast<microseconds>(stop-start); cout << "Минимальное значение функции на [" << leftBorder <<", " << rightBorder <<"]" << endl << "Y= " << fun((a1+b1)/2) << ", точка минимума х = " << (a1+b1)/2 << endl << "Время работы программы: " << duration.count() << " микросек."; } void searchFibMax(double leftBorder, double rightBorder, double step) { int f0 = 1; int f1=1; double a0 = leftBorder; double b0 = rightBorder; double d0 = b0-a0; int N = 1; auto start = high_resolution_clock::now(); int iteration = 0; while(d0/Fib(N) >= step) { N++; } double x1=0; double a1=INT32_MIN,b1 = INT32_MAX; int k =0; while(b1-a1 > step) { double om = b0 - a0; double alp0 = a0 + Fib(N-k-2)/Fib(N-k)*om; double bet0 = a0 + Fib(N-k-1)/Fib(N-k)*om; double fAlp = fun(alp0); double fBet = fun(bet0); if (fAlp >= fBet) { x1 = alp0; a1 = a0; b1 = bet0; } else { a1 = alp0; x1 = bet0; b1 = b0; } a0 = a1; b0 = b1; k++; iteration++; //cout<<"Шаг:" << iteration << " X = " << (a1+b1)/2 << "\t Y= " << fun((a1+b1)/2) << endl; } auto stop = high_resolution_clock::now(); auto duration = duration_cast<microseconds>(stop-start); cout << "Максильманое значение функции на [" << leftBorder <<", " << rightBorder <<"]" << endl << "Y= " << fun((a1+b1)/2) << ", точка максильманое х = " << (a1+b1)/2 << endl << "Время работы программы: " << duration.count() << " микросек."; } int main(){ cout << "ПАССИВНЫЙ ПОИСК: " << endl; passivSearch(-5,-3,0.001,0); cout << endl <<endl; cout << "МЕТОД «ДЕЛЕНИЕ ОТРЕЗКА ПОПОЛАМ» " << endl; delMin(-5,-3,0.001); cout << endl; delMax(-5,-3,0.001); cout << endl <<endl; cout << "МЕТОД «ЗОЛОТОГО СЕЧЕНИЯ»" << endl; goldMin(-5,-3,0.001); cout << endl; goldMax(-5,-3,0.001); cout << endl <<endl; cout << "МЕТОД ФИБОНАЧИ" << endl; searchFibMin(-5,-3,0.001); cout << endl; searchFibMax(-5,-3,0.001); cout << endl <<endl; cout << endl <<endl; cout << "ПАССИВНЫЙ ПОИСК: " << endl; passivSearch(0,3,0.001,-1); cout << endl <<endl; cout << "МЕТОД «ДЕЛЕНИЕ ОТРЕЗКА ПОПОЛАМ» " << endl; delMin(0,3,0.001); cout << endl <<endl; cout << "МЕТОД «ЗОЛОТОГО СЕЧЕНИЯ»" << endl; goldMin(0,3,0.001); cout << endl <<endl; cout << "МЕТОД ФИБОНАЧИ" << endl; searchFibMin(0,3,0.001); cout << endl <<endl; cout << endl <<endl; cout << "ПАССИВНЫЙ ПОИСК: " << endl; passivSearch(-3,0,0.001,1); cout << endl <<endl; cout << "МЕТОД «ДЕЛЕНИЕ ОТРЕЗКА ПОПОЛАМ» " << endl; delMax(-3,0,0.001); cout << endl <<endl; cout << "МЕТОД «ЗОЛОТОГО СЕЧЕНИЯ»" << endl; goldMax(-3,0,0.001); cout << endl <<endl; cout << "МЕТОД ФИБОНАЧИ" << endl; searchFibMax(-3,0,0.001); }

САНКТ-ПЕТЕРБУГР

2022

Соседние файлы в предмете Алгоритмы и системы данных