Московский Технический Университет Связи и Информатики Лабораторная работа № 4 «Тема 1.6. Одномерная оптимизация» Отчет подготовил: студент группы БРТ1801 Харитонов А.Е. Вариант № 26 Москва 2020 г. 1.6.2. Задание 1. Выбрать индивидуальное задание по номеру варианта из табл. 1.6-1 для решения задачи одномерной оптимизации: функцию f(x),минимум которой необходимо найти; метод оптимизации для ручного расчета - значение параметра p; метод оптимизации для расчета на ПК - значение параметра t. 2. Провести исследование индивидуального варианта задания: построить график функции y f(x) ; выбрать начальный отрезок неопределенности (отрезок, содержащий точку минимума); проверить выполнение аналитического условия унимодальности функции на выбранном отрезке. 3. Провести «ручной расчет» трех итерацийи определить длину отрезка, содержащего точку минимума, после трех итераций. 4. Составить схему алгоритма, написать программу решения задачи оптимизации указанным в задании методом для «расчета на ПК» и провести контрольное тестирование программы, воспользовавшись исходными данными и результатами рассмотренного примера. 5. Решить задачу оптимизации с точностью E = 10-4с помощь написанной программы («расчета на ПК»). 6. Вычислить число итераций, необходимых, чтобы локализовать точку минимума с точностью E1 = 10-4, расчет сравнить с результатом, полученным на ПК. 1. Задание для решения задачи одномерной оптимизации: № вар. f(x) e–x t p 26 cos(– 2x) 1 2 В табл.1.6-1t – номер метода для вычисления минимума с точностью 10-4 (п.6 задания), p – номер метода для вычисления трех итераций (п.3 задания). Значения параметров t и p соответствуют: 1 – методу дихотомии, 2 – методу золотого сечения. 2. Исследование задания: график функции y f(x) : начальный отрезок неопределенности (отрезок, содержащий точку минимума) выберем по построенному графику - отрезок [-9;-7] - начальный отрезок неопределенности; результат проверки выполнения аналитического условия унимодальности функции на выбранном отрезке: Метод золотого сечения 3. Результаты «ручного расчета» и длина отрезка, содержащего точку минимума после трех итераций Результаты «ручного расчета» трех итераций 4. Схема алгоритма, программа и результаты контрольного тестирования Код программы using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp7 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { double res = 0; if (Class1.PointStatic(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text), 0.0001)) { richTextBox1.Text += "Условие унимодальности на отрезке выполняется\n"; Class1.Dihotomia(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text), 0.0001, richTextBox1, out res); } else { richTextBox1.Text += "Условие унимодальности на отрезке не выполняется\n"; } richTextBox1.Text += "Ответ" + Math.Round(res, 5); } } class Class1 { public static bool PointStatic(double a, double b,double eps) { double x = a; double h = 0.1; double differential, dif; double resX1 = f(x); double resX2 = f(x + h); double deltaF = resX2 - resX1; dif = deltaF / h; x += h; do { resX1 = f(x); resX2 = f(x + h); deltaF = resX2 - resX1; differential = deltaF / h; x += h; } while (x < b); if (dif*differential < 0) { return true; } else { return false; } } public static double Dihotomia(double a, double b, double eps, RichTextBox rtb, out double c) { double h = 0.1 * eps; double x1, x2; int n = 1; double delta; do { c = (a + b) / 2; x1 = c - h; x2 = c + h; delta = ((b - a) - 2 * h) / (Math.Pow(2, n)) + 2 * h; rtb.Text += n + " | " + Math.Round(a,5) + " | " + Math.Round(b, 5) + " | " + Math.Round(x1, 5) + " | " + Math.Round(x2, 5) + " | " + Math.Round(f(x1), 5) + " | " + Math.Round(f(x2), 5) + " | " + Math.Round(delta, 5) + '\n'; if (f(x1) <= f(x2)) { b = x2; } else if (f(x1) > f(x2)) { a = x1; } n++; } while (Math.Abs(b - a) >= eps); c = (a + b) / 2; return Math.Round(c, 4); } public static double f(double x) { double a = Math.Sin(x); a = Math.Pow(a, 3); double b = Math.Cos(x); b = Math.Pow(b, 3); a = a * (-5); return a - b; } } } Результаты