问题描述
尝试计算非线性方程的最小二乘解,但是提示矩阵为非奇异矩阵,无法算出,可是官方文档给出的demo也是一个非奇异矩阵
相关代码
import numpy as np
import sympy as sp
# 定义符号-
x = sp.Symbol('x')
y = sp.Symbol('y')
z = sp.Symbol('z')
# e = sp.Symbol('e')
# l1 = sp.Symbol('l1')
# l3 = sp.Symbol('l3')
l5 = sp.Symbol('l5')
l2 = sp.Symbol('l2')
l4 = sp.Symbol('l4')
l6 = sp.Symbol('l6')
# a = sp.Symbol('a')
# f = sp.Symbol('f')
# d = sp.Symbol('d')
# b = sp.Symbol('b')
x1 = sp.Symbol('x1')
x2 = sp.Symbol('x2')
x3 = sp.Symbol('x3')
# h = sp.Symbol('h')
# g = sp.Symbol('g')
# c = sp.Symbol('c')
# 定义常数-
l1 = 600
l3 = 590
d = 65
e = 103.71
f = 29.27
g = 76.15
c = 77.15
h = 32.26
b = 90.79
a = 91.79
# 定义矩阵A
matrix_a =
[[-2*x1, 1, 0, 1, 1],
[-2*x1, 1, 2*(g-c), 1, 1],
[2*(e-x2), 1, -2*(b+c+f), 1, 1],
[2*(d+e-x2-a), 1, -2*(b+c+f), 1, 1],
[2*(d+2*e+h-x3), 1, 2*(g-c), 1, 1],
[2*(d+2*e+h-x3), 1, 0, 1, 1]]
# 定义矩阵L
matrix_l =
[[l1**2 - x1**2],
[l2**2 - x1**2 - (g-c)**2],
[l3**2 - (e-x2**2) - (b+c+f)**2],
[l4**2 - (d+e-x2-a)**2],
[l5**2 - (d+2*e+h-x3)**2],
[l6**2 - (d+2*e+h-x3)**2]]
# 转化为符号矩阵A , L
A = sp.Matrix(matrix_a)
L = sp.Matrix(matrix_l)
# 计算A.T * A (叉乘)
sol = sp.Matrix(A.T * A)
# 由于det为0,故无法算出sol 的逆
sol_inv = sp.Inverse(sol)
print(sp.det(A.T * A))
# 定义一个临时矩阵 M 3*2
tmp_M = sp.Matrix(
[[1, 2]
[2, 3],
[3, 4]])
# 定义一个临时矩阵 tmpA 6*5
tmp_A =
[
[1, 1, 0, 1, 1],[1, 1, 2, 1, 1],[1, 1, 3, 1, 1],
[8, 1, 6, 1, 1],[1, 1, 1, 1, 1],[2, 1, 0, 1, 1]
]
tmp_A = sp.Matrix(tmp_A) # 转化为符号矩阵
# S = tmp_M * sp.Matrix([2, 3])
print(tmp_M.shape)
print(tmp_A.shape)
# print(sp.Inverse(tmp_M)) # 同样由于3*2 矩阵不是方阵,不能求逆
# print(sp.det(tmp_M)) # 计算矩阵M的行列式 (虽然算不出)
# 计算矩阵A的最小二乘解,提示矩阵A为非奇异矩阵,无法算出 ??
# least_square_ans = tmp_A.solve_least_squares(sp.Matrix([8, 14, 18, 11, 10, 8]))
# 计算矩阵M的最小二乘解 ?? 为什么这里可以算出, M也是一个非奇异矩阵
least_square_ans = tmp_M.solve_least_squares(sp.Matrix([8, 14, 18]))
print(least_square_ans.shape)
期待的结果
期望算出A
的最小二乘解,但是由于A
是一个非奇异矩阵,无法计算,不明白的地方在于M
也是一个非奇异矩阵,却可以算出其最小二乘解为
Matrix([
[ 5/3],
[10/3]])