SVD可以很方便的求解齐次和非齐次线性方程组,这篇帖子有关于奇异值分解的介绍以及求解齐次和非齐次线性方程组推导过程。
求解非齐次线性方程组 Ax=b
等价于寻找x使||Ax−b||2最小化
求解步骤(图片引用自博客)
代码
import numpy as np
# 定义A矩阵和b向量
A = np.array([[1.1, -0.1],
[-0.1, 1.1]])
b = np.array([[86.6],
[103.4]])
# SVD分解
u, d, v = np.linalg.svd(A)
# print(u, d, v)
# 求解b'
b_ = u.T @ b
# 求解y y由 b'/d 得到
y = [b_[i, 0] / val for i, val in enumerate(d)]
# x = Vy
x = v.T @ np.expand_dims(np.array(y), 1)
print(x)
# output
# [[ 88.]
# [102.]]