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

ЛР1 / ЧМ_Л1

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

Министерство науки и высшего образования Российской Федерации

Федеральное государственное бюджетное образовательное учреждение высшего образования

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)

ЧИСЛЕННОЕ РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ. ЧИСЛЕННОЕ РЕШЕНИЕ НЕЛИНЕЙНОГО УРАВНЕНИЯ

Отчет по лабораторной работе №1

по дисциплине «Численные методы»

Студент гр. 733-1

_______Сметанников Д.Е

Принял:

ст.преп. каф. КИБЭВС

_______Катаева Е.С

Содержание

1 Введение 3

2 Ход работы 4

Заключение 6

Приложение А 7

Приложение Б 9

  1. Введение

Целью данной лабораторной работы является изучение и практическое применение численных методов для решения систем нелинейных уравнений и нелинейных уравнений одной переменной. В рамках работы требуется разработать программу, реализующую методы Ньютона и простых итераций для решения предложенных уравнений.

Варианты заданий представлены на рис. 1

Р исунок 1 — Задания

  1. Ход работы

Для решения первой задачи был использован метод Зейделя. Результат работы программы представлен на рисунке 2 и 3. Таблица с результатами программы представлена в таблице 1.

Рисунок 2 — Результат работы тестового задания

Рисунок 3 — Результат работы индивидуального задания

Таблица 1

Начальная точка

Число итераций

Решение

Проверочная система

XO=(0,0,0)T

4

X=(1, 1, 1)T

Индивидуальная система

XO=(0,0,0)T

5

X=(0.263, 1.323, -0.092)T

Для решения второй задачи были использованы 2 метода: Ньютона и простых итераций. Для поиска границ интервалов был использован метод анализа поведения производной. Результат работы представлен на рисунке 4. Таблица с результатами программы представлена в таблице 2.

Рисунок 4 — Результат работы

Таблица 2

Начальная точка

Число итераций для каждого корня

Решение

Метод Ньютона

XO=(-0,55, -0,05)T

1,1

X=(-0,552, -0,021)T

Метод простой

итерации

XO=(-0,55, -0,05)T

1,1

X=(-0,552, -0,021)T

Заключение

В ходе выполнения лабораторной работы были изучены и реализованы численные методы решения нелинейных уравнений, такие как метод Ньютона и метод простых итераций. На основе разработанной программы были успешно решены система нелинейных уравнений и предложенное уравнение одной переменной. Полученные результаты округлены до двух знаков после запятой, как требовалось в условиях задания.

Приложение А

(обязательное)

Код для задания 1

double[,] k =

{

{ -10.28, 4.83, -5.27},

{2.7, -4.33, 0.02},

{8.53, 1.76, -12.94 }

};

double[] b = { 4.17, -5.02, 5.76 };

double[] x0 = { 0, 0, 0 };

double[] prevX = new double[3];

double accuracy = 0.001;

int iterations = 0;

bool running = true;

while (running)

{

prevX[0] = x0[0];

prevX[1] = x0[1];

prevX[2] = x0[2];

x0[0] = (b[0] - k[0, 1] * prevX[1] - k[0, 2] * prevX[2]) / k[0, 0];

x0[1] = (b[1] - k[1, 0] * x0[0] - k[1, 2] * prevX[2]) / k[1, 1];

x0[2] = (b[2] - k[2, 0] * x0[0] - k[2, 1] * x0[1]) / k[2, 2];

if (Math.Abs(x0[0] - prevX[0]) < accuracy &&

Math.Abs(x0[1] - prevX[1]) < accuracy &&

Math.Abs(x0[2] - prevX[2]) < accuracy)

{

Console.WriteLine($"Система решена за {iterations + 1} итераций.");

running = false;

}

else

{

iterations++;

}

}

Console.WriteLine("Решение:");

for (int i = 0; i < 3; i++)

{

Console.WriteLine($"x{i + 1} = {Math.Round(x0[i], 3)} ");

}

Приложение Б

Код для задания 2

class Program

{

static double k1 = 0.8;

static double k2 = 0.46;

static double k3 = 0.01;

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 List<(double, double)> FindIntervals(double start, double stop, double step)

{

var intervals = new List<(double, double)>();

double a = start;

double b = a + step;

while (b <= stop)

{

if (Function(a) * Function(b) <= 0)

{

intervals.Add((a, b));

}

a = b;

b = a + step;

}

return intervals;

}

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 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)}");

}

}

}

Томск 2024

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