import numpy as np
import matplotlib.pyplot as plt
# 1. 基本线性方程求解
def solve_2x2_system():
"""求解2x2线性方程组"""
A = np.array([[2, 3], [1, -1]])
b = np.array([7, 1])
print("系数矩阵A:")
print(A)
print("\n常数向量b:")
print(b)
# 计算行列式
det_A = np.linalg.det(A)
print(f"\n行列式 det(A) = {det_A}")
if det_A != 0:
# 计算逆矩阵
A_inv = np.linalg.inv(A)
print("\n逆矩阵 A⁻¹:")
print(A_inv)
# 求解方程组
x = np.linalg.solve(A, b)
print(f"\n解向量 x = {x}")
# 验证解
verification = np.dot(A, x)
print(f"验证: A * x = {verification}")
print(f"原始b = {b}")
print(f"误差 = {np.linalg.norm(verification - b)}")
return x
else:
print("矩阵是奇异的,没有唯一解")
return None
# 2. 线性回归中的矩阵应用
def linear_regression_matrix():
"""使用矩阵方法进行线性回归"""
# 生成示例数据
np.random.seed(42)
X = np.random.randn(100, 2)
true_coeffs = np.array([2.5, -1.8])
y = np.dot(X, true_coeffs) + np.random.normal(0, 0.1, 100)
print("真实系数:", true_coeffs)
# 添加偏置项
X_b = np.c_[np.ones((X.shape[0], 1)), X]
# 使用矩阵方法求解:β = (X^T X)^(-1) X^T y
X_transpose = X_b.T
X_transpose_X = np.dot(X_transpose, X_b)
X_transpose_y = np.dot(X_transpose, y)
# 求解线性方程组
beta = np.linalg.solve(X_transpose_X, X_transpose_y)
print("估计系数:", beta[1:]) # 排除偏置项
print("偏置项:", beta[0])
return beta, X, y
# 3. 可视化线性方程
def visualize_linear_equations():
"""可视化线性方程组的解"""
# 方程组:2x + 3y = 7, x - y = 1
x = np.linspace(-2, 5, 100)
# 第一个方程:2x + 3y = 7 → y = (7 - 2x) / 3
y1 = (7 - 2*x) / 3
# 第二个方程:x - y = 1 → y = x - 1
y2 = x - 1
plt.figure(figsize=(10, 6))
plt.plot(x, y1, label='2x + 3y = 7', linewidth=2)
plt.plot(x, y2, label='x - y = 1', linewidth=2)
# 标记解点
solution = solve_2x2_system()
if solution is not None:
plt.plot(solution[0], solution[1], 'ro', markersize=10, label='解点')
plt.annotate(f'({solution[0]:.2f}, {solution[1]:.2f})',
xy=(solution[0], solution[1]),
xytext=(solution[0]+0.5, solution[1]+0.5),
arrowprops=dict(arrowstyle='->', color='red'))
plt.xlabel('x')
plt.ylabel('y')
plt.title('线性方程组的解')
plt.legend()
plt.grid(True, alpha=0.3)
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.show()
# 4. 处理奇异矩阵
def handle_singular_matrix():
"""处理奇异矩阵的情况"""
# 奇异矩阵示例
A_singular = np.array([[1, 2], [2, 4]]) # 第二行是第一行的2倍
b = np.array([3, 6])
print("奇异矩阵A:")
print(A_singular)
print(f"行列式: {np.linalg.det(A_singular)}")
try:
# 尝试求解
x = np.linalg.solve(A_singular, b)
print("解:", x)
except np.linalg.LinAlgError:
print("矩阵是奇异的,无法求解")
# 使用伪逆作为替代
A_pinv = np.linalg.pinv(A_singular)
x_pinv = np.dot(A_pinv, b)
print("使用伪逆的解:", x_pinv)
# 运行示例
if __name__ == "__main__":
print("=== 基本线性方程求解 ===")
solution = solve_2x2_system()
print("\n=== 线性回归矩阵方法 ===")
beta, X, y = linear_regression_matrix()
print("\n=== 处理奇异矩阵 ===")
handle_singular_matrix()
print("\n=== 可视化线性方程 ===")
visualize_linear_equations()