Файл: Отчет по лабораторной работе 1 по дисциплине Вычислительная математика.docx

ВУЗ: Не указан

Категория: Отчет по практике

Дисциплина: Не указана

Добавлен: 11.01.2024

Просмотров: 25

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

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

высшего образования

«Сибирский государственный университет науки и технологий

имени академика М.Ф. Решетнева»

Институт информатики и телекоммуникаций
Кафедра информационно-управляющих систем


Отчет по лабораторной работе №1
по дисциплине: «Вычислительная математика»
Тема: Численное решение систем линейных алгебраических уравнений

Вариант 10

Преподаватель Кириллов К. А.
Обучающийся БИЭ21-01, Пульмановский В. И.

Красноярск 2023 г.


a
Общее задание

Дана система линейных алгебраических уравнений (СЛАУ)

Au f , (1)


11

где A 21 31

a41


a

a
12 13 a22 a23 a32 a33

a42 a43

14 u1  f1




a

a
a24 , u u2 , f f2 . 34  3  3 44 4 4

1. Решить СЛАУ (1) методом Гаусса с выбором главного элемента по

столбцам.

2. Привести СЛАУ (1) к виду

uBuF,

приемлемому для применения метода простой итерации, и проверить выполнение достаточного условия сходимости этого метода, т. е.

B q1, (2)


1



где BEA, F f , E 0



0

0 0 1 0 0 1

0 0

0



0, значение выбрать таким, чтобы

1

выполнялось неравенство (2).

Решить эту СЛАУ методом простой итерации

uk1 BukF
с точностью 0,01, предварительно преобразовав ее к виду, приемлемому

для применения этого метода. В качестве начального приближения выбрать

u0 0, где 0 0,0,0,0T .
В качестве условия остановки итерационного процесса (для

достижения заданной точности ) использовать неравенство



uk1 uk1q, (3)
где qконстанта из неравенства (2). Имеет место неравенство

εk1quk1 uk,
где εkukU, U вектор точного решения СЛАУ, uk1 и uk векторы приближенного решения СЛАУ, полученные на k1 и k-й итерациях соответственно. Следовательно, если выполняется неравенство

1quk1 uk,
равносильное неравенству (3), то справедливо и неравенство

εk,
обеспечивающее нахождение вектора uk приближенного решения СЛАУ с

заданной точностью .

В качестве нормы uk1 uk вектора uk1 uk взять октаэдрическую

норму, определяемую равенством


4
u ui, где u u1,u2,u3,u4 T , i1
а в качестве нормы B матрицы B норму, согласованную с октаэдрической

нормой вектора, определяемую следующим образом:
B max 4 b, где B b4 .

1j4 i1

Вариант22:

5,401 u1 0,519u2 0,364u3 0,283u4 0,243, 0,295u1 4,830u2 0,421u3 0,278u4 0,231,

0,524u1 0,397u2 4,723u3 0,389u4 0,721, 0,503u1 0,264u2 0,248u3 4,286u4 0,220.

Выполнение работы
1. СЛАУ методом Гаусса с выбором главного элемента по столбцам.
Алгоритм метода Гаусса. Пусть дана система уравнений:



При решении методом Гаусса система приводится к ступенчатому виду:



Для решения уравнения методом Гаусса необходимо знать, как выполняются элементарные преобразования систем линейных уравнений. Таких преобразований имеется четыре типа:

1. Умножение обеих частей уравнения на любое ненулевое число.

2. Перестановка уравнений системы местами.

3. Добавление (или вычитание) к обеим частям одного уравнения соответствующих частей другого уравнения, умноженного на любое ненулевое число.

4. Удаление нулевых строк.

Общие зависимости прямого хода для расширенной матрицы:

Ведущее уравнение не изменяется.

Для последующих уравнений , i = k + 1,…, n; j = k + 1,..., n.

Обратный ход начинается с вычисления последнего неизвестного системы линейных уравнений и заканчивается вычислением первого неизвестного. При обратном ходе используются только строки прямого хода.

Формулы обратного хода для полученной матрицы

i = n – 1,…,1

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

Текст программы Visual studio на С++:

#include

#include

using namespace std;
int main()

{

setlocale(LC_ALL, "Russian");

int n, i;

double a[10][10];

double b[10][10];

double x[10];

double aa, bb;

n = 4; //Задание матрицы А и вектора b (вектор b нах-ся в элементах А[1,5..4,5])

a[0][0] = 5.401; a[0][1] = 0.519; a[0][2] = 0.364; a[0][3] = 0.283; a[0][4] = 0.243;

a[1][0] = 0.295; a[1][1] = 4.830; a[1][2] = 0.421; a[1][3] = 0.278; a[1][4] = 0.231;

a[2][0] = 0.524; a[2][1] = 0.397; a[2][2] = 4.723; a[2][3] = 0.389; a[2][4] = 0.721;

a[3][0] = 0.503; a[3][1] = 0.264; a[3][2] = 0.248; a[3][3] = 4.286; a[3][4] = 0.220;

for (int j = 0; j < 4; j++)

for (int k = 0; k < 5; k++)

b[j][k] = a[j][k];

for (int k = 0; k < n; k++) //Поиск максимального элемента в первом столбце

{

aa = abs(a[k][k]);

i = k;

for (int m = k + 1; m < n; m++)

if (abs(a[m][k]) > aa)

{

i = m;

aa = abs(a[m][k]);

}

if (aa < 0.000001) //проверка на нулевой(близкий к нулевому) элемент

{

cout << endl;

cout << "Система не имеет решения" << endl;

}

if (i != k) //перестановка строк

for (int j = k; j < n + 1; j++)

{

bb = a[k][j];

a[k][j] = a[i][j];

a[i][j] = bb;

}

aa = a[k][k]; //преобразование k'й строки

a[k][k] = i;

for (int j = k + 1; j < n + 1; j++)

a[k][j] = a[k][j] / aa;

for (int il = k + 1; il < n; il++) //преобразование строк

{

bb = a[il][k];

a[il][k] = 0;

if (bb != 0)

for (int j = k + 1; j < n + 1; j++)

a[il][j] = a[il][j] - bb * a[k][j];

}

}

for (int il = n - 1; il >= 0; il--) //Нахождение решений СЛАУ

{

x[il] = 0;

aa = a[il][n];

for (int j = n - 1; j >= il + 1; j--)

aa = aa - a[il][j] * x[j];

x[il] = aa;

}

cout << "Исходная система:" << endl; //вывод матрицы b(исходной матрицы а)

for (int il = 0; il < n; il++)

{

for (int jl = 0; jl < n; jl++)

cout << b[il][jl] << " ";

cout << " | " << b[il][n] << endl;

}

cout << "Решение системы:" << endl; //вывод решений

for (int il = 0; il < n; il++)

cout << "x[" << il << "]=" << x[il] << endl;

}


Результат выполнения:



Получено решение методом Гаусса:

u=
2. Находим решение СЛАУ методом итераций.

Алгоритм:

Пусть дана система линейных уравнений:



Приведем исходную систему к виду:



Сама итерационная формула имеет вид:



Решение методом итераций будет сходиться, если любая из норм матрицы будет меньше 1:

||||1= < 1

||||2= < 1

||||3= < 1.

Формула метода итераций:

Вычисления завершаются в случае

Где С – норма, которая использована для проверки сходимости.
Проверим выполнимость условия сходимости процесса итерации (преобладание диагональных элементов):

5,401 > 1,166=0,519+0,364+0,283;

4,830 > 0,994=0,295+0,421+0,278;

4,723 > 1,31=0,524+0,397+0,389;

4,286 > 1,015=0,503+0,264+0,248;
Условие сходимости процесса итерации выполняется.

Напишем интерполяционную формулу:


Вычислим норму матрицы (число ):





В качестве начального приближения положим .

Итерации продолжим до выполнения условия:



#include

#include

using namespace std;
int main()

{

setlocale(LC_ALL, "Russian");

double eps, q, x1, x2, x3, x4, y1, y2, y3, y4, s;

int i;

eps = 0.000001;

q = 3109.0 / 4317;

x1 = 0; x2 = 0; x3 = 0; x4 = 0;

s = 0.5; i = 0;

while (s > eps * q)

{

y1 = 7.0 / 57 - 73.0 * x2 / 1501 - 527.0 * x3 / 4503 - 132.0 * x4 / 1501;

y2 = 358.0 / 5121 - 259.0 * x1 / 5121 - 47.0 * x3 / 569 - 206.0 * x4 / 5121;

y3 = 565.0 / 4317 - 413.0 * x1 / 4317 - 177.0 * x2 / 1439 - 88.0 * x4 / 1439;

y4 = 436.0 / 4851 - 109.0 * x1 / 1617 - 412.0 * x2 / 4851 - 29.0 * x3 / 693;

i = i + 1;

s = abs(x1 - y1);

if (s < abs(x2 - y2))

s = abs(x2 - y2);

else if (s < abs(x3 - y3))

s = abs(x3 - y3);

else if (s < abs(x4 - y4))

s = abs(x4 - y4);

x1 = y1; x2 = y2; x3 = y3; x4 = y4;

}

cout << " x1=" << x1 << endl;

cout << " x2=" << x2 << endl;

cout << " x3=" << x3 << endl;

cout << " x4=" << x4 << endl;

cout << "Число итераций=" << i << endl;

}

Результат выполнения:




Таким образом, потребовалось 10 итераций.

Решение
u=