[go: up one dir, main page]

0% found this document useful (0 votes)
88 views14 pages

«Rezolvarea Numerică A Sistemelor De Ecuaţii » Предмет: Metode si modele de calcul

The document describes a laboratory work on numerically solving systems of linear equations. The goals are to solve a given system using the Cholesky method, Jacobi iteration with an error of 10-3, and Gauss-Seidel iteration with errors of 10-3 and 10-5. It provides the code to factorize the matrix using Cholesky decomposition and applies the Jacobi method, showing the calculations over multiple iterations.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
88 views14 pages

«Rezolvarea Numerică A Sistemelor De Ecuaţii » Предмет: Metode si modele de calcul

The document describes a laboratory work on numerically solving systems of linear equations. The goals are to solve a given system using the Cholesky method, Jacobi iteration with an error of 10-3, and Gauss-Seidel iteration with errors of 10-3 and 10-5. It provides the code to factorize the matrix using Cholesky decomposition and applies the Jacobi method, showing the calculations over multiple iterations.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 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