Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИДЗ / МО_ИДЗ.odt
Скачиваний:
8
Добавлен:
27.06.2025
Размер:
2.05 Mб
Скачать

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();

}

}

}

Соседние файлы в папке ИДЗ