SVD奇异值分解求解非齐次线性方程组代码实现

SVD可以很方便的求解齐次和非齐次线性方程组,这篇帖子有关于奇异值分解的介绍以及求解齐次和非齐次线性方程组推导过程。

求解非齐次线性方程组 Ax=b

等价于寻找x使||Ax−b||2最小化

求解步骤(图片引用自博客)

SVD奇异值分解求解非齐次线性方程组代码实现_第1张图片

代码
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.]]

你可能感兴趣的:(numpy)