Лаба Дмитро

Лабораторна робота №2

Варіант 2


In [1]:
import numpy as np
import sympy as sp
from scipy.linalg import eig
from sympy.matrices import Matrix
from IPython.display import display, Math, Latex

def bmatrix(a):
    lines = str(a).replace('[', '').replace(']', '').splitlines()
    rv = [r'\begin{bmatrix}']
    rv += ['  ' + ' & '.join(l.split()) + r'\\' for l in lines]
    rv +=  [r'\end{bmatrix}']
    return Math('\n'.join(rv))

Завдання №1


In [2]:
industry = (600, 450, 1200)
industry_added_value = 0.3

agriculture = (450, 400, 700)
agriculture_added_value = 0.5

matrix = np.array([industry, agriculture])
added_value = np.array([industry_added_value, agriculture_added_value])

In [3]:
gross_output = np.sum(matrix, axis=1)
direct_expenses = matrix[0:2, 0:2]/gross_output
print('Прямі витрати: ')
display(bmatrix(direct_expenses))


Прямі витрати: 
$$\begin{bmatrix} 0.26666667 & 0.29032258\\ 0.2 & 0.25806452\\ \end{bmatrix}$$

In [4]:
full_expenses = np.linalg.inv(np.eye(len(direct_expenses)) - direct_expenses)
print('Повні витрати: ')
display(bmatrix(full_expenses))


Повні витрати: 
$$\begin{bmatrix} 1.52654867 & 0.59734513\\ 0.41150442 & 1.50884956\\ \end{bmatrix}$$

In [5]:
prices = added_value @ full_expenses
print('Ціни на промислову та сільськогосподарську продукцію: ')
display(bmatrix(prices))


Ціни на промислову та сільськогосподарську продукцію: 
$$\begin{bmatrix} 0.66371681 & 0.93362832\\ \end{bmatrix}$$

Завдання №2


In [6]:
A = np.array([
    [0.4, 0.4, 0.2], 
    [0.2, 0.5, 0.4],
    [0.1, 0.1, 0.2]
])
n = len(A)

Власні числа


In [7]:
eigvals = np.linalg.eigvals(A)
print('\n'.join(['({0:.2f} {1} {2:.2f}i)'.format(n.real, '+-'[n.imag < 0], abs(n.imag)) for n in eigvals]))


(0.84 + 0.00i)
(0.13 + 0.07i)
(0.13 - 0.07i)

Коефіцієнти характеристичного поліному


In [8]:
M = Matrix(A)
lamda = sp.symbols('lamda')
characteristic_polynomial = M.charpoly(lamda)
sp.init_printing(use_latex='mathjax')
display(sp.factor(characteristic_polynomial))


$$1.0 \left(1.0 \lambda^{3} - 1.1 \lambda^{2} + 0.24 \lambda - 0.018\right)$$

Число Фробеніуса


In [9]:
frobenius_number = np.real(np.max(eigvals)) 
print('{0:.2f}'.format(frobenius_number))


0.84

Правий та лівий вектори Фробеніуса


In [10]:
a, left, right = eig(A, left=True)
print('Лівий вектор: ')
left_frobenius = np.real(left[:, 0])
display(bmatrix(left_frobenius))

print('Перевірка: ')
display(bmatrix(left_frobenius @ A))
display(bmatrix(frobenius_number * left_frobenius))


print('Правий вектор: ')
right_frobenius = np.real(right[:, 0])
display(bmatrix(right_frobenius))

print('Перевірка: ')
display(bmatrix(A @ right_frobenius))
display(bmatrix(frobenius_number * right_frobenius))


Лівий вектор: 
$$\begin{bmatrix} 0.44397979 & 0.69076468 & 0.57072419\\ \end{bmatrix}$$
Перевірка: 
$$\begin{bmatrix} 0.37281727 & 0.58004668 & 0.47924667\\ \end{bmatrix}$$
$$\begin{bmatrix} 0.37281727 & 0.58004668 & 0.47924667\\ \end{bmatrix}$$
Правий вектор: 
$$\begin{bmatrix} 0.7089431 & 0.67144485 & 0.21578112\\ \end{bmatrix}$$
Перевірка: 
$$\begin{bmatrix} 0.5953114 & 0.56382349 & 0.18119502\\ \end{bmatrix}$$
$$\begin{bmatrix} 0.5953114 & 0.56382349 & 0.18119502\\ \end{bmatrix}$$

Продуктивність матриці

За критерієм Леонтьєва, необхідня і достатня умова $\lambda_A < 1$ виконується, тому матриця є продуктивною

Матриця повних витрат


In [11]:
B = np.linalg.inv(np.eye(len(A)) - A)
display(bmatrix(B))


$$\begin{bmatrix} 2.95081967 & 2.78688525 & 2.13114754\\ 1.63934426 & 3.7704918 & 2.29508197\\ 0.57377049 & 0.81967213 & 1.80327869\\ \end{bmatrix}$$

Збіжність до матриці повних витрат


In [12]:
matrix_sum, A_power = np.eye(n), np.eye(n)
for i in range(200):
    A_power = A_power @ A
    matrix_sum += A_power
    if np.all(B - matrix_sum) < 0.01:
        print('Матриця збіжна до матриці повних витрат на кроці {}'.format(i))
        break
display(bmatrix(matrix_sum))


Матриця збіжна до матриці повних витрат на кроці 193
$$\begin{bmatrix} 2.95081967 & 2.78688525 & 2.13114754\\ 1.63934426 & 3.7704918 & 2.29508197\\ 0.57377049 & 0.81967213 & 1.80327869\\ \end{bmatrix}$$

Вектор кінцевого випуску


In [13]:
y = np.array([100, 70, 80])
end_output = np.linalg.inv(np.eye(n) - A) @ y
display(bmatrix(end_output))


$$\begin{bmatrix} 660.6557377 & 611.47540984 & 259.01639344\\ \end{bmatrix}$$