StudyDocs.ru Logo

Пояснит.docx


Федеральное государственное бюджетное образовательное учреждениевысшего профессионального образования«Омский государственный технический университет» Кафедра «Автоматизированные системы обработки информации и управления»










РАСЧЕТНО-ГРАФИЧЕCКАЯ РАБОТА
по дисциплине «Системный анализ, оптимизация и принятие решений»студента Потороча Романа Сергеевича группы АС-312
Пояснительная запискаНаправление 230100.62







Преподаватель Е.С. Ершов
Студент Р.С. Потороча







Омск 2015

Реферат
Пояснительная записка 20 с., 15 рис., 1 источников, 1 приложение.МЕТОДЫ СЛУЧАЙНОГО ПОИСКА, СИСТЕМНЫЙ АНАЛИЗ, АДАПАТИВНЫЙ МЕТОД, МЕТОД С ВОЗВРАТОМ ПРИ НЕУДАЧНОМ ШАГЕ, МЕТОД НАИЛУЧШЕЙ ПРОБЫ Предметом исследования данной расчетно-графической работы является ряд заданий, направленных на изучение предмета «Системный анализ, оптимизация и принятие решений». Цель работы – изучение методов случайного поиска, а так же, разработка программы для нахождения безусловного минимума .Результатом работы является анализ методов для нахождения безусловного минимума функции многих переменных, а также разработанный алгоритм программы.


Содержание1 Метод адаптивного поиска 51.1 Постановка задачи 51.2 Алгоритм 52 Метод с возвратом при неудачном шаге 62.1 Постановка задачи 62.2 Алгоритм 63 Метод наилучшей пробы 73.1 Постановка задачи 73.2 Алгоритм 74 Решение задач 84.1 Метод адаптивного поиска 84.2 Метод с возвратом при неудачном шаге 84.3 Метод наилучшей пробы 9Заключение 10Список используемых источников 11Приложение А 12Листинг на языке C# 12


Введение
В ходе выполнения расчётно-графической работы необходимо изучить методы случайного поиска. А так же, разработать программу, которая реализует нахождения безусловного минимума функции по выше упомянутым методам.



1 Метод адаптивного поиска
1.1 Постановка задачиЗадается начальная точка x0. Каждая последующая точка находится по формуле: , (1)где > 0 – величина шага; – случайный вектор единичной длины, определяющий направление поиска;kномер итерации.На текущей итерации при помощи генерирования случайных векторов получаются точки, лежащие на гиперсфере радиуса с центром в точке . Если значение функции в полученной точке, не меньше, чем в центре, шаг считается неудачным. Если число неудачных шагов из текущей точки достигает некоторого числа M, дальнейший поиск продолжается из той же точки, но с меньшим шагом до тех пор, пока он не станет меньше заранее заданной величины R. Если же значение функции снова меньше, чем в центре, шаг считается удачным и в найденном направлении делается увеличенный шаг, играющий роль ускоряющего шага. Если при этом значение функции снова меньше, чем в центре, направление считается удачным и дальнейший поиск продолжается из этой точки. Если же значение функции стало не меньше, чем в центре, направление считается неудачным и поиск продолжается из старого центра.
1.2 АлгоритмАлгоритм метода адаптивного поиска изображен на рисунке 1.
Рисунок 1 – Алгоритм метода адаптивного поиска


2 Метод с возвратом при неудачном шаге
2.1 Постановка задачиЗадается начальная точка x0. Каждая последующая точка находится по формуле: , (2)где > 0 – величина шага; – случайный вектор единичной длины, определяющий направление поиска;kномер итерации.На текущей итерации при помощи генерирования случайных векторов получаются точки, лежащие на гиперсфере радиуса с центром в точке . Если значение функции в полученной точке не меньше, чем в центре, шаг считается неудачным, происходит возврат в текущий центр и поиск продолжается. Если число неудачных шагов из текущей точки достигает некоторого числа M, дальнейший поиск продолжается из той же точки, но с меньшим шагом до тех пор, пока он не станет меньше заранее заданной величины R. Если же значение функции в полученной точке меньше, чем в центре, шаг считается удачным и дальнейший поиск продолжается из этой точки.
2.2 АлгоритмАлгоритм метода с возвратом при неудачном шаге изображен на рисунке 2.
Рисунок 2 – Алгоритм метода с возвратом при неудачном шаге







3 Метод наилучшей пробы
3.1 Постановка задачиЗадается начальная точка x0. Каждая последующая точка находится по формуле: , (3)где > 0 – величина шага; – случайный вектор единичной длины, определяющий направление поиска;kномер итерации.На текущей итерации при помощи генерирования случайных векторов получается M точек, лежащих на гиперсфере радиуса с центром в точке . Среди полученных точек выбирается точка, в которой значение функции наименьшее. Если в выбранной точке значение функции меньше, чем в центре, то дальнейший поиск продолжается из этой точки. Иначе поиск продолжается из старого центра, но с меньшим шагом до тех пор, пока он не станет меньше заранее заданной величины R.
3.2 АлгоритмАлгоритм метода наилучшей пробы изображен на рисунке 3.

Рисунок 3 – Алгоритм метода наилучшей пробы







4 Решение задачДля решений задач данными методами, была спроектирована программа на языке C#.
4.1 Метод адаптивного поиска; N = 4; R = 0,1; t0 = 1; M = 5. (4-8)Найти: Найти безусловный минимум функции .Вводим полученные данные в программу, после нажимаем кнопку [Найти минимум]. Ниже, будет представлено решение, рисунок 4.
Рисунок 4 – Адаптивный методРешением для данной задачи является точка (-4,774;0,327).
4.2 Метод с возвратом при неудачном шаге; N = 4; R = 0,1; t0 = 1; M = 5. (9-13)Найти: Найти безусловный минимум функции .Вводим полученные данные в программу, после нажимаем кнопку [Найти минимум]. Ниже, будет представлено решение, рисунок 5.
Рисунок 5 – Метод с возвратом при неудачном шагеРешением для данной задачи является точка (1,484;1,665).
4.3 Метод наилучшей пробы; N = 4; R = 0,1; t0 = 1; M = 5. (14-18)Найти: Найти безусловный минимум функции .Вводим полученные данные в программу, после нажимаем кнопку [Найти минимум]. Ниже, будет представлено решение, рисунок 4.
Рисунок 6 – Метод наилучшей пробыРешением для данной задачи является точка (5,569;4,404).



Заключение
В ходе выполнения работы были изучены метода случайного поиска. А так же, разработана программа для нахождения безусловного минимума функции по выше упомянутым методам.



Список используемых источников
1 Метода оптимизации в примерах и задачах: Учеб. пособие / А.В. Пантелеев, Т.А. Летова. – 2-е изд., исправл. – М.: Высш. шк., 2005. – 544 с.: ил.


Приложение А(обязательное)
Листинг на языке C#
Double x0r, x1r, e0r, e1r, ar, br, N = 10, R = 0.6, t0 = 1, M = 3, E, Y0, Y1; int k = 0, j = 1; // k номер итерации, j число неудач Random r = new Random(); // завели -->"r"<--- рандомка x0r = r.NextDouble() * 10; x1r = r.NextDouble() * 10; x0r = Math.Round(x0r, 3); //Генерируем координаты Х0 x1r = Math.Round(x1r, 3); e0r = r.NextDouble() * ((-1) * r.Next(1, 3)); e1r = r.NextDouble() * ((-1) * r.Next(1, 3)); e0r = Math.Round(e0r, 3); //Генерируем координаты Вектора Е e1r = Math.Round(e1r, 3); ar = 1 + r.NextDouble(); //Генерируем АЛЬФА ar = Math.Round(ar, 3); br = r.NextDouble(); //Генерируем БЕТТА br = Math.Round(br, 3); textBox2.ScrollBars = ScrollBars.Vertical; textBox2.Text = "X0= (" + x0r + ";" + x1r + ")\r\n"; textBox2.Text += "Альфа = " + ar + "\r\n"; textBox2.Text += "Бетта = " + br + "\r\n"; textBox2.Text += "Макс. число итераций N=" + N + "\r\n"; textBox2.Text += "Мин.велечина шага R=" + R + "\r\n"; textBox2.Text += "Начальная велечина шага t0=" + t0 + "\r\n"; textBox2.Text += "Максимально число неудач на текущей итерации M=" + M + "\r\n"; textBox2.Text += "Номер итерации k=" + k + "\r\n"; textBox2.Text += "Число неудач, задаем j=" + j + "\r\n __________________________________________\r\n"; textBox2.Text += "\r\nПолучаем:\r\nE (кси) = (" + e0r + ";" + e1r + ")\r\n"; E = Math.Sqrt((e0r * e0r) + (e1r * e1r)); //Длина отрезка e0r = (t0 * e0r) / E; e1r = (t0 * e1r) / E; Y0 = x0r + e0r; //координаты Y Y1 = x1r + e1r; Y0 = Math.Round(Y0, 3); Y1 = Math.Round(Y1, 3); textBox2.Text += "Вычисляем Y=(" + Y0 + ";" + Y1 + ")\r\n"; textBox2.Text += "__________________________________________\r\n"; Double ForSrX; // Переменная для сравнения Dictionary<string, double> vars = new Dictionary<string, double>(); vars.Add("x1", x0r); vars.Add("x2", x1r); string input = tb1; Function f = new Function(input, vars); ForSrX = f.Value; // Записываем сюда значение ф-ции в точке Х0, чтоб сравнивать с Y textBox2.Text += "F(X0) =" + f.Value + "\r\n"; // вычисляем значение в ф-ции в точке Х0 vars.Clear();vars.Add("x1", Y0); vars.Add("x2", Y1); f = new Function(input, vars); textBox2.Text += "F(Y) =" + f.Value + "\r\n"; //вычисялем значение ф-ции в точке Y textBox2.Text += "__________________________________________\r\n";Рисунок А.1 Адаптивный методfor (; ;) {if (ForSrX < f.Value | ForSrX == f.Value) // если значение ф-ции в точке У больше чем Х0 - ШАГ НЕУДАЧНЫЙ {textBox2.Text += "Шаг неудачный (или новая точка отсчета - пришли генириовать вектор)\r\n\r\n"; if (j < M) // проверка на макс число неудач в текущей итерации (M) { j++; textBox2.Text += "j=" + j + "\r\n"; } else { if (t0 > R) //проверка на то, что шаг не стал слишком маленьким, сравнение с R { t0 = t0 * br; // уменьшаем шаг, умножая на коэф.сжатия j = 1; textBox2.Text += "Умньшаем шаг, теперь t=" + t0 + "\r\n"; textBox2.Text += "j=" + j + "\r\n"; }else { // сюда попали, если шаг стал меньше чем допустимая МИНИМАЛЬНАЯ ВЕЛЕЧИНА ШАГА textBox2.Text += "Шаг t стал меньше чем Минимальная величина шага R\r\n"; textBox2.Text += " Точка Х =(" + x0r + ";" + x1r + ") - является искомой точкой.\r\n Значение функции в ней =" + ForSrX; break; } }e0r = r.NextDouble() * ((-1) * r.Next(1, 3));e1r = r.NextDouble() * ((-1) * r.Next(1, 3));e0r = Math.Round(e0r, 3); //Генерируем координаты Вектора Еe1r = Math.Round(e1r, 3); E = Math.Sqrt((e0r * e0r) + (e1r * e1r)); //Длина отрезка e0r = (t0 * e0r) / E; e1r = (t0 * e1r) / E; Y0 = x0r + e0r; //координаты Y Y1 = x1r + e1r; Y0 = Math.Round(Y0, 3); Y1 = Math.Round(Y1, 3); textBox2.Text += "Вычисляем Y=(" + Y0 + ";" + Y1 + ")\r\n"; vars.Clear(); vars.Add("x1", Y0); vars.Add("x2", Y1); f = new Function(input, vars); textBox2.Text += "F(X) =" + ForSrX + "\r\n"; textBox2.Text += "F(Y) =" + f.Value + "\r\n"; //вычисялем значение ф-ции в точке Y textBox2.Text += "__________________________________________\r\n"; }Рисунок А.2 Адаптивный методelse { textBox2.Text += "Шаг удачный\r\n"; double z0, z1; z0 = ar * (Y0 - x0r) + x0r; // находим координаты точки Z z1 = ar * (Y1 - x1r) + x1r; z0 = Math.Round(z0, 3);textBox2.Text += "Координаты точки Z=(" + z0 + ";" + z1 + ")\r\n"; vars.Clear(); vars.Add("x1", z0); vars.Add("x2", z1); f = new Function(input, vars); // находим значение ф-ции в точке Z textBox2.Text += "F(X) =" + ForSrX + "\r\n"; textBox2.Text += "F(Z)=" + f.Value + "\r\n"; // значение ф-ции в точке Z textBox2.Text += "__________________________________________\r\n"; if (ForSrX > f.Value) //Если значение в Z < чем в X - УДАЧНОЕ НАПРАВЛЕНИЕ { textBox2.Text += "Направление удачное\r\n"; x0r = z0; // делаем Z - точкой отсчета x1r = z1; ForSrX = f.Value; t0 = t0 * ar; //увеличиваем шаг, умножая на коэф.расширения t0 = Math.Round(t0, 3); k++; //Увеличеваем номер итерации textBox2.Text += "Новая точка отсчета X=(" + z0 + ";" + z1 + ")\r\n"; textBox2.Text += "Новое минимальное значение функции =" + ForSrX + "\r\n"; textBox2.Text += "Новый шаг t=" + t0 + "\r\n"; textBox2.Text += "k=" + k + "\r\n"; if (k == N) { textBox2.Text += "Достигнуто максимальное число итераций k=N\r\n"; textBox2.Text += " Точка Х =(" + x0r + ";" + x1r + ") - является искомой точкой.\r\n Значение функции в ней =" + ForSrX; break; } else { j = 1; textBox2.Text += "j=" + j + "\r\n"; textBox2.Text += "__________________________________________\r\n"; } } } } Рисунок А.3 Адаптивный метод









Double x0r, x1r, e0r, e1r, br, N = 10, R = 0.6, t0 = 1, M = 3, E, Y0, Y1; int k = 0, j = 1; // k номер итерации, j число неудач Random r = new Random(); // завели -->"r"<--- рандомка x0r = r.NextDouble() * 10; x1r = r.NextDouble() * 10; x0r = Math.Round(x0r, 3); //Генерируем координаты Х0 x1r = Math.Round(x1r, 3); e0r = r.NextDouble() * ((-1) * r.Next(1, 3)); e1r = r.NextDouble() * ((-1) * r.Next(1, 3)); e0r = Math.Round(e0r, 3); //Генерируем координаты Вектора Е e1r = Math.Round(e1r, 3); br = r.NextDouble(); //Генерируем БЕТТА br = Math.Round(br, 3); textBox2.ScrollBars = ScrollBars.Vertical; textBox2.Text = "X0= (" + x0r + ";" + x1r + ")\r\n"; textBox2.Text += "Бетта = " + br + "\r\n"; textBox2.Text += "Макс. число итераций N=" + N + "\r\n"; textBox2.Text += "Мин.велечина шага R=" + R + "\r\n"; textBox2.Text += "Начальная велечина шага t0=" + t0 + "\r\n"; textBox2.Text += "Максимально число неудач на текущей итерации M=" + M + "\r\n"; textBox2.Text += "Номер итерации k=" + k + "\r\n"; textBox2.Text += "Число неудач, задаем j=" + j + "\r\n __________________________________________\r\n"; textBox2.Text += "\r\nПолучаем:\r\nE (кси) = (" + e0r + ";" + e1r + ")\r\n"; E = Math.Sqrt((e0r * e0r) + (e1r * e1r)); //Длина отрезка e0r = (t0 * e0r) / E; e1r = (t0 * e1r) / E; Y0 = x0r + e0r; //координаты Y Y1 = x1r + e1r; Y0 = Math.Round(Y0, 3); Y1 = Math.Round(Y1, 3); textBox2.Text += "Вычисляем Y=(" + Y0 + ";" + Y1 + ")\r\n"; textBox2.Text += "__________________________________________\r\n"; Double ForSrX; // Переменная для сравнения Dictionary<string, double> vars = new Dictionary<string, double>(); vars.Add("x1", x0r); vars.Add("x2", x1r); string input = tb1; Function f = new Function(input, vars); ForSrX = f.Value; // Записываем сюда значение ф-ции в точке Х0, чтоб сравнивать с Y textBox2.Text += "F(X0) =" + f.Value + "\r\n"; // вычисляем значение в ф-ции в точке Х0 vars.Clear(); vars.Add("x1", Y0); vars.Add("x2", Y1); f = new Function(input, vars);textBox2.Text += "F(Y) =" + f.Value + "\r\n"; //вычисялем значение ф-ции в точке Y textBox2.Text += "__________________________________________\r\n";for (; ; ) { if (ForSrX < f.Value | ForSrX == f.Value) // если значение ф-ции в точке У больше чем Х0 - ШАГ НЕУДАЧНЫЙ { textBox2.Text += "Шаг неудачный (или новая точка отсчета - пришли генириовать вектор)\r\n\r\n"; if (j < M) // проверка на макс число неудач в текущей итерации (M) { j++; textBox2.Text += "j=" + j + "\r\n"; }Рисунок А.4 Метод с возвратом при неудачном шагеelse { if (t0 > R) //проверка на то, что шаг не стал слишком маленьким, сравнение с R { t0 = t0 * br; // уменьшаем шаг, умножая на коэф.сжатия j = 1; textBox2.Text += "Умньшаем шаг, теперь t=" + t0 + "\r\n"; textBox2.Text += "j=" + j + "\r\n"; } else { // сюда попали, если шаг стал меньше чем допустимая МИНИМАЛЬНАЯ ВЕЛЕЧИНА ШАГА textBox2.Text += "Шаг t стал меньше чем Минимальная величина шага R\r\n"; textBox2.Text += " Точка Х =(" + x0r + ";" + x1r + ") - является искомой точкой.\r\n Значение функции в ней =" + ForSrX; break; } } e0r = r.NextDouble() * ((-1) * r.Next(1, 3)); e1r = r.NextDouble() * ((-1) * r.Next(1, 3)); e0r = Math.Round(e0r, 3); //Генерируем координаты Вектора Е e1r = Math.Round(e1r, 3); E = Math.Sqrt((e0r * e0r) + (e1r * e1r)); //Длина отрезка e0r = (t0 * e0r) / E; e1r = (t0 * e1r) / E; Y0 = x0r + e0r; //координаты Y Y1 = x1r + e1r; Y0 = Math.Round(Y0, 3); Y1 = Math.Round(Y1, 3); textBox2.Text += "Вычисляем Y=(" + Y0 + ";" + Y1 + ")\r\n"; vars.Clear(); vars.Add("x1", Y0); vars.Add("x2", Y1); f = new Function(input, vars); textBox2.Text += "F(X) =" + ForSrX + "\r\n";textBox2.Text += "F(Y) =" + f.Value + "\r\n"; //вычисялем значение ф-ции в точке Y textBox2.Text += "__________________________________________\r\n"; } else { if (ForSrX > f.Value) //Если значение в Z < чем в X - УДАЧНОЕ НАПРАВЛЕНИЕ { textBox2.Text += "Шаг удачный\r\n"; x0r = Y0; // делаем Z - точкой отсчета x1r = Y1; ForSrX = f.Value; k++; //Увеличеваем номер итерацииText += "Новая точка отсчета X=(" + Y0 + ";" + Y1 + ")\r\n"; textBox2.Text += "Новое минимальное значение функции =" + ForSrX + "\r\n"; textBox2.Text += "Новый шаг t=" + t0 + "\r\n"; textBox2.Text += "k=" + k + "\r\n"; if (k == N) { textBox2.Text += "Достигнуто максимальное число итераций k=N\r\n"; textBox2.Text += " Точка Х =(" + x0r + ";" + x1r + ") - является искомой точкой.\r\n Значение функции в ней =" + ForSrX; break;Рисунок А.5 Метод с возвратом при неудачном шаге} else { j = 1; textBox2.Text += "j=" + j + "\r\n"; textBox2.Text += "__________________________________________\r\n"; } } } } } }Рисунок А.6 Метод с возвратом при неудачном шаге




















Double x0r, x1r, e0r, e1r, br, N = 10, R = 0.6, t0 = 1, M = 3, E, Y0, Y1, min, ForSrX = 0, cmt0, cmt1; //cmt(0-1) - точки где хранятся координаты минимальной точки на данный момент double[] mass = new double[3]; double[] Ymass = new double[6]; int k = 0, j = 1; // k номер итерации, j число неудач Random r = new Random(); // завели -->"r"<--- рандомка x0r = r.NextDouble() * 10; x1r = r.NextDouble() * 10; x0r = Math.Round(x0r, 3); //Генерируем координаты Х0 x1r = Math.Round(x1r, 3); br = r.NextDouble(); //Генерируем БЕТТА br = Math.Round(br, 3); textBox2.ScrollBars = ScrollBars.Vertical; textBox2.Text = "X0= (" + x0r + ";" + x1r + ")\r\n"; textBox2.Text += "Бетта = " + br + "\r\n"; textBox2.Text += "Макс. число итераций N=" + N + "\r\n"; textBox2.Text += "Мин.велечина шага R=" + R + "\r\n"; textBox2.Text += "Начальная велечина шага t0=" + t0 + "\r\n"; textBox2.Text += "Максимально число неудач на текущей итерации M=" + M + "\r\n"; textBox2.Text += "Номер итерации k=" + k + "\r\n"; textBox2.Text += "Число неудач, задаем j=" + j + "\r\n __________________________________________\r\n"; textBox2.Text += "Смотрим точки Y и их значение в функции:\r\n";for (int u = 0; u < 3; u++) { textBox2.Text += "@@@@@\r\n"; e0r = r.NextDouble() * ((-1) * r.Next(1, 3)); e1r = r.NextDouble() * ((-1) * r.Next(1, 3)); e0r = Math.Round(e0r, 3); //Генерируем координаты Вектора Е e1r = Math.Round(e1r, 3); textBox2.Text += "\r\nПолучаем:\r\nE (кси) = (" + e0r + ";" + e1r + ")\r\n"; E = Math.Sqrt((e0r * e0r) + (e1r * e1r)); //Длина отрезка e0r = (t0 * e0r) / E; e1r = (t0 * e1r) / E; Y0 = x0r + e0r; //координаты Y Y1 = x1r + e1r; Ymass[u + u] = Y0 = Math.Round(Y0, 3); Ymass[u + u + 1] = Y1 = Math.Round(Y1, 3); textBox2.Text += "Вычисляем Y=(" + Y0 + ";" + Y1 + ")\r\n"; Dictionary<string, double> vars = new Dictionary<string, double>(); vars.Add("x1", x0r); vars.Add("x2", x1r); string input = tb1; Function f = new Function(input, vars); ForSrX = f.Value; // Записываем сюда значение ф-ции в точке Х0, чтоб сравнивать с Y textBox2.Text += "F(X0) =" + f.Value + "\r\n"; // вычисляем значение в ф-ции в точке Х0 vars.Clear();vars.Add("x1", Y0); vars.Add("x2", Y1); f = new Function(input, vars); textBox2.Text += "F(Y) =" + f.Value + "\r\n"; //вычисялем значение ф-ции в точке Y mass[u] = f.Value; } // минимальное значение функции в одной из 3ех точек Y min = mass[0]; cmt0 = Ymass[0]; // записываем минимальное значение У и координаты этой точки cmt1 = Ymass[1];Рисунок А.7Метод наилучшей пробыfor (int u = 0; u < 2; u++) { if (min > mass[u + 1]) { min = mass[u + 1]; // ИТОГОВАЯ НАИМ ТОЧКА ПО РЕЗУЛЬТАТАМ СРАВНЕНИЯ cmt0 = Ymass[u + u + 2]; cmt1 = Ymass[u + u + 3]; } } min = Math.Round(min, 3); textBox2.Text += "\r\n---------\r\nF(Y)-минимальное из 3ех точек =" + min + "\r\nc координатами Y=(" + cmt0 + ";" + cmt1 + ")\r\n---------\r\n"; for (; ; ) {if (ForSrX < min | ForSrX == min) // если значение ф-ции в точке У больше чем Х0 - ШАГ НЕУДАЧНЫЙ { textBox2.Text += "Шаг неудачный (или новая точка отсчета - пришли генириовать вектор)\r\n\r\n"; if (t0 > R) //проверка на то, что шаг не стал слишком маленьким, сравнение с R { t0 = t0 * br; // уменьшаем шаг, умножая на коэф.сжатия j = 1; textBox2.Text += "Умньшаем шаг, теперь t=" + t0 + "\r\n"; textBox2.Text += "j=" + j + "\r\n"; } else { // сюда попали, если шаг стал меньше чем допустимая МИНИМАЛЬНАЯ ВЕЛЕЧИНА ШАГА textBox2.Text += "Шаг t стал меньше чем Минимальная величина шага R\r\n"; textBox2.Text += " Найденное минималньое значение функции F(X) =" + ForSrX + " В точке Х=(" + cmt0 + ";" + cmt1 + ")"; break; } for (int u = 0; u < 3; u++) { textBox2.Text += "@@@@@\r\n"; e0r = r.NextDouble() * ((-1) * r.Next(1, 3)); e1r = r.NextDouble() * ((-1) * r.Next(1, 3)); e0r = Math.Round(e0r, 3); //Генерируем координаты Вектора Е e1r = Math.Round(e1r, 3); textBox2.Text += "\r\nПолучаем:\r\nE (кси) = (" + e0r + ";" + e1r + ")\r\n"; E = Math.Sqrt((e0r * e0r) + (e1r * e1r)); //Длина отрезка e0r = (t0 * e0r) / E; e1r = (t0 * e1r) / E; Y0 = x0r + e0r; //координаты Y Y1 = x1r + e1r; Ymass[u + u] = Y0 = Math.Round(Y0, 3); Ymass[u + u + 1] = Y1 = Math.Round(Y1, 3); textBox2.Text += "Вычисляем Y=(" + Y0 + ";" + Y1 + ")\r\n";Dictionary<string, double> vars = new Dictionary<string, double>(); vars.Add("x1", x0r); vars.Add("x2", x1r); string input = tb1; Function f = new Function(input, vars); ForSrX = f.Value; // Записываем сюда значение ф-ции в точке Х0, чтоб сравнивать с Y textBox2.Text += "F(X0) =" + f.Value + "\r\n"; // вычисляем значение в ф-ции в точке Х0 vars.Clear();vars.Add("x1", Y0); vars.Add("x2", Y1); f = new Function(input, vars);Рисунок А.8 – Метод наилучшей пробыtextBox2.Text += "F(Y) =" + f.Value + "\r\n"; //вычисялем значение ф-ции в точке Y mass[u] = f.Value; } // минимальное значение функции в одной из 3ех точек Y min = mass[0]; cmt0 = Ymass[0]; // записываем миниамальное значение У и координаты этой точки cmt1 = Ymass[1]; for (int u = 0; u < 2; u++) { if (min > mass[u + 1]) { min = mass[u + 1]; cmt0 = Ymass[u + u + 2]; cmt1 = Ymass[u + u + 3]; } } min = Math.Round(min, 3); textBox2.Text += "\r\n---------\r\nF(Y)-минимальное из 3ех точек =" + min + "\r\n c координатами Y=(" + cmt0 + ";" + cmt1 + ")\r\n---------\r\n"; } else { if (ForSrX > min) //Если значение в Z < чем в X - УДАЧНОЕ НАПРАВЛЕНИЕ { textBox2.Text += "Шаг удачный\r\n"; x0r = cmt0; // делаем Y - точкой отсчета x1r = cmt1; ForSrX = min; // присваиваем новый минимум функции k++; //Увеличеваем номер итерации textBox2.Text += "Новое минимальное значение функции F(X) =" + ForSrX + "c координатами X= (" + cmt0 + ";" + cmt1 + ")\r\n"; textBox2.Text += "Новый шаг t=" + t0 + "\r\n"; textBox2.Text += "k=" + k + "\r\n"; if (k == N) { textBox2.Text += "Достигнуто максимальное число итераций k=N\r\n"; textBox2.Text += "Найденное минималньое значение функции F(X) =" + ForSrX + "В точке Х=(" + cmt0 + ";" + cmt1 + ")"; break; } else { j = 1; textBox2.Text += "j=" + j + "\r\n"; textBox2.Text += "__________________________________________\r\n"; } } } } }Рисунок А.9 – Метод наилучшей пробы