Академический Документы
Профессиональный Документы
Культура Документы
Преподаватель _____________
(подпись)
«___» ____________ 2022 г.
по дисциплине «LU-факторизация»
Барнаул 2022
Ход работы:
В первую очередь необходимо получить матрицы L и U, элементы которых
спокойно высчитываются по следующим формулам:
и
Сначала находятся все y, а потом все x, по формулам:
и
И собственно решение уравнений найдено.
2
Теперь осталось получить обратную матрицу и число обусловленности.
Для обратной матрицы воспользуемся матрицами L и U, т.к. они уже у нас есть и
грех этим не воспользоваться. Хотя при других обстоятельствах (т.е. без
необходимости в решении СЛАУ), нахождение обратной матрицы через LU-
разложение не считается оптимальным.
В расчете обратной матрицы используются только матрицы L и U, что говорит о
возможности параллельных вычислений вместе с векторами Y и X. Вычисление
производится по следующим формулам:
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>
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;
}
int main()
{
int n = 0;
ifstream input("input.dat");
input >> n;
if (!input.is_open()) {
cout << "File not found!" << endl;
return 1;
}
7
}
if (!(input >> buf)) {
cout << "Insufficient file!" << endl;
return 1;
}
B.insert_element(i,0,buf);
}
cout << "A = " << A << endl << "B = " << B << endl;
cout << "L = " << L << endl << "U = " << U << endl;
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 << "Y = " << Y << endl << "X = " << X << endl;
Err = sub(Err,B);
long double m = 0, im = 0, l = 0, il = 0, k = 0, ik = 0;
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