расчетная работа №2 фомичева. Методы оптимизации 1 и 2 порядка
Скачать 3.87 Mb.
|
институт технологий бизнеса Кафедра прикладной информатики и статистики Расчетная работа №2 по теме: Методы оптимизации 1 и 2 порядка. Вариант - 25 Выполнил студент группы: ПИЭ-20.20 Фомичева А.С. Проверил доцент, к. физ.-мат. н.: Прокопенко Н.Ю. г. Нижний Новгород 2022 г СОДЕРЖАНИЕ ДАНО 4 ЗАДАНИЯ 4 1.1. КРАТКОЕ ОПИСАНИЕ АЛГОРИТМА 6 1.2. ТЕКСТ ПРОГРАММЫ 7 1.3. БЛОК СХЕМА ПРОГРАММЫ 9 1.4. ФОРМУЛЬНЫЕ РАСЧЁТЫ 2 ИТЕРАЦИИ 10 1.5. РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ 11 2.1. КРАТКОЕ ОПИСАНИЕ АЛГОРИТМА 12 2.2. ТЕКСТ ПРОГРАММЫ 14 2.3. БЛОК СХЕМА ПРОГРАММЫ 16 2.4. ФОРМУЛЬНЫЕ РАСЧЁТЫ 2 ИТЕРАЦИИ 18 2.5. РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ 20 3.1. КРАТКОЕ ОПИСАНИЕ АЛГОРИТМА 21 3.2. ТЕКСТ ПРОГРАММЫ 22 3.3. БЛОК СХЕМА ПРОГРАММЫ 24 3.4. ФОРМУЛЬНЫЕ РАСЧЁТЫ 2 ИТЕРАЦИИ 25 3.5. РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ 27 4.1. СРАВНЕНИЕ ПО КОЛИЧЕСТВАМ ОБРАЩЕНИЙ К ФУНКЦИИ 28 4.2. СРАВНЕНИЕ ТОЧНОСТИ ПРИ ЗАДАННОМ КОЛИЧЕСТВЕ ИТЕРАЦИЙ 28 ЦЕЛЬ РАБОТЫНайти экстремум функции методом средней точки, методом хорд и методом Ньютона и провести сравнение данных методов по точности и по количеству итераций. УСЛОВИЯ ЗАДАЧИ И ЗАДАНИЯДАНОЗАДАНИЯ1. Для функции своего варианта реализовать методы средней точки, метод хорд и метод Ньютона для поиска точки минимума. 2. Для каждого метода записать формулами расчеты 2 итерации поиска Минимума. 3. Провести сравнение методов по точности и по количеству итераций. 4. Оформить отчет. Данная функция унимодальна на отрезке [-8; 6]. 1. МЕТОД СРЕДНЕЙ ТОЧКИ1.1. КРАТКОЕ ОПИСАНИЕ АЛГОРИТМА1.2. ТЕКСТ ПРОГРАММЫ#include #include using namespace std; double func(double x) { return (x - 5) * exp(x); } double func_1(double x) { return (x - 4) * exp(x); } int main() { setlocale(0, "ru"); double a = -8, b = 6, e = 0.055; int steps = 0; int calls = 0; double x = (a + b) / 2, y; double f1 = func_1(x); calls = calls + 1; action_1: cout<<"Границы: ["< if (fabs(f1) <= e) { steps = steps + 1; goto action_2; } if (f1 > 0) { b = x; x = (a + b) / 2; f1 = func_1(x); calls = calls + 1; steps = steps + 1; goto action_1; } else { a = x; x = (a + b) / 2; f1 = func_1(x); calls = calls + 1; steps = steps + 1; goto action_1; } action_2: y = func(x); cout << "x(наим) = " << x<< ", "<< "y(x) = " << y << ". " << "Number of steps - " << steps <<". "<< endl; cout << "Количество вызовов функции - " << calls; } 1.3. БЛОК СХЕМА ПРОГРАММЫ1.4. ФОРМУЛЬНЫЕ РАСЧЁТЫ 2 ИТЕРАЦИИ1.5. РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ2. МЕТОД ХОРД2.1. КРАТКОЕ ОПИСАНИЕ АЛГОРИТМАВ ходе написания программы мною было выяснено, что программа достигает заданной точности на 1 итерации, поэтому было принято решение уменьшить точность, чтобы программа совершило более одной итерации и верно определила точку минимума заданной функции. 2.2. ТЕКСТ ПРОГРАММЫ#include #include using namespace std; double func(double x) { return (x - 5) * exp(x); } double func_1(double x) { return (x - 4) * exp(x); } int main() { setlocale(0, "ru"); double a = -8, b = 6, f1, f2, f3, x0; double y; double e = 0.001; double x; int count = 1; int steps = 0; int calls = 0; cout<< "Границы: ["< action_1: f1 = func_1(a); f2 = func_1(b); calls = calls + 2; if(f1 * f2 < 0) { x = a - (f1/(f1 - f2)) * (a - b); y = func_1(x); steps = steps + 1; if(fabs(y)<= e) { cout<<"Требуемый уровень точности достигнут. - "< steps = steps + 1; goto action_2; } if(fabs(y) > e) { cout<<"Точность = "< if(y > 0) { b = x; f2 = y; steps = steps + 1; cout<< "Границы: ["< goto action_1; } if(y <= 0) { a = x; f1 = y; steps = steps + 1; cout<< "Границы: ["< goto action_1; } } } else { if(f1 > 0 && f2 > 0) { cout<<"Функция возрастает на данном отрезке. "< x = a; steps = steps + 1; goto action_2; } if(f1 < 0 && f2 < 0) { cout<<"Функция убывает на данном отрезке. "< x = b; steps = steps + 1; goto action_2; } if(f1 * f2 == 0) { double f3 = func(a); double f4 = func(b); if(f3 < f4) { x = a; steps = steps + 1; goto action_2; } if(f3 > f4) { x = b; steps = steps + 1; goto action_2; } } } action_2: cout< y = func(x); calls = calls + 1; cout<<"Ответ: "; cout << "x(наим) = " << x<< ", "<< "y(x) = " << y << ". " << "Number of steps - " << steps <<". "<< endl; cout << "Количество вызовов функции - " << calls; } 2.3. БЛОК СХЕМА ПРОГРАММЫ2.4. ФОРМУЛЬНЫЕ РАСЧЁТЫ 2 ИТЕРАЦИИ2.5. РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ3. МЕТОД НЬЮТОНА3.1. КРАТКОЕ ОПИСАНИЕ АЛГОРИТМА3.2. ТЕКСТ ПРОГРАММЫ#include #include using namespace std; double func(double x) { return (x - 5) * exp(x); } double func_1(double x) { return (x - 4) * exp(x); } double func_2(double x) { return (x - 3) * exp(x); } int main() { setlocale(0, "ru"); double a = -8, b = 6, f1, f2, x0; double y = 0; double e = 0.055; double x = b; int count = 1; int steps = 0; int calls = 0; ac_1: f1 = func_1(x); calls = calls + 1; cout< if(fabs(f1) <= e) { steps = steps + 1; goto ac_2; } else { f2 = func_2(x); calls = calls + 1; x0 = x; x = x0 - f1/f2; count = count + 1; steps = steps + 1; goto ac_1; } ac_2: y = func(x); calls = calls + 1; cout << "x(наим) = " << x<< ", "<< "y(x) = " << y << ". " << "Number of steps - " << steps <<". "<< endl; cout << "Количество вызовов функции - " << calls; } 3.3. БЛОК СХЕМА ПРОГРАММЫ3.4. ФОРМУЛЬНЫЕ РАСЧЁТЫ 2 ИТЕРАЦИИ3.5. РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ4. СРАВНЕНИЕ АЛГОРИТМОВ4.1. СРАВНЕНИЕ ПО КОЛИЧЕСТВАМ ОБРАЩЕНИЙ К ФУНКЦИИ
4.2. СРАВНЕНИЕ ТОЧНОСТИ ПРИ ЗАДАННОМ КОЛИЧЕСТВЕ ИТЕРАЦИЙ
ЗАКЛЮЧЕНИЕСамый быстрый – метод Ньютона. Самый точный – метод Ньютона. Методы средней точки и Ньютона оказались наиболее эффективными, чем метод хорд. Он оказался самым медленным. |