Вы находитесь на странице: 1из 11

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

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


высшего образования
«Алтайский государственный технический университет им. И. И. Ползунова»

Факультет информационных технологий


Кафедра прикладной математики

Отчет защищен с оценкой _____

Преподаватель _____________
(подпись)
«___» ____________ 2022 г.

Отчет по лабораторной работе 1

по дисциплине «LU-факторизация»

Студент группы 8ПИ-21 Смирнов Р.В.

Преподаватель доцент, к.ф.-м.н. Проскурин А. В.

Барнаул 2022
Ход работы:
В первую очередь необходимо получить матрицы L и U, элементы которых
спокойно высчитываются по следующим формулам:

Далее перед нами стоит задача решения систем линейных уравнений:

и
Сначала находятся все y, а потом все x, по формулам:

и
И собственно решение уравнений найдено.
2
Теперь осталось получить обратную матрицу и число обусловленности.
Для обратной матрицы воспользуемся матрицами L и U, т.к. они уже у нас есть и
грех этим не воспользоваться. Хотя при других обстоятельствах (т.е. без
необходимости в решении СЛАУ), нахождение обратной матрицы через LU-
разложение не считается оптимальным.
В расчете обратной матрицы используются только матрицы L и U, что говорит о
возможности параллельных вычислений вместе с векторами Y и X. Вычисление
производится по следующим формулам:

Число обусловленности представляет собой произведение норм самой матрицы


и обратной к ней. Само число зависит от выбора нормы, и из интереса я выбрах из три:
1. m–норма - суммируются, по модулю, все строки матрицы и максимальная из
полученных сумм объявляется нормой.
2. l–норма - суммируются, по модулю, все столбцы матрицы и максимальная из
полученных сумм объявляется нормой.
3. k–норма - суммируются квадраты всех элементов матрицы и корень из этой
суммы объявляется нормой.
Собственно все нормы вычисляются параллельно.
Исследуемая матрица:
Здесь представленны вычисления для матрицы описанной в пункте 2 задания:
Первый вариант:
A = [4,4]((5,7,6,5),(7,10,8,7),(6,8,10,9),(5,7,9,10))
B = [4,1]((23),(32),(33),(31))
--------------------
det A = 1
--------------------
L = [4,4]((1,0,0,0),(1.4,1,0,0),(1.2,-2,1,0),(1,0,1.5,1))
U = [4,4]((5,7,6,5),(0,0.2,-0.4,0),(0,0,2,3),(0,0,0,0.5))
--------------------
Y = [4,1]((23),(-0.2),(5),(0.5))
X = [4,1]((1),(1),(1),(1))
--------------------
Err = [4,1]((0),(0),(0),(0))
--------------------
rev A = [4,4]((76.4,-41,-17,10),(-41,25,10,-6),(-17,10,5,-3),(1.6,-6,-3,2))
E = [4,4]((1,0,-6.07153e-18,-1.73472e-18),(6.93889e-18,1,0,-3.46945e-
18),(-25.2,1.04083e-17,1,-1.21431e-17),(-42,0,-5.20417e-18,1))

Conditioning numbers:
| ||A|| | ||A^-1|| | ||A||*||A^-1||
3
----------------|----------------|----------------|----------------
m | 33| 144.4| 4765.2
l | 33| 136| 4488
k | 30.545| 104.036| 3177.79
Интерпретация: Решение прекрасное. Вектор невязок принял самые идеальные
из всех возможных значений - нули. При этом числа обусловленности показывают
плохую обусловленность матрицы А.
Второй вариант:
A = [4,4]((5,7,6,5),(7,10,8,7),(6,8,10,9),(5,7,9,10))
B = [4,1]((23.01),(31.99),(32.99),(31.01))
--------------------
det A = 1
--------------------
L = [4,4]((1,0,0,0),(1.4,1,0,0),(1.2,-2,1,0),(1,0,1.5,1))
U = [4,4]((5,7,6,5),(0,0.2,-0.4,0),(0,0,2,3),(0,0,0,0.5))
--------------------
Y = [4,1]((23.01),(-0.224),(4.93),(0.605))
X = [4,1]((2.36),(0.18),(0.65),(1.21))
--------------------
Err = [4,1]((0),(1.73472e-18),(0),(-1.73472e-18))
--------------------
rev A = [4,4]((76.4,-41,-17,10),(-41,25,10,-6),(-17,10,5,-3),(1.6,-6,-3,2))
E = [4,4]((1,0,-6.07153e-18,-1.73472e-18),(6.93889e-18,1,0,-3.46945e-
18),(-25.2,1.04083e-17,1,-1.21431e-17),(-42,0,-5.20417e-18,1))

Conditioning numbers:
| ||A|| | ||A^-1|| | ||A||*||A^-1||
----------------|----------------|----------------|----------------
m | 33| 144.4| 4765.2
l | 33| 136| 4488
k | 30.545| 104.036| 3177.79
Интерпретация: Решение хорошее. Вектор невязок не сильно отличается от
нулевых значений.
Третий вариант:
A = [4,4]((5,7,6,5),(7,10,8,7),(6,8,10,9),(5,7,9,10))
B = [4,1]((23.1),(31.9),(32.9),(31.1))
--------------------
det A = 1
--------------------
L = [4,4]((1,0,0,0),(1.4,1,0,0),(1.2,-2,1,0),(1,0,1.5,1))
U = [4,4]((5,7,6,5),(0,0.2,-0.4,0),(0,0,2,3),(0,0,0,0.5))
--------------------
Y = [4,1]((23.1),(-0.44),(4.3),(1.55))
X = [4,1]((14.6),(-7.2),(-2.5),(3.1))
--------------------
Err = [4,1]((1.73472e-18),(6.93889e-18),(0),(1.73472e-18))
--------------------
rev A = [4,4]((76.4,-41,-17,10),(-41,25,10,-6),(-17,10,5,-3),(1.6,-6,-3,2))
E = [4,4]((1,0,-6.07153e-18,-1.73472e-18),(6.93889e-18,1,0,-3.46945e-
18),(-25.2,1.04083e-17,1,-1.21431e-17),(-42,0,-5.20417e-18,1))

Conditioning numbers:
| ||A|| | ||A^-1|| | ||A||*||A^-1||
----------------|----------------|----------------|----------------
m | 33| 144.4| 4765.2
l | 33| 136| 4488
k | 30.545| 104.036| 3177.79
4
Интерпретация: Решение хорошее. Вектор невязок не сильно отличается от
нулевых значений.
Другие примеры работы программы:
Неподходящая матрица 3х3:
A = [3,3]((1,3,4),(10,6,12),(1,2,14))
B = [3,1]((2),(5),(1))
The matrix does not meet the requirements!
Подходящая матрица 3х3:
A = [3,3]((7,6,2),(9,9,7),(8,1,8))
B = [3,1]((2),(5),(1))
--------------------
det A = 233
--------------------
L = [3,3]((1,0,0),(1.28571,1,0),(1.14286,-4.55556,1))
U = [3,3]((7,6,2),(0,1.28571,4.42857),(0,0,25.8889))
--------------------
Y = [3,1]((2),(2.42857),(9.77778))
X = [3,1]((-0.32618),(0.587983),(0.377682))
--------------------
Err = [3,1]((-3.88578e-16),(-6.66134e-16),(9.99201e-16))
--------------------
rev A =
[3,3]((0.27897,-0.197425,0.103004),(-0.0686695,0.171674,-0.133047),(-0.270386,0
.175966,0.0386266))
E = [3,3]((1,2.77556e-17,-4.16334e-17),(1.11022e-16,1,-6.93889e-17),(5.55112e-
17,-1.11022e-16,1))

Conditioning numbers:
| ||A|| | ||A^-1|| | ||A||*||A^-1||
----------------|----------------|----------------|----------------
m | 25| 0.579399| 14.485
l | 24| 0.618026| 14.8326
k | 20.7123| 0.533727| 11.0547
Подходящая матрица 4х4:
A = [4,4]((10,8,8,8),(12,14,12,5),(1,7,8,7),(5,8,1,9))
B = [4,1]((2),(5),(1),(3))
--------------------
det A = 4434
--------------------
L = [4,4]((1,0,0,0),(1.2,1,0,0),(0.1,1.40909,1,0),(0.5,0.909091,-1.35714,1))
U = [4,4]((10,8,8,8),(0,4.4,2.4,-4.6),(0,0,3.81818,12.6818),(0,0,0,26.3929))
--------------------
Y = [4,1]((2),(2.6),(-2.86364),(-4.25))
X = [4,1]((0.0690122),(0.539919),(-0.215156),(-0.161028))
--------------------
Err = [4,1]((-1.0842e-19),(0),(0),(-6.50521e-19))
--------------------
rev A =
[4,4]((0.224637,-0.00180424,-0.117276,-0.0162382),(-0.2023,0.123139,0.00405954,
0.108254),(0.0705909,-0.0139829,0.0911141,-0.125846),(-0.0240866,-0.106901,0.05
14208,0.037889))
E = [4,4]((1,0,0,2.71051e-20),(0.590095,1,-1.0842e-19,9.48677e-
20),(-0.795345,-5.42101e-20,1,0),(-0.641407,1.0842e-19,-5.42101e-20,1))

Conditioning numbers:
| ||A|| | ||A^-1|| | ||A||*||A^-1||
----------------|----------------|----------------|----------------

5
m | 43| 0.437754| 18.8234
l | 37| 0.521615| 19.2997
k | 33.6898| 0.421559| 14.2022
Подходящая матрица 5х5:
A = [5,5]((11,0,9,1,4),(1,11,15,3,6),(1,6,11,8,14),(4,4,6,8,0),(11,7,10,9,15))
B = [5,1]((2),(5),(1),(3),(4))
--------------------
det A = 104478
--------------------
L =
[5,5]((1,0,0,0,0),(0.0909091,1,0,0,0),(0.0909091,0.545455,1,0,0),(0.363636,0.36
3636,-0.993243,1,0),(1,0.636364,-3.28041,2.09117,1))
U =
[5,5]((11,0,9,1,4),(0,11,14.1818,2.90909,5.63636),(0,0,2.44628,6.32231,10.562),
(0,0,0,12.8581,6.98649),(0,0,0,0,27.4509))
--------------------
Y = [5,1]((2),(4.81818),(-1.80992),(-1.27703),(-4.3329))
X = [5,1]((0.259547),(0.552576),(-0.0233446),(-0.0135531),(-0.157842))
--------------------
Err = [5,1]((6.41848e-17),(-1.5439e-16),(-2.32453e-16),(-6.245e-17),(5.20417e-
18))
--------------------
rev A =
[5,5]((0.0232707,-0.00888637,-0.0874251,-0.000258428,0.0753843),(-0.11112,0.084
4383,-0.14158,-0.0194682,0.123394),(0.0897031,0.0155057,0.0814334,0.0209326,-0.
106128),(-0.0283957,-0.0598786,0.0534275,0.119164,-0.0197936),(-0.00872737,0.00
451944,0.043837,-0.0761787,0.0364287))
E = [5,5]((1,1.73472e-17,2.77556e-17,1.37152e-17,-3.46945e-
18),(0.008942,1,5.55112e-17,-6.46727e-17,-1.76942e-16),(-0.00606621,0.252548,1,
-5.63785e-18,-1.11022e-16),(-0.0403458,-0.0837876,2.77556e-17,1,-2.77556e-17),(
-0.0113061,0.177258,1.249e-16,1.28153e-16,1))

Conditioning numbers:
| ||A|| | ||A^-1|| | ||A||*||A^-1||
----------------|----------------|----------------|----------------
m | 52| 0.480001| 24.9601
l | 51| 0.407703| 20.7929
k | 41.6773| 0.355922| 14.8339
Код решения:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <cstdlib>
#include <cmath>

#define ESP 0.0000000001

using namespace boost::numeric::ublas;


using namespace std;

typedef matrix<long double> dMatrix;

6
dMatrix mul(dMatrix A, dMatrix B)
{
if (A.size2() != B.size1()) return dMatrix(0,0);
dMatrix C (A.size1(), B.size2());
for (size_t i = 0; i < A.size1(); i++)
{
for (size_t j = 0; j < B.size2(); j++)
{
C(i,j) = 0;
for (size_t k = 0; k < A.size2(); k++)
C(i,j) += A(i,k) * B(k,j);
}
}
return C;
}

dMatrix sub(dMatrix A, dMatrix B)


{
if (A.size1() != B.size1() || A.size2() != B.size2()) return dMatrix(0,0);
dMatrix C (A.size1(), B.size2());
for (size_t i = 0; i < A.size1(); i++)
{
for (size_t j = 0; j < B.size2(); j++)
{
C(i,j) = A(i,j) - B(i,j);
}
}
return C;
}

int main()
{
int n = 0;

ifstream input("input.dat");

input >> n;

dMatrix A(n,n,0), iA(n,n,0), B(n,1,0), L(n,n,0), U(n,n,0), X(n,1,0), Y(n,1,0);

if (!input.is_open()) {
cout << "File not found!" << endl;
return 1;
}

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


long double buf;
for (int j = 0; j < n; j++) {
if (!(input >> buf)) {
cout << "Insufficient file!" << endl;
return 1;
}
A.insert_element(i,j,buf);

7
}
if (!(input >> buf)) {
cout << "Insufficient file!" << endl;
return 1;
}
B.insert_element(i,0,buf);
}

cout << "A = " << A << endl << "B = " << B << endl;

long double det = 1.0;

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


for (int j = i; j < n; j++) {
long double sum = 0;
for (int k = 0; k < i; k++) sum += L(i,k) * U(k,j);
U(i,j) = A(i,j) - sum;
}
if (U(i,i) < ESP) {
cout << "The matrix does not meet the requirements!" << endl;
return 1;
}
det *= U(i,i);
for (int j = i; j < n; j++) {
long double sum = 0;
for (int k = 0; k < i; k++) sum += L(j,k) * U(k,i);
L(j,i) = (A(j,i) - sum) / U(i,i);
}
}

cout << "--------------------" << endl;

cout << "det A = " << det << endl;

cout << "--------------------" << endl;

cout << "L = " << L << endl << "U = " << U << endl;

#pragma omp parallel


{
#pragma omp sections
{
#pragma omp section
{
for (int i = 0; i < n; i++) {
long double sum = 0;
for (int k = 0; k < i; k++) sum += L(i,k) * Y(k,0);
Y(i,0) = B(i,0) - sum;
}

for (int i = n-1; i >= 0; i--) {


long double sum = 0;

8
for (int k = n-1; k > i; k--) sum += U(i,k) * X(k,0);
X(i,0) = (Y(i,0) - sum) / U(i,i);
}
}
#pragma omp section
{
for (int j = n-1; j >= 0; j--) {
long double sum = 0;
for (int k = j+1; k < n; k++) sum += U(j,k) * iA(k,j);
iA(j,j) = (1 - sum) / U(j,j);
for (int i = j - 1; i >= 0; i--) {
sum = 0;
for (int k = i + 1; k < n; k++) sum += U(i,k)*iA(k,j);
iA(i,j) = -sum/U(i,i);
}
for (int i = j - 1; i >= 0; i--) {
sum = 0;
for (int k = j - 1; k < n; k++) sum += iA(j,k)*L(k,i);
iA(j,i) = -sum;
}
}
}
}
}

cout << "--------------------" << endl;

cout << "Y = " << Y << endl << "X = " << X << endl;

dMatrix Err = mul(A,X);

Err = sub(Err,B);

cout << "--------------------" << endl;

cout << "Err = " << Err << endl;

cout << "--------------------" << endl;

cout << "rev A = " << iA << endl;


cout << "E = " << mul(A,iA) << endl;

long double m = 0, im = 0, l = 0, il = 0, k = 0, ik = 0;

#pragma omp parallel


{
#pragma omp sections
{
#pragma omp section
{
for (size_t i = 0; i < A.size1(); i++) {

9
long double sum = 0;
for (size_t j = 0; j < A.size2(); j++) {
sum += abs(A(i,j));
}
if (sum > m) m = sum;
}
}
#pragma omp section
{
for (size_t i = 0; i < iA.size1(); i++) {
long double sum = 0;
for (size_t j = 0; j < iA.size2(); j++) {
sum += abs(iA(i,j));
}
if (sum > im) im = sum;
}
}
#pragma omp section
{
for (size_t i = 0; i < A.size1(); i++) {
long double sum = 0;
for (size_t j = 0; j < A.size2(); j++) {
sum += abs(A(j,i));
}
if (sum > l) l = sum;
}
}
#pragma omp section
{
for (size_t i = 0; i < iA.size1(); i++) {
long double sum = 0;
for (size_t j = 0; j < iA.size2(); j++) {
sum += abs(iA(j,i));
}
if (sum > il) il = sum;
}
}
#pragma omp section
{
long double sum = 0;
for (size_t i = 0; i < A.size1(); i++) {
for (size_t j = 0; j < A.size2(); j++) {
sum += A(i,j) * A(i,j);
}
}
k = sqrt(sum);
}
#pragma omp section
{
long double sum = 0;
for (size_t i = 0; i < iA.size1(); i++) {
for (size_t j = 0; j < iA.size2(); j++) {
sum += iA(i,j) * iA(i,j);
}
}
ik = sqrt(sum);
}
}
}

10
cout << endl << "Conditioning numbers:" << endl;
cout << " |" << " ||A|| " << "|" << " ||A^-1|| " <<
"|" << " ||A||*||A^-1|| " << endl;
cout << "----------------|----------------|----------------|----------------" <<
endl;
cout << " m |" << setw(16) << m << "|" << setw(16) << im << "|" <<
setw(16) << m*im << endl;
cout << " l |" << setw(16) << l << "|" << setw(16) << il << "|" <<
setw(16) << l*il << endl;
cout << " k |" << setw(16) << k << "|" << setw(16) << ik << "|" <<
setw(16) << k*ik << endl;
return 0;
}

11

Вам также может понравиться