mirosh111000

Прикладна_економетрика_ЛР№9_Мірошниченко

Nov 30th, 2025
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.56 KB | None | 0 0
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4.  
  5. def print_separator(task_name):
  6.     print("\n" + "="*70)
  7.     print(f" {task_name}")
  8.     print("="*70)
  9.  
  10. def calculate_pair_regression_coefs(x, y):
  11.     n = len(x)
  12.     mean_x = np.mean(x)
  13.     mean_y = np.mean(y)
  14.     mean_x2 = np.mean(x**2)
  15.     mean_xy = np.mean(x * y)
  16.    
  17.     denominator = mean_x2 - mean_x**2
  18.    
  19.     a1 = (mean_xy - mean_x * mean_y) / denominator
  20.    
  21.     a0 = mean_y - a1 * mean_x
  22.    
  23.     return a0, a1
  24.  
  25. def solve_matrix_method(A, B):
  26.     A_inv = np.linalg.inv(A)
  27.    
  28.     X = A_inv.dot(B)
  29.     return X
  30.  
  31. def task1():
  32.     print_separator("ЗАВДАННЯ 1: Гіперболічна модель")
  33.    
  34.     Y = np.array([40, 37, 34, 21, 29, 27, 25, 24, 23, 22], dtype=float)
  35.     X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=float)
  36.    
  37.     Z = 1 / X
  38.    
  39.     a0, a1 = calculate_pair_regression_coefs(Z, Y)
  40.    
  41.     print(f"Розрахунок через середні значення:")
  42.     print(f"a0 = {a0:.4f}")
  43.     print(f"a1 = {a1:.4f}")
  44.     print(f"Емпіричне рівняння: y = {a0:.4f} + {a1:.4f}/x")
  45.    
  46.     X_smooth = np.linspace(X.min(), X.max(), 100)
  47.     Y_pred = a0 + a1 / X_smooth
  48.    
  49.     plt.figure(figsize=(10, 6))
  50.     plt.scatter(X, Y, color='red', label='Дані', zorder=5)
  51.     plt.plot(X_smooth, Y_pred, color='blue', linewidth=2, label=f'Гіпербола')
  52.     plt.title('Завдання 1: Гіперболічна модель')
  53.     plt.xlabel('x (Кількість)')
  54.     plt.ylabel('Y (Собівартість)')
  55.     plt.legend()
  56.     plt.grid(True)
  57.     plt.show()
  58.  
  59. def task2():
  60.     print_separator("ЗАВДАННЯ 2: Функція Кобба-Дугласа")
  61.    
  62.     data = {
  63.         'Year': range(2010, 2021),
  64.         'Y': [810843, 970116, 974924, 904052, 975675, 1206041, 1458786, 1805097, 2060485, 2142939, 2057221],
  65.         'K': [30579, 42742, 43032, 46240, 42474, 46219, 62223, 73884, 100870, 105878, 84408],
  66.         'L': [2402.3, 2326.8, 2321.6, 2275.5, 2022.2, 1839.3, 1791.7, 1774.9, 1786.3, 1933.3, 1737.2]
  67.     }
  68.    
  69.     Y_raw = np.array(data['Y'], dtype=float)
  70.     K_raw = np.array(data['K'], dtype=float)
  71.     L_raw = np.array(data['L'], dtype=float)
  72.     n = len(Y_raw)
  73.    
  74.     Y_star = np.log(Y_raw)
  75.     K_star = np.log(K_raw)
  76.     L_star = np.log(L_raw)
  77.    
  78.     print("\n--- Модель 1: Y = a0 * K^a1 * L^a2 ---")
  79.    
  80.     sum_Y = np.sum(Y_star)
  81.     sum_K = np.sum(K_star)
  82.     sum_L = np.sum(L_star)
  83.     sum_K2 = np.sum(K_star**2)
  84.     sum_L2 = np.sum(L_star**2)
  85.     sum_KL = np.sum(K_star * L_star)
  86.     sum_KY = np.sum(K_star * Y_star)
  87.     sum_LY = np.sum(L_star * Y_star)
  88.    
  89.     A1 = np.array([
  90.         [n,      sum_K,  sum_L],
  91.         [sum_K,  sum_K2, sum_KL],
  92.         [sum_L,  sum_KL, sum_L2]
  93.     ])
  94.     B1 = np.array([sum_Y, sum_KY, sum_LY])
  95.    
  96.     X1 = solve_matrix_method(A1, B1)
  97.     ln_a0, a1_1, a2_1 = X1
  98.     a0_1 = np.exp(ln_a0)
  99.    
  100.     print(f"Матричний розв'язок:")
  101.     print(f"ln(a0) = {ln_a0:.4f} => a0 = {a0_1:.4f}")
  102.     print(f"a1 = {a1_1:.4f}")
  103.     print(f"a2 = {a2_1:.4f}")
  104.     print(f"Рівняння: Y = {a0_1:.2f} * K^{a1_1:.4f} * L^{a2_1:.4f}")
  105.    
  106.     print("\n--- Модель 2: Y = K^a1 * L^a2 (при a0=1) ---")
  107.    
  108.     A2 = np.array([
  109.         [sum_K2, sum_KL],
  110.         [sum_KL, sum_L2]
  111.     ])
  112.     B2 = np.array([sum_KY, sum_LY])
  113.    
  114.     X2 = solve_matrix_method(A2, B2)
  115.     a1_2, a2_2 = X2
  116.    
  117.     print(f"a0 = 1")
  118.     print(f"a1 = {a1_2:.4f}")
  119.     print(f"a2 = {a2_2:.4f}")
  120.     print(f"Рівняння: Y = K^{a1_2:.4f} * L^{a2_2:.4f}")
  121.    
  122.     Y_pred1 = a0_1 * (K_raw ** a1_1) * (L_raw ** a2_1)
  123.     Y_pred2 = 1.0 * (K_raw ** a1_2) * (L_raw ** a2_2)
  124.    
  125.     plt.figure(figsize=(10, 6))
  126.     years = data['Year']
  127.     plt.plot(years, Y_raw, 'o-', color='black', label='Фактичні дані', linewidth=2)
  128.     plt.plot(years, Y_pred1, 's--', color='blue', label='Модель (a0 розрах.)')
  129.     plt.plot(years, Y_pred2, '^:', color='green', label='Модель (a0=1)')
  130.     plt.title('Завдання 2: ВВП України (Кобба-Дугласа)')
  131.     plt.xlabel('Рік')
  132.     plt.ylabel('ВВП')
  133.     plt.legend()
  134.     plt.grid(True)
  135.     plt.show()
  136.  
  137. def task3():
  138.     print_separator("ЗАВДАННЯ 3: Показникова модель")
  139.    
  140.     X = np.array([2.36, 2.2, 2.08, 2.2, 2.1, 2.12, 2.41, 2.5, 2.43, 2.59, 2.9, 2.95], dtype=float)
  141.     Y = np.array([11.8, 11.4, 12, 12.6, 13, 13.9, 14.7, 15.5, 16.3, 17.5, 18.7, 19.7], dtype=float)
  142.     n = len(X)
  143.    
  144.     Y_star = np.log(Y)
  145.    
  146.     mean_x = np.mean(X)
  147.     mean_y_star = np.mean(Y_star)
  148.     mean_x2 = np.mean(X**2)
  149.     mean_xy_star = np.mean(X * Y_star)
  150.    
  151.     print(f"Середні значення:")
  152.     print(f"x_bar = {mean_x:.4f}")
  153.     print(f"y*_bar = {mean_y_star:.4f}")
  154.     print(f"x^2_bar = {mean_x2:.4f}")
  155.     print(f"xy*_bar = {mean_xy_star:.4f}")
  156.    
  157.     A_sys = np.array([
  158.         [1.0, mean_x],
  159.         [mean_x, mean_x2]
  160.     ])
  161.     B_sys = np.array([mean_y_star, mean_xy_star])
  162.    
  163.     print("\nСистема нормальних рівнянь:")
  164.     print(f"1 * a0* + {mean_x:.4f} * a1* = {mean_y_star:.4f}")
  165.     print(f"{mean_x:.4f} * a0* + {mean_x2:.4f} * a1* = {mean_xy_star:.4f}")
  166.    
  167.     X_sol = solve_matrix_method(A_sys, B_sys)
  168.     A_val, B_val = X_sol[0], X_sol[1]
  169.    
  170.     a0 = np.exp(A_val)
  171.     a1 = np.exp(B_val)
  172.    
  173.     print(f"\nРозв'язок:")
  174.     print(f"ln(a0) (a0*) = {A_val:.4f}")
  175.     print(f"ln(a1) (a1*) = {B_val:.4f}")
  176.     print(f"Залишкові параметри: a0={a0:.4f}, a1={a1:.4f}")
  177.     print(f"Показникова модель: y = {a0:.4f} * {a1:.4f}^x")
  178.    
  179.     X_smooth = np.linspace(X.min(), X.max(), 100)
  180.     Y_pred = a0 * (a1 ** X_smooth)
  181.    
  182.     plt.figure(figsize=(10, 6))
  183.     plt.scatter(X, Y, color='red', label='Дані', zorder=5)
  184.     plt.plot(X_smooth, Y_pred, color='blue', label='Показникова модель')
  185.     plt.title('Завдання 3: Дохід від заощаджень')
  186.     plt.xlabel('Заощадження (x)')
  187.     plt.ylabel('Дохід (y)')
  188.     plt.legend()
  189.     plt.grid(True)
  190.     plt.show()
  191.  
  192. def task4():
  193.     print_separator("ЗАВДАННЯ 4: Крива Лаффера")
  194.    
  195.     Y = np.array([21848, 25130, 32318, 36716, 45393, 54321, 63162, 98065, 125743, 161264,
  196.                   227165, 208073, 234448, 334692, 445525, 353968, 367511, 507636, 650782,
  197.                   828159, 986349, 1070322, 1136687], dtype=float)
  198.     x = np.array([0.21, 0.19, 0.18, 0.18, 0.2, 0.2, 0.18, 0.22, 0.23, 0.22, 0.24, 0.23,
  199.                   0.22, 0.353, 0.36, 0.35, 0.329, 0.343, 0.32, 0.332, 0.336, 0.37, 0.404], dtype=float)
  200.     n = len(Y)
  201.    
  202.     Y_star = np.log(Y)
  203.    
  204.     sum_x = np.sum(x)
  205.     sum_x2 = np.sum(x**2)
  206.     sum_x3 = np.sum(x**3)
  207.     sum_x4 = np.sum(x**4)
  208.    
  209.     sum_y = np.sum(Y_star)
  210.     sum_xy = np.sum(x * Y_star)
  211.     sum_x2y = np.sum(x**2 * Y_star)
  212.    
  213.     A_mat = np.array([
  214.         [n,      sum_x,   sum_x2],
  215.         [sum_x,  sum_x2,  sum_x3],
  216.         [sum_x2, sum_x3,  sum_x4]
  217.     ])
  218.     B_vec = np.array([sum_y, sum_xy, sum_x2y])
  219.    
  220.     X_vec = solve_matrix_method(A_mat, B_vec)
  221.    
  222.     coef_a0_star = X_vec[0]
  223.     coef_a3 = X_vec[1]
  224.     coef_a1_quad = X_vec[2]
  225.    
  226.     print(f"Коефіцієнти параболи (Матричний метод):")
  227.     print(f"a0*={coef_a0_star:.4f}, a3={coef_a3:.4f}, a1={coef_a1_quad:.4f}")
  228.    
  229.     laffer_a1 = coef_a1_quad
  230.     laffer_a2 = coef_a3 / (-2 * laffer_a1)
  231.     ln_a0_final = coef_a0_star - laffer_a1 * (laffer_a2**2)
  232.     laffer_a0 = np.exp(ln_a0_final)
  233.    
  234.     print("\nПараметри кривої Лаффера:")
  235.     print(f"a0 = {laffer_a0:.4f}")
  236.     print(f"a1 = {laffer_a1:.4f}")
  237.     print(f"a2 = {laffer_a2:.4f}")
  238.     print(f"Рівняння: Y = {laffer_a0:.2f} * e^({laffer_a1:.2f} * (x - {laffer_a2:.2f})^2)")
  239.    
  240.     X_smooth = np.linspace(x.min()*0.8, x.max()*1.1, 100)
  241.     Y_pred = laffer_a0 * np.exp(laffer_a1 * (X_smooth - laffer_a2)**2)
  242.    
  243.     plt.figure(figsize=(10, 6))
  244.     plt.scatter(x, Y, color='red', label='Дані', zorder=5)
  245.     plt.plot(X_smooth, Y_pred, color='blue', label='Крива Лаффера')
  246.     plt.axvline(x=laffer_a2, color='green', linestyle=':', label=f'Оптимум ({laffer_a2:.2%})')
  247.     plt.title('Завдання 4: Крива Лаффера')
  248.     plt.xlabel('Податкове навантаження (x)')
  249.     plt.ylabel('Надходження (Y)')
  250.     plt.legend()
  251.     plt.grid(True)
  252.     plt.show()
  253.  
  254.  
  255. task1()
  256. task2()
  257. task3()
  258. task4()
Advertisement
Add Comment
Please, Sign In to add comment