Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР1 / ЧМ_Л1 финал

.pdf
Скачиваний:
0
Добавлен:
27.06.2025
Размер:
285.15 Кб
Скачать

Приложение Б Код для задания 2

using System;

using System.Collections.Generic;

class Program

{

static double k1 = 0.8; static double k2 = 0.46;

static double k3 = 0.01; //static double k1 = 1; //static double k2 = 4;

//static double k3 = -5;

static double Epsilon = 0.001; static int MaxIterations = 100; static double L;

static double Function(double x)

{

return k1 * x * x + k2 * x + k3;

}

static double Derivative(double x)

{

return 2 * k1 * x + k2;

}

static double G(double x)

{

return L * Function(x) + x;

}

static bool StopByFunction(double x, double epsilon)

{

return Math.Abs(Function(x)) < epsilon;

}

static bool StopByDifference(double xNew, double xOld, double epsilon)

{

return Math.Abs(xNew - xOld) < epsilon;

}

static (double, int) NewtonMethod(double x0, double epsilon, int maxIter)

{

double xOld = x0;

for (int i = 1; i <= maxIter; i++)

{

double xNew = xOld - Function(xOld) / Derivative(xOld);

if (StopByFunction(xNew, epsilon) || StopByDifference(xNew, xOld, epsilon))

{

return (xNew, i);

}

xOld = xNew;

}

return (xOld, maxIter);

}

static (double, int) SimpleIteration(double x0, double epsilon, int maxIter)

{

double xOld = x0;

for (int i = 1; i <= maxIter; i++)

{

double xNew = G(xOld);

if (StopByFunction(xNew, epsilon) || StopByDifference(xNew, xOld, epsilon))

{

return (xNew, i);

}

xOld = xNew;

}

return (xOld, maxIter);

}

static bool IsRootFound(List<double> roots, double x, double epsilon)

{

foreach (double root in roots)

{

if (Math.Abs(root - x) < epsilon * 10)

{

return true;

}

}

return false;

}

static void FindRootInInterval(double a, double b, List<double> foundRoots)

{

double x0 = (a + b) / 2;

Console.WriteLine($"\nИщем корень в интервале: [{a}, {b}]");

if (Function(a) * Function(b) > 0)

{

Console.WriteLine($"На интервале [{a}, {b}] нет корня, так как знаки функции в концах совпадают.");

return;

}

L = -1 / Derivative(x0);

Console.WriteLine($"Начальная точка для метода Ньютона: {x0:F3}"); var (rootNewton, iterNewton) = NewtonMethod(x0, Epsilon, MaxIterations); double roundedRootNewton = Math.Round(rootNewton, 3);

Console.WriteLine($"Корень методом Ньютона: {roundedRootNewton}, количество итераций: {iterNewton}");

Console.WriteLine($"Начальная точка для метода простых итераций: {x0:F3}");

var (rootIter, iterIter) = SimpleIteration(x0, Epsilon, MaxIterations); double roundedRootIter = Math.Round(rootIter, 3);

Console.WriteLine($"Корень методом простых итераций: {roundedRootIter}, количество итераций: {iterIter}");

if (!IsRootFound(foundRoots, rootNewton, Epsilon))

{

foundRoots.Add(rootNewton);

}

if (!IsRootFound(foundRoots, rootIter, Epsilon))

{

foundRoots.Add(rootIter);

}

}

static void Main()

{

double a1 = -0.6; double b1 = -0.5; double a2 = -0.1; double b2 = 0;

List<double> foundRoots = new List<double>();

FindRootInInterval(a1, b1, foundRoots);

FindRootInInterval(a2, b2, foundRoots);

Console.WriteLine("\nВсе уникальные найденные корни:"); foreach (double root in foundRoots)

{

Console.WriteLine($"Корень: {Math.Round(root, 3)}");

}

}

}

Соседние файлы в папке ЛР1