
Заключение
Было выполнено индивидуальное домашнее задание написаны коды для заданий и построены графики. Так же заполнены таблицы согласно
заданию.
15
Приложение А
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)
{
16
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) };
17
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();
}
}
}
18