Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- def print_separator(task_name):
- print("\n" + "="*70)
- print(f" {task_name}")
- print("="*70)
- def calculate_pair_regression_coefs(x, y):
- n = len(x)
- mean_x = np.mean(x)
- mean_y = np.mean(y)
- mean_x2 = np.mean(x**2)
- mean_xy = np.mean(x * y)
- denominator = mean_x2 - mean_x**2
- a1 = (mean_xy - mean_x * mean_y) / denominator
- a0 = mean_y - a1 * mean_x
- return a0, a1
- def solve_matrix_method(A, B):
- A_inv = np.linalg.inv(A)
- X = A_inv.dot(B)
- return X
- def task1():
- print_separator("ЗАВДАННЯ 1: Гіперболічна модель")
- Y = np.array([40, 37, 34, 21, 29, 27, 25, 24, 23, 22], dtype=float)
- X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=float)
- Z = 1 / X
- a0, a1 = calculate_pair_regression_coefs(Z, Y)
- print(f"Розрахунок через середні значення:")
- print(f"a0 = {a0:.4f}")
- print(f"a1 = {a1:.4f}")
- print(f"Емпіричне рівняння: y = {a0:.4f} + {a1:.4f}/x")
- X_smooth = np.linspace(X.min(), X.max(), 100)
- Y_pred = a0 + a1 / X_smooth
- plt.figure(figsize=(10, 6))
- plt.scatter(X, Y, color='red', label='Дані', zorder=5)
- plt.plot(X_smooth, Y_pred, color='blue', linewidth=2, label=f'Гіпербола')
- plt.title('Завдання 1: Гіперболічна модель')
- plt.xlabel('x (Кількість)')
- plt.ylabel('Y (Собівартість)')
- plt.legend()
- plt.grid(True)
- plt.show()
- def task2():
- print_separator("ЗАВДАННЯ 2: Функція Кобба-Дугласа")
- data = {
- 'Year': range(2010, 2021),
- 'Y': [810843, 970116, 974924, 904052, 975675, 1206041, 1458786, 1805097, 2060485, 2142939, 2057221],
- 'K': [30579, 42742, 43032, 46240, 42474, 46219, 62223, 73884, 100870, 105878, 84408],
- 'L': [2402.3, 2326.8, 2321.6, 2275.5, 2022.2, 1839.3, 1791.7, 1774.9, 1786.3, 1933.3, 1737.2]
- }
- Y_raw = np.array(data['Y'], dtype=float)
- K_raw = np.array(data['K'], dtype=float)
- L_raw = np.array(data['L'], dtype=float)
- n = len(Y_raw)
- Y_star = np.log(Y_raw)
- K_star = np.log(K_raw)
- L_star = np.log(L_raw)
- print("\n--- Модель 1: Y = a0 * K^a1 * L^a2 ---")
- sum_Y = np.sum(Y_star)
- sum_K = np.sum(K_star)
- sum_L = np.sum(L_star)
- sum_K2 = np.sum(K_star**2)
- sum_L2 = np.sum(L_star**2)
- sum_KL = np.sum(K_star * L_star)
- sum_KY = np.sum(K_star * Y_star)
- sum_LY = np.sum(L_star * Y_star)
- A1 = np.array([
- [n, sum_K, sum_L],
- [sum_K, sum_K2, sum_KL],
- [sum_L, sum_KL, sum_L2]
- ])
- B1 = np.array([sum_Y, sum_KY, sum_LY])
- X1 = solve_matrix_method(A1, B1)
- ln_a0, a1_1, a2_1 = X1
- a0_1 = np.exp(ln_a0)
- print(f"Матричний розв'язок:")
- print(f"ln(a0) = {ln_a0:.4f} => a0 = {a0_1:.4f}")
- print(f"a1 = {a1_1:.4f}")
- print(f"a2 = {a2_1:.4f}")
- print(f"Рівняння: Y = {a0_1:.2f} * K^{a1_1:.4f} * L^{a2_1:.4f}")
- print("\n--- Модель 2: Y = K^a1 * L^a2 (при a0=1) ---")
- A2 = np.array([
- [sum_K2, sum_KL],
- [sum_KL, sum_L2]
- ])
- B2 = np.array([sum_KY, sum_LY])
- X2 = solve_matrix_method(A2, B2)
- a1_2, a2_2 = X2
- print(f"a0 = 1")
- print(f"a1 = {a1_2:.4f}")
- print(f"a2 = {a2_2:.4f}")
- print(f"Рівняння: Y = K^{a1_2:.4f} * L^{a2_2:.4f}")
- Y_pred1 = a0_1 * (K_raw ** a1_1) * (L_raw ** a2_1)
- Y_pred2 = 1.0 * (K_raw ** a1_2) * (L_raw ** a2_2)
- plt.figure(figsize=(10, 6))
- years = data['Year']
- plt.plot(years, Y_raw, 'o-', color='black', label='Фактичні дані', linewidth=2)
- plt.plot(years, Y_pred1, 's--', color='blue', label='Модель (a0 розрах.)')
- plt.plot(years, Y_pred2, '^:', color='green', label='Модель (a0=1)')
- plt.title('Завдання 2: ВВП України (Кобба-Дугласа)')
- plt.xlabel('Рік')
- plt.ylabel('ВВП')
- plt.legend()
- plt.grid(True)
- plt.show()
- def task3():
- print_separator("ЗАВДАННЯ 3: Показникова модель")
- 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)
- 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)
- n = len(X)
- Y_star = np.log(Y)
- mean_x = np.mean(X)
- mean_y_star = np.mean(Y_star)
- mean_x2 = np.mean(X**2)
- mean_xy_star = np.mean(X * Y_star)
- print(f"Середні значення:")
- print(f"x_bar = {mean_x:.4f}")
- print(f"y*_bar = {mean_y_star:.4f}")
- print(f"x^2_bar = {mean_x2:.4f}")
- print(f"xy*_bar = {mean_xy_star:.4f}")
- A_sys = np.array([
- [1.0, mean_x],
- [mean_x, mean_x2]
- ])
- B_sys = np.array([mean_y_star, mean_xy_star])
- print("\nСистема нормальних рівнянь:")
- print(f"1 * a0* + {mean_x:.4f} * a1* = {mean_y_star:.4f}")
- print(f"{mean_x:.4f} * a0* + {mean_x2:.4f} * a1* = {mean_xy_star:.4f}")
- X_sol = solve_matrix_method(A_sys, B_sys)
- A_val, B_val = X_sol[0], X_sol[1]
- a0 = np.exp(A_val)
- a1 = np.exp(B_val)
- print(f"\nРозв'язок:")
- print(f"ln(a0) (a0*) = {A_val:.4f}")
- print(f"ln(a1) (a1*) = {B_val:.4f}")
- print(f"Залишкові параметри: a0={a0:.4f}, a1={a1:.4f}")
- print(f"Показникова модель: y = {a0:.4f} * {a1:.4f}^x")
- X_smooth = np.linspace(X.min(), X.max(), 100)
- Y_pred = a0 * (a1 ** X_smooth)
- plt.figure(figsize=(10, 6))
- plt.scatter(X, Y, color='red', label='Дані', zorder=5)
- plt.plot(X_smooth, Y_pred, color='blue', label='Показникова модель')
- plt.title('Завдання 3: Дохід від заощаджень')
- plt.xlabel('Заощадження (x)')
- plt.ylabel('Дохід (y)')
- plt.legend()
- plt.grid(True)
- plt.show()
- def task4():
- print_separator("ЗАВДАННЯ 4: Крива Лаффера")
- Y = np.array([21848, 25130, 32318, 36716, 45393, 54321, 63162, 98065, 125743, 161264,
- 227165, 208073, 234448, 334692, 445525, 353968, 367511, 507636, 650782,
- 828159, 986349, 1070322, 1136687], dtype=float)
- 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,
- 0.22, 0.353, 0.36, 0.35, 0.329, 0.343, 0.32, 0.332, 0.336, 0.37, 0.404], dtype=float)
- n = len(Y)
- Y_star = np.log(Y)
- sum_x = np.sum(x)
- sum_x2 = np.sum(x**2)
- sum_x3 = np.sum(x**3)
- sum_x4 = np.sum(x**4)
- sum_y = np.sum(Y_star)
- sum_xy = np.sum(x * Y_star)
- sum_x2y = np.sum(x**2 * Y_star)
- A_mat = np.array([
- [n, sum_x, sum_x2],
- [sum_x, sum_x2, sum_x3],
- [sum_x2, sum_x3, sum_x4]
- ])
- B_vec = np.array([sum_y, sum_xy, sum_x2y])
- X_vec = solve_matrix_method(A_mat, B_vec)
- coef_a0_star = X_vec[0]
- coef_a3 = X_vec[1]
- coef_a1_quad = X_vec[2]
- print(f"Коефіцієнти параболи (Матричний метод):")
- print(f"a0*={coef_a0_star:.4f}, a3={coef_a3:.4f}, a1={coef_a1_quad:.4f}")
- laffer_a1 = coef_a1_quad
- laffer_a2 = coef_a3 / (-2 * laffer_a1)
- ln_a0_final = coef_a0_star - laffer_a1 * (laffer_a2**2)
- laffer_a0 = np.exp(ln_a0_final)
- print("\nПараметри кривої Лаффера:")
- print(f"a0 = {laffer_a0:.4f}")
- print(f"a1 = {laffer_a1:.4f}")
- print(f"a2 = {laffer_a2:.4f}")
- print(f"Рівняння: Y = {laffer_a0:.2f} * e^({laffer_a1:.2f} * (x - {laffer_a2:.2f})^2)")
- X_smooth = np.linspace(x.min()*0.8, x.max()*1.1, 100)
- Y_pred = laffer_a0 * np.exp(laffer_a1 * (X_smooth - laffer_a2)**2)
- plt.figure(figsize=(10, 6))
- plt.scatter(x, Y, color='red', label='Дані', zorder=5)
- plt.plot(X_smooth, Y_pred, color='blue', label='Крива Лаффера')
- plt.axvline(x=laffer_a2, color='green', linestyle=':', label=f'Оптимум ({laffer_a2:.2%})')
- plt.title('Завдання 4: Крива Лаффера')
- plt.xlabel('Податкове навантаження (x)')
- plt.ylabel('Надходження (Y)')
- plt.legend()
- plt.grid(True)
- plt.show()
- task1()
- task2()
- task3()
- task4()
Advertisement
Add Comment
Please, Sign In to add comment