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))
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))
In [4]:
full_expenses = np.linalg.inv(np.eye(len(direct_expenses)) - direct_expenses)
print('Повні витрати: ')
display(bmatrix(full_expenses))
In [5]:
prices = added_value @ full_expenses
print('Ціни на промислову та сільськогосподарську продукцію: ')
display(bmatrix(prices))
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]))
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))
In [9]:
frobenius_number = np.real(np.max(eigvals))
print('{0:.2f}'.format(frobenius_number))
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))
За критерієм Леонтьєва, необхідня і достатня умова $\lambda_A < 1$ виконується, тому матриця є продуктивною
In [11]:
B = np.linalg.inv(np.eye(len(A)) - A)
display(bmatrix(B))
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))
In [13]:
y = np.array([100, 70, 80])
end_output = np.linalg.inv(np.eye(n) - A) @ y
display(bmatrix(end_output))