1.2 Методы Нелдера-Мида и наискорейшего спуска.
Листинг код программы представлен в приложении С и D.
Графики для 4 функции представлены на рисунках 7-8.
Р
исунок
7 - Метод Нелдера-Мида
Р
исунок
8 — Метод наискорейшего спуска
Таблица 4 – Данные для первой функции
Формула для функции |
Полученная точка минимума |
Начальная точка (или отрезок) |
Число итераций, за которые найден минимум |
Нелдера-Мида |
x1 = 1.0, x2 = 1.0; f(x1, x2): 0.0 |
[[0, 0], [5, 5], [10, 10]] |
37 |
Наискорейший спуск |
x1 = 1.0, x2 = 1.0; f(x1, x2): 5.26 |
[3, 3] |
16 |
Последовательность точек Нелдера-Мида в приложении K.
Последовательность точек Наискорейший спуск в приложении L.
Р
исунок
9 - Метод Нелдера-Мида
Р
исунок
10 — Метод наискорейшего спускаТаблица
5 – Данные
для первой функции
Формула для функции |
Полученная точка минимума |
Начальная точка (или отрезок) |
Число итераций, за которые найден минимум |
Нелдера-Мида |
x1 = 5.0, x2 = 1.0; f(x1, x2): 9.5 |
[[0, 0], [5, 5], [10, -10]] |
51
|
Наискорейший спуск |
x1 = 5.0, x2 = 1.0; f(x1, x2): 9.5 |
[3, 3] |
3 |
Последовательность точек Нелдера-Мида в приложении M.
Последовательность точек Наискорейший спуск в приложении N.
Заключение
Было выполнено индивидуальное домашнее задание написаны коды для
заданий и построены графики. Так же заполнены таблицы согласно заданию.
Приложение а
using System;
using System.Collections.Generic;
class GoldenSectionMethod
{
public static double F1(double x) => 5 - 3 * Math.Exp(-Math.Pow((x - 5) / 3, 2));
public static double F2(double x) => 3 * (x - 4) * (x - 3) * (x - 1);
public static double F3(double x) => (x / 2) + 5 * Math.Sin(5 * Math.PI * x + 4);
public static (double minX, double minVal, int iterCount, List<double> xSequence)
FindMinimum(Func<double, double> f, double a, double b, double epsilon)
{
double phi = (1 + Math.Sqrt(5)) / 2; // Golden ratio
double resphi = 2 - phi;
double x1 = a + resphi * (b - a);
double x2 = b - resphi * (b - a);
double f1 = f(x1);
double f2 = f(x2);
int iterations = 0;
List<double> xSequence = new List<double>() { x1, x2 };
while (Math.Abs(b - a) > epsilon)
{
iterations++;
if (f1 < f2)
{
b = x2;
x2 = x1;
f2 = f1;
x1 = a + resphi * (b - a);
f1 = f(x1);
xSequence.Add(x1);
}
else
{
a = x1;
x1 = x2;
f1 = f2;
x2 = b - resphi * (b - a);
f2 = f(x2);
xSequence.Add(x2);
}
}
double minimum = (a + b) / 2;
return (minimum, f(minimum), iterations, xSequence);
}
public static void Main(string[] args)
{
Func<double, double>[] functions = { F1, F2, F3 };
string[] functionNames = { "f1", "f2", "f3" };
(double, double)[] intervals = { (0, 10), (-2, 8), (-5, 5) };
for (int i = 0; i < functions.Length; i++)
{
Console.WriteLine($"Функция {functionNames[i]}:");
(double minX, double minVal, int iterCount, List<double> xSequence) =
FindMinimum(functions[i], intervals[i].Item1, intervals[i].Item2, 1e-6);
Console.WriteLine($" Метод золотого сечения:");
Console.WriteLine($" Начальный отрезок: [{intervals[i].Item1}, {intervals[i].Item2}]");
Console.WriteLine($" Число итераций: {iterCount}");
Console.WriteLine($" Найденный минимум: x = {Math.Round(minX, 2)}, f(x) = {Math.Round(minVal, 2)}");
Console.WriteLine($" Последовательность точек: {string.Join("; ", xSequence.ConvertAll(x => Math.Round(x, 2)))}");
Console.WriteLine();
}
}
}
