
ЛР1 / ЧМ_Л1
.pdfdouble 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 Main()
{
double intervalStart = -10; double intervalEnd = 10; double step = 0.1;
List<double> foundRoots = new List<double>();
List<(double, double)> intervals = FindIntervals(intervalStart, intervalEnd, step);
if (intervals.Count > 0)
{
foreach (var interval in intervals)
{
double a = Math.Round(interval.Item1, 3); double b = Math.Round(interval.Item2, 3);
Console.WriteLine($"Корень найден в интервале: [{a:F3}, {b:F3}]");
double x0 = Math.Round((a + b) / 2, 3); 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);
}
}
}
else
{
Console.WriteLine($"Корни не найдены на интервале [{intervalStart}, {intervalEnd}]");
}
Console.WriteLine("\nВсе уникальные найденные корни:"); foreach (double root in foundRoots)
{
Console.WriteLine($"Корень: {Math.Round(root, 3)}");
}
}
}