Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧислМетодЛаб1.docx
Скачиваний:
18
Добавлен:
27.11.2022
Размер:
148.98 Кб
Скачать

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

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

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

Факультет безопасности (ФБ)

Кафедра безопасности информационных систем (БИС)

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

Отчёт по лабораторной работе №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);

}

}

Соседние файлы в предмете Численные методы