Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 14

Министерство Образования, Культуры и Исследований

Технический Университет Молдовы


Факультет Вычислительной техники, Информатики и Микроэлектроники
Департамент Информатики и Системной Инженерии

Лабораторная работа №2
Тема: «REZOLVAREA NUMERICĂ A SISTEMELOR DE ECUAŢII
LINIARE.»
Предмет: Metode si modele de calcul

Выполнил: Гончарова Ольга


Группа: IA-192

КИШИНЕВ 2020
Цель работы:

1) Să se rezolve sistemul de ecuaţii lineare Ax=b, utilizând

- Metoda lui Cholesky (metoda rădăcinii pătrate);

- Metoda iterativă a lui Jacobi cu o eroare ε=10-3;

- Metoda iterativă a lui Gauss-Seidel cu o eroare ε=10-3 şi ε=10-5.

2) Să se determine numărul de iteraţii necesare pentru aproximarea soluţiei sistemului cu eroarea dată ε. Să
se compare rezultatele.

Вариант №8:

Решение: 1Метод. Метод Холецкого(метод квадратного корня) .


Разложим матрицу A на две L и LT по методу Холецкого:
A=AT - Матрица симметричная
A=L⋅LT
A= ¿ = ¿ = ¿ *
*¿= ¿ ¿

Тогда:
17 17 17 17 √ 85
l1,12= ⇒l1,1=√ =√ =√ =
5 5 5 5 5
7
7
7 −1 10 7 √ 85
l1.1 l2.1= ⇒=>l2.1= =>l4.1= 10 = =
10 5 √ 85 170
l1.1
5
1
1
1 5 √ 85
l1.1 l3.1= =>l3.1= 5 = =
5 √ 85 5
l1.1
5
−1
−1
−1 5 −√ 85
l1.1 l3.1= =>l4.1= 5 = =
5 √ 85 5
l1.1
5
51 51 51 7 √ 85 2 337 5729
l2.12+l2.22=
10
=>l2.2=
√10
−l 2. 12=

10
−(
170
)=
68
=
√ √
34
3 3 √ 85 7 √ 85
−l 3.1l 2.1 − ∗( )
3 10 10 85 170 44 √ 5729
l2.1 l3.1+l2.2 l3.2= =>l3.2= = =
10 l 2.2 √ 5729 28645
34
1 1 −√ 85 7 √ 85
−l 4.1 l2.1 − ∗( )
1 2 2 85 170 92 √ 5729
l2.1 l4.1+l2.2 l4.2= =>l4.2= = =
2 l 2.2 √ 5729 28645
34
19
l3.12+l3.22+l3.32= =>
5
2 2
19 19 √ 85 + 44 √5729 ) ¿= 31802 = √ 10717274
l3.3=
5 √
−( l3. 12+l 3. 22 )=
5 √ ( )
−(
5 28645 √ 8425 1685

−2
l3.1 l4.1+l3.2 l4.2+l3.3 l4.3= =>
5

−2 −√ 85 √ 85 92 √5729
−2
l4.3= 5
−( l 4.1 l3.1+l 4.2 l3.2 )
=
5

85
∗ (
85
+ ( )(
28645
=
))
−3509 √ 10717274
l 3.3 √ 10717274 53586370
1685
47
l4.12+l4.22+l4.32 +l4.42= =¿
10

47 47 −√ 85 2 −3509 √ 10717274 2
l4.4=
√ 10 √
−( l 4.12 +l 4.22 +l 4.32 )=
10
−¿((
85
¿ ¿ +¿ +(
53586370
¿ ¿ )=

364386 28970508930
=
√ 79505
=
√79505

Тогда:
L=¿

Исходный код:
#include <conio.h>
#include <math.h>
#include <iostream>

#include <locale>
using namespace std;
int main()
{
int n=4;
setlocale(LC_ALL, "RUS");
cout.setf(ios::fixed);
cout.precision(3);
float A[n][n]={
{9.2, 1.1, 0.6, -0.6},
{1.1, 15.3, -1.2, 0.3},
{0.6, -1.2, 9.6, 0.7},
{-0.6, 0.3, 0.7, 12.6}
};

cout << "Èñõîäíàÿ ìàòðèöà\n";


for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
cout <<A[i][j] << "\t";
}
cout << "\n";
}
for(int i=0; i<n; i++)
{
A[i][i]=sqrt(A[i][i]);\
for(int j=i+1; j<n; j++)
{
A[j][i]=A[j][i]/A[i][i];

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


{
A[j][k]=A[j][k]-A[j][i]*A[k][i];
}
}
}
cout << "\n\nÐàçëîæåíèå Õîëåöêîãî\n";

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


{
for(int j=0; j<n; j++)
{
cout <<A[i][j] << "\t";
}
cout << "\n";
}
}
Результат программы:

2Метод. Итерационный метод Якоби с погрешностью ꜫ=10-3.


Запишем матрицу А в виде системы линейных уравнений:
¿
Выразим x1, x2, x3, x4:
1) 9.2x1=10.1-1,1 x2-0,6 x 3+0,6 x 4  x1=
10.1−1,1x 2−0,6 x 3 +0,6 x 4 −1.1x 2 0,6 x 3 0,6 x 4 10,1
= − + + =−0,119 +0,065+0,065+1,097
9.2 9.2 9.2 9.2 9.2
2) 15,3 x2= -18.3-1,1 x1+1,2 x3-0,3 x 4  x2=
−18.3−1,1 x1 +1.2 x3 −0,3x 4 −1.1 x1 1.2 x3 0.3 x 4 18.3
= + − − =−0,071+0.078+0,019+1,196
15.3 15.3 15.3 15.3 15.3
3) 9,2 x3 = 10.7-0.6 x 1+1,2 x2-0,6 x 4  x3=
10.7−0.6 x 1 +1.2x 3−0,6 x 4 −0.6 x 1 1.2x 3 0.6 x 4 10.7
= + − − =−0,065+ 0.130+0,065+1,163
9.2 9.2 9.2 9.2 9.2
4) 12,6 x 4= 10.1+0.6 x 1−1,2x 2-0,6 x 3  x3=
10.1+ 0.6 x1−1,2 x 2−0,6 x3 0.6 x 1 1.2x 2 0.6 x3 10.1
= − − − =0.047+0.095+ 0.047+0.801
12.6 12.6 12.6 12.6 12.6
Пусть- начальное приближенное: x1(0)= 0. x2(0)= 0. x3(0)= 0. x4(0)=0
Найдем приближение в 1-й итерации:

x 1(1)=−0,119 x 2 +0,065 x 2+ 0,065 x 2 +1,097=-0+0+0+1.097=1.097

x 2(1)=−0,071 x 1+ 0.078 x 3 +0,019 x 4 +1,196=−0+0+ 0+1.196=1.196

x 3(1)=−0,065 x 1 +0.130 x 2+ 0,065 x 4 +1,163=−0+ 0+0+1.163=1.163

x 4(1)=0.047 x 1 +0.095 x2 +0.047 x 3 +0.801=0+0+0+ 0.801=0.801

Получим: x1(1)=1.097, x2(1)= 1.196, x3(1)= 1.163, x4(1)= 0.801

Критерий окончания в методе Якоби:


Матрицу B записываем из системы уравнений для матрицы A: B=¿
n
Находим норму матрицы B:‖B‖=max ∑ |bi , j| =max(0+
t=1.4 j=i

|−0,119|+0.065+ 0,065;|−0,071|+0+0.078+ 0,019;|−0,065|+0.130+ 0+0,065 ; 0.047+0.095+ 0.047+0)=


1
max(0.249; 0.168; 0.26; 0.189)=0.26<
2
Можем вычислить критерий окончания итерации:

‖x (n +1)−x (n )‖<ε
Покажем вычисления на примере нескольких итераций.
N=1
x1=1.098 - 0*0.12 - 0*0.0652 - 0*(-0.0652)=1.098
x2=-1.196 - 0*0.0719 - 0*(-0.0784) - 0*0.0196=-1.196
x3=1.115 - 0*0.0625 - 0*(-0.125) - 0*0.0729=1.115
x4=0.802 - 0*(-0.0476) - 0*0.0238 - 0*0.0556=0.802
N=2
x1=1.098 - (-1.196)*0.12 - 1.115*0.0652 - 0.802*(-0.0652)=1.22
x2=-1.196 - 1.098*0.0719 - 1.115*(-0.0784) - 0.802*0.0196=-1.203
x3=1.115 - 1.098*0.0625 - (-1.196)*(-0.125) - 0.802*0.0729=0.838
x4=0.802 - 1.098*(-0.0476) - (-1.196)*0.0238 - 1.115*0.0556=0.82
N=3
x1=1.098 - (-1.203)*0.12 - 0.838*0.0652 - 0.82*(-0.0652)=1.241
x2=-1.196 - 1.22*0.0719 - 0.838*(-0.0784) - 0.82*0.0196=-1.234
x3=1.115 - 1.22*0.0625 - (-1.203)*(-0.125) - 0.82*0.0729=0.828
x4=0.802 - 1.22*(-0.0476) - (-1.203)*0.0238 - 0.838*0.0556=0.842

Остальные расчеты сведем в таблицу.


N x1 x2 x3 x4
0 0 0 0 0
1 1.098 -1.196 1.115 0.802
2 1.22 -1.203 0.838 0.82
3 1.241 -1.234 0.828 0.842
4 1.246 -1.237 0.821 0.844
5 1.247 -1.238 0.821 0.845

Исходный код:
#include <iostream>
#include <cmath>
#include <locale>

using namespace std;

int main()
{
setlocale(LC_ALL, "RUS");

cout.setf(ios::fixed);
cout.precision(3);

double a[4][4] = {
{9.2, 1.1, 0.6, -0.6},
{1.1, 15.3, -1.2, 0.3},
{0.6, -1.2, 9.6, 0.7},
{-0.6, 0.3, 0.7, 12.6}
};

double b[] = {10.1, -18.3, 10.7, 10.1};

//x1, x2, x3, x4 íà÷àëüíûå çíà÷åíèÿ(ïðèáëèæåíèÿ)


double x[4] = {0, 0, 0, 0};

double eps = 0.001;

double xc[4], c[4];


int n = 0, i = 1;

do{
xc[0] = x[0];
xc[1] = x[1];
xc[2] = x[2];
xc[3] = x[3];

//x1= 5.1 - 0.7 x2 - 0.2 x3 + 0.2 x4 / 3.4


x[0] = (b[0] - a[0][1] * xc[1] - a[0][2] * xc[2] + a[0][3] * xc[3]) / a[0][0];

//x2= 4.2 - 0.7 x1 - 0.3 x3 - 0.5 x4 / 5.1


x[1] = (b[1] - a[1][0] * xc[0] - a[1][2] * xc[2] - a[1][3] * xc[3]) / a[1][1];
//x3= 5.3 - 0.2 x1 - 0.3 x2 + 0.4 x4 / 3.8
x[2] = (b[2] - a[2][0] * xc[0] - a[2][1] * xc[1] + a[2][3] * xc[3]) / a[2][2];

//x4= 5.4 + 0.2 x1 - 0.5 x2 + 0.4 x3 / 4.7


x[3] = (b[3] - a[2][0] * xc[0] - a[3][1] * xc[1] + a[3][2] * xc[2]) / a[3][3];

cout << i - 1 << " èòåð) x1 = " << x[0] << ", x2 = " << x[1] << ", x3 = " << x[2] << ", x4 = " << x[3]
<< endl;

c[0] = fabs(x[0] - xc[0]);


c[1] = fabs(x[1] - xc[1]);
c[2] = fabs(x[2] - xc[2]);
c[3] = fabs(x[3] - xc[3]);

i++;
++n;
}
while (c[0] > eps && c[1] > eps && c[2] > eps && c[3] > eps);

cout << "\n\nÐåçóëüòàò:\nx1 = " << x[0] << endl;


cout << "x2 = " << x[1] << endl;
cout << "x3 = " << x[2] << endl;
cout << "x4 = " << x[3] << endl;
cout << "\nÊîëè÷åñòâî èòåðàöèè: " << n - 1 << endl;
}

Результат программы:
3Метод. Итерационный метод Гаусса-Зейделя с погрешностью ꜫ=10-3 и
ꜫ=10-5.

Метод Гаусса — Зейделя (метод Зейделя, процесс Либмана, метод последовательных замещений) —
является классическим итерационным методом решения системы линейных уравнений.
Метод Гаусса – Зейделя - это итерационный метод решения квадратной системы из n линейных
уравнений с неизвестным x . Он определяется итерацией где это к е приближение или итерация
является следующим или K +-итерация , а матрица разлагаются в нижнюю треугольную
компоненту , а в строго верхнем треугольный компоненте.
Исходный код программы: #include <iostream>

#include <cmath>

using namespace std;

// Условие окончания

bool converge(double xk[10], double xkp[10], int n, double eps)

double norm = 0;

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

norm += (xk[i] - xkp[i]) * (xk[i] - xkp[i]);

return (sqrt(norm) < eps);

double okr(double x, double eps)

int i = 0;

while (eps != 1)

i++;

eps *= 10;

int okr = pow(double(10), i);

x = int(x * okr + 0.5) / double(okr);

return x;

}
bool diagonal(double a[10][10], int n)

int i, j, k = 1;

double sum;

for (i = 0; i < n; i++) {

sum = 0;

for (j = 0; j < n; j++) sum += a[i][j];

sum -= a[i][i];

if (sum > a[i][i])

k = 0;

cout << a[i][i] << " < " << sum << endl;

else

cout << a[i][i] << " > " << sum << endl;

return (k == 1);

int main()

setlocale(LC_ALL, "RUS");

double eps, a[10][10], b[10], x[10], p[10];

int n, i, j, m = 0;

int method;

cout << "Введите размер матрицы: ";

cin >> n;

cout << "Введите погрешность: ";

cin >> eps;


cout << "Введите элементы матрицы А: " << endl << endl;

for (i = 0; i < n; i++)

for (j = 0; j < n; j++)

cout << "A[" << i << "][" << j << "] = ";

cin >> a[i][j];

cout << "Введите вектор свободных членов: " << endl << endl;

for (i = 0; i < n; i++)

cout << "В[" << i + 1 << "] = ";

cin >> b[i];

cout << endl << endl;

cout << "Исходная матрица А: " << endl << endl;

cout << "x1\tx2\tx3\tx4\t b" << "\n--------------------------------------------" << endl;

for (i = 0; i < n; i++)

for (j = 0; j < n; j++)

cout << a[i][j] << "\t";

cout << " = " << b[i] << endl;

cout << endl;

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

x[i] = 1;

cout << "Диагональное преобладание: " << endl;

if (diagonal(a, n)) {

do

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


p[i] = x[i];

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

double var = 0;

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

var += (a[i][j] * x[j]);

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

var += (a[i][j] * p[j]);

x[i] = (b[i] - var) / a[i][i];

m++;

} while (!converge(x, p, n, eps));

cout << "\n\nРешение системы:" << endl;

for (i = 0; i < n; i++) cout << "x" << i + 1 << " = " << okr(x[i], eps) << "" << endl;

cout << "Итераций: " << m << endl;

else {

cout << "Не выполняется преобладание диагоналей" << endl;

return 0;
}

Результат программы при: ꜫ=10-3


Результат программы при: ꜫ=10-5
Вывод:
В ходе лабораторной работы №2, были использованы 3 метода решения
систем линейных уравнений:
1. Метод Холецкого- Разложение Холецкого — представление симметричной положительно
определённой матрицы A=AT>0 в виде произведения A=LLT, где L — нижняя (Lower) треугольная
матрица со строго положительными элементами на диагонали. Иногда разложение удобно записать
в эквивалентной форме A=UTU, где U=LT — верхняя (Upper) треугольная матрица. Для любой
симметричной положительно определённой матрицы разложение Холецкого существует и
единственно.
Элементы матрицы L можно вычислить, начиная с верхнего левого угла матрицы A

2. Итерационный метод Якоби- Суть вычислений итерационными методами состоит в следующем:


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

3. Итерационный метод Гаусса-Зейделя- Суть: нахождение по приближённому значению величины


следующего приближения, которое является более точным. Метод позволяет получить значения
корней системы с заданной точностью в виде предела последовательности некоторых векторов
(итерационный процесс). Характер сходимости и сам факт сходимости метода зависит от выбора
начального приближения корня x0.

You might also like