
ЛР1 / ЧМ_Л1
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронновычислительных систем (КИБЭВС)
ЧИСЛЕННОЕ РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ. ЧИСЛЕННОЕ РЕШЕНИЕ НЕЛИНЕЙНОГО УРАВНЕНИЯ Отчет по лабораторной работе №1
по дисциплине «Численные методы»
Студент гр. 733-1
_______Сметанников Д.Е
Принял:
ст.преп. каф. КИБЭВС
_______Катаева Е.С
Томск 2024
|
|
Содержание |
1 |
Введение................................................................................................................ |
.3 |
2 |
Ход работы............................................................................................................. |
4 |
|
Заключение............................................................................................................. |
6 |
|
Приложение А........................................................................................................ |
7 |
|
Приложение Б....................................................................................................... |
.9 |

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

2Ход работы
Для решения первой задачи был использован метод Зейделя. Результат работы программы представлен на рисунке 2. Таблица с результатами программы представлена в таблице 1.
Рисунок 2 — Результат работы
|
|
|
Таблица 1 |
|
|
|
|
|
Начальная точка |
Число итераций |
Решение |
|
|
|
|
Проверочная |
XO=(0,0,0)T |
4 |
X=(1, 1, 1)T |
система |
|
|
|
|
|
|
|
Индивидуальн |
XO=(0,0,0)T |
9 |
X=(0.263, 1.323, -0.092)T |
ая система |
|
|
|
|
|
|
|
Для решения второй задачи были использованы 2 метода: Ньютона и простых итераций. Для поиска границ интервалов был использован метод анализа поведения производной. Результат работы представлен на рисунке 3. Таблица с результатами программы представлена в таблице 2.

Рисунок 2 — Результат работы
|
|
|
|
Таблица 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)
{