import numpy as np

# 矩阵A：每年10%农村→城镇，2%城镇→农村
# x_n 为农村人口比例，y_n 为城镇人口比例
# x_{n+1} = 0.9*x_n + 0.02*y_n
# y_{n+1} = 0.1*x_n + 0.98*y_n
A = np.array([[0.9, 0.02],
              [0.1, 0.98]])

print("问题一：特征值与特征向量")
print("矩阵 A =")
print(A)

# 求特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print("\n特征值：", eigenvalues)
print("特征向量（每列对应一个特征值）：")
print(eigenvectors)

# 初始状态：农村和城镇各占50%
x0 = np.array([0.5, 0.5])

n = int(input("\n请输入年数 n："))

# 用特征值模型计算 A^n * x0
# 将 x0 表示为特征向量的线性组合：eigenvectors * c = x0
c = np.linalg.solve(eigenvectors, x0)

# A^n * x0 = c[0]*lambda[0]^n*v0 + c[1]*lambda[1]^n*v1
xn = c[0] * eigenvalues[0]**n * eigenvectors[:, 0] + \
     c[1] * eigenvalues[1]**n * eigenvectors[:, 1]
xn = xn.real  # 去掉数值误差产生的极小虚部

print(f"\n{n} 年后：")
print(f"农村人口比例 x = {xn[0]:.6f}")
print(f"城镇人口比例 y = {xn[1]:.6f}")
print(f"验证（x + y = 1）：{xn[0] + xn[1]:.6f}")
