|
|
|
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Факультет безопасности (ФБ)
Кафедра безопасности информационных систем (БИС)
ЧИСЛЕННОЕ РЕШЕНИЕ СИСТЕМЫ ЛИНЕЙНЫХ АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ
Отчёт по лабораторной работе №1
по дисциплине «Численные методы»
|
|
Студент гр.731-2 |
|
|
__________ Батаев А.С. |
|
|
18.10.2022 |
|
|
|
|
|
Руководитель: Доцент кафедры КИБЭВС |
|
|
__________ __________ Якимук А.Ю. |
|
|
18.10.2022 |
Томск 2022
Оглавление
1 Введение 3
2 Ход работы 4
2.1 Пример системы уравнений 4
2.2 Индивидуальный вариант 6
3 Заключение 8
Приложение 9
1 Введение
Целью работы является разработка программы, реализующий метод простых итераций и метод Зейделя. Необходимо найти решение индивидуальной системы уравнений с помощью полученных программ.
Вариант:
Рисунок 1.1 – Вариант
2 Ход работы
2.1 Пример системы уравнений
Перед решением своего варианта программы нужно протестировать пример.
Для тестирования использовать систему уравнений (рис.2.1):
Рисунок 2.1 – Пример системы уравнений
Из каждого уравнения были выражены x1, x2, x3:
x1 = (-2 * x2 - 3 * x3 + 105) / 100;
x2 = (-x1 - 3 * x3 +104) / 100;
x3 = (-x1 - 2 * x2 + 103) / 100.
На рисунке 2.2 представлена работа программы примера для метода простых итераций:
Рисунок 2.2 – Работа программы, пример (метод простых итераций)
На рисунке 2.2 представлена работа программы примера для метода Зейделя:
Рисунок 2.3 – Работа программы, пример (метод Зейделя)
2.2 Индивидуальный вариант
На рисунке 2.4 представлен индивидуальный вариант.
Рисунок 2.4 – Индивидуальный вариант
Из каждого уравнения были выражены x1, x2, x3:
;
;
.
На рисунке 2.5 представлена работа программы индивидуального варианта для метода простых итераций:
Рисунок 2.5 – Работа программы, индивидуальный вариант (метод простых итераций)
На рисунке 2.6 представлена работа программы индивидуального варианта для метода Зейделя:
Рисунок 2.6 – Работа программы, индивидуальный вариант (метод Зейделя)
Таблица 1 - Данные
|
Решение |
Начальная точка |
Число итераций |
Метод простых итераций |
[0,4566 0,9175 -0,5447] |
[(-1,79 / -12,5), (-5,89 / -7,37), (-2,21 / -10.54)] |
15 |
Метод Зейделя |
[0,4563 0,9176 -0,5448] |
[0, 0, 0] |
12 |
3 Заключение
В ходе данной работы были приобретены навыки работы с методом простых итераций и методом Зейделя.
По итогу выполнения, оба метода были одинаково трудозатратными.
Приложение A
(Обязательное)
Код приложения
namespace chm1
{
class Program
{
static double x1test(double x2, double x3)
{
double x1 = (-2 * x2 - 3 * x3 + 105) / 100;
return x1;
}
static double x2test(double x1, double x3)
{
double x2 = (-x1 - 3 * x3 + 104) / 100;
return x2;
}
static double x3test(double x1, double x2)
{
double x3 = (-x1 - 2 * x2 + 103) / 100;
return x3;
}
static double x1task(double x2, double x3)
{
double x1 = (+0.18 * x2 + 7.49 * x3 - 1.79) / -12.5;
return x1;
}
static double x2task(double x1, double x3)
{
double x2 = (-2.7 * x1 - 0.66 * x3 - 5.89) / -7.37;
return x2;
}
static double x3task(double x1, double x2)
{
double x3 = (-0.41 * x1 + 8.87 * x2 - 2.21) / -10.54;
return x3;
}
static void Main(string[] args)
{
bool stop = false;
int step = 0;
double[,] system = new double[3, 4];
double[,] x1 = new double[3, 1];
double acc;
double maxd, maxdp = 0, k, sum_kv = 0;
int i, j;
double[] B, d;
double[,] A;
int n = 3;
B = new double[n];
d = new double[n];
A = new double[n, n];
Console.WriteLine("1 - Simple iteration method 2 - Seidel method");
switch (int.Parse(Console.ReadLine()))
{
case 1:
Console.WriteLine("1 - test 2 - task");
switch (int.Parse(Console.ReadLine()))
{
case 1:
acc = Math.Pow(10, -5);
Console.WriteLine("100*x1 + 2*x2 + 3*x3 = 105");
Console.WriteLine("1*x1 + 100*x2 + 3*x3 = 104");
Console.WriteLine("1*x1 + 2*x2 + 100*x3 = 103");
system = new double[3, 4] {
{ 100, 2, 3, 105 },
{ 1, 100, 3, 104 },
{ 1, 2, 100, 103 } };
x1 = new double[3, 1] { { system[0, 3] / system[0, 0] }, { system[1, 3] / system[1, 1] }, { system[2, 3] / system[2, 2] } };
do
{
step++;
double[,] x2 = new double[3, 1];
x2[0, 0] = x1test(x1[1, 0], x1[2, 0]);
x2[1, 0] = x2test(x1[0, 0], x1[2, 0]);
x2[2, 0] = x3test(x1[0, 0], x1[1, 0]);
if (Math.Abs((x2[0, 0] - x1[0, 0])) < acc || Math.Abs((x2[1, 0] - x1[1, 0])) < acc || Math.Abs((x2[2, 0] - x1[2, 0])) < acc)
stop = true;
x1[0, 0] = x2[0, 0];
x1[1, 0] = x2[1, 0];
x1[2, 0] = x2[2, 0];
} while (stop == false);
break;
case 2:
acc = Math.Pow(10, -5);
Console.WriteLine("-12,5*x1 -0,18*x2 -7,49*x3 = -1,79");
Console.WriteLine("2,7*x1 -7,37*x2 + 0,66x3 = -5,89");
Console.WriteLine("0.41*x1 -8,87*x2 -10.54 * x3 = -2,21");
system = new double[3, 4] {
{ -12.5, -0.18, -7.49, -1.79 },
{ 2.7, -7.37, 0.66, -5.89 },
{ 0.41, -8.87, -10.54, -2.21 } };
x1 = new double[3, 1] {
{ system[0, 3] / system[0, 0] },
{ system[1, 3] / system[1, 1] },
{ system[2, 3] / system[2, 2] } };
do
{
step++;
double[,] x2 = new double[3, 1];
x2[0, 0] = x1task(x1[1, 0], x1[2, 0]);
x2[1, 0] = x2task(x1[0, 0], x1[2, 0]);
x2[2, 0] = x3task(x1[0, 0], x1[1, 0]);
if (Math.Abs((x2[0, 0] - x1[0, 0])) < acc || Math.Abs((x2[1, 0] - x1[1, 0])) < acc || Math.Abs((x2[2, 0] - x1[2, 0])) < acc)
stop = true;
x1[0, 0] = x2[0, 0];
x1[1, 0] = x2[1, 0];
x1[2, 0] = x2[2, 0];
} while (stop == false);
break;
}
break;
case 2:
Console.WriteLine("1 - test 2 - task");
switch (int.Parse(Console.ReadLine()))
{
case 1:
acc = Math.Pow(10, -2);
for (i = 0; i < n; i++)
{
B[i] = 0;
d[i] = 0;
for (j = 0; j < n; j++)
{
A[i, j] = 0;
}
}
A = new double[3, 3] {
{ 100, 2, 3 },
{ 1, 100, 3 },
{ 1, 2, 100 } };
B = new double[3] {
105 ,
104,
103 };
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
Console.Write(A[i, j] + " ");
}
Console.WriteLine();
}
for (i = 0; i < n; ++i)
{
Console.WriteLine(B[i]);
}
do
{
for (i = 0; i < n; ++i)
{
step++;
d[i] = x1[i,0];
x1[i, 0] = B[i];
for (j = 0; j < n; ++j)
{
if (i != j)
{
x1[i, 0] -= A[i, j] * x1[j,0];
}
}
x1[i, 0] = x1[i, 0] / A[i, i];
d[i] = Math.Abs(d[i] - x1[i, 0]);
}
maxd = d[0];
for (i = 1; i < n; ++i)
{
if (d[i] > maxd)
{
maxd = d[i];
}
}
} while (maxd > acc);
break;
case 2:
acc = Math.Pow(10, -2);
for (i = 0; i < n; i++)
{
B[i] = 0;
d[i] = 0;
for (j = 0; j < n; j++)
{
A[i, j] = 0;
}
}
A = new double[3, 3] {
{ -12.5, -0.18, -7.49},
{ 2.7, -7.37, 0.66},
{ 0.41, -8.87, -10.54} };
B = new double[3] {
-1.79 ,
-5.89,
-2.21};
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
Console.Write(A[i, j] + " ");
}
Console.WriteLine();
}
for (i = 0; i < n; ++i)
{
Console.WriteLine(B[i]);
}
do
{
for (i = 0; i < n; ++i)
{
step++;
d[i] = x1[i, 0];
x1[i, 0] = B[i];
for (j = 0; j < n; ++j)
{
if (i != j)
{
x1[i, 0] -= A[i, j] * x1[j, 0];
}
}
x1[i, 0] = x1[i, 0] / A[i, i];
d[i] = Math.Abs(d[i] - x1[i, 0]);
}
maxd = d[0];
for (i = 1; i < n; ++i)
{
if (d[i] > maxd)
{
maxd = d[i];
}
}
} while (maxd > acc);
break;
}
break;
}
Console.WriteLine("x1,x2,x3: ");
for (int h = 0; h < x1.Length; h++)
Console.WriteLine(" " + Math.Round(x1[h, 0], 4));
Console.WriteLine("iteration: " + step);
}
}
|
|
|