非奇异矩阵的最小二乘解

问题描述

尝试计算非线性方程的最小二乘解,但是提示矩阵为非奇异矩阵,无法算出,可是官方文档给出的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]])
阅读 2.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题