在确定的系统解决方案python下

问题描述 投票:0回答:2

目标:根据确定的线性系统计算向量(2x3)Ax = b 第三个等式应该是单位方程(x ^ 2 + y ^ 2 + z ^ 2 = 1)。我有正确的矩阵系数,但无法得到正确的结果;试图以这种方式解决Ax = b:

函数返回运算符的空间。然后我设置矩阵并尝试解决它。

from scipy.linalg import qr, null_space, svd
from scipy import transpose, compress

def null(A, eps=1e-17):
    u, s, vh = svd(A)
    padding = max(0,np.shape(A)[1]-np.shape(s)[0])
    null_mask = np.concatenate(((s <= eps), np.ones((padding,),dtype=bool)),axis=0)
    null_space = compress(null_mask, vh, axis=0)
    return transpose(null_space)

我们有3个顶点设置一个三角形:

vh0 = [0., -1., 0.]
vh1 = [-0.03806, -0.98078501, -0.191341]
vh2 = [-0.074658, -0.98078501, -0.18024001]

# normal vector of vh0
normal_vec = [ 0., -0.23760592, 0.]

cap_vec10 = np.subtract(vh1, vh0)
cap_vec20 = np.subtract(vh2, vh0)

a1 = np.array(np.subtract(cap_vec20, cap_vec10))
a2 = np.array(np.dot(-1, capvec10))

# orientation bit of the normal vector
ob = np.sign(np.linalg.det([x_k, x_k1, normal_vec])) 

# normal vector of vertex vh1 that I want to get solving the system
normal_vec1 = [-0.04744975, -0.97674069, -0.209108]

Lm   = np.dot(np.subtract(vh2, vh1), normal_vec1) 
Lm_1 = np.dot(np.subtract(vh0, vh1), normal_vec1) 

# solving under determined system
A = np.array([a1, a2]) 
b = np.array([Lm, Lm_1])
x_lstsq = np.linalg.lstsq(A, b)[0]
wanted_norm = np.sqrt(abs(1 - (np.linalg.norm(x_lstsq)*np.linalg.norm(x_lstsq))))

Z = null(A)*wanted_norm 
new_normal_vec = np.add(Z[:, 0], x_lstsq)

if np.sign(np.linalg.det([x_k, x_k1, Z[:, 0]])) != ob:
    new_normal_vec[list(np.abs(x_lstsq)).index(min(np.abs(x_lstsq)))] *= ob

print("should_be:   {}\ncounted_nv:  {}".format(np.round(normal_vec1, 3), np.round(new_normal_vec, 3)))

normal_vec1是我需要的向量。并且对于两个向量Z * vector == 1。 代码中的系数:L_m = <vector,normal_vector>,<> - 标量乘法 据我所知,两个方程式设置了一条线,标准化给出了一个统一的球体。所以我的解决方案是跨越线点和统一球。但是,也无法理解如何获得两种解决方案。

python math linear-algebra
2个回答
0
投票

0
投票

目标是:基本上解决线性欠定系统2x3,其约束条件是结果向量应该被归一化。 我做了什么给出了一个解决方案(因为在3D空间中有0到2个向量):

1.计算最小二乘解:

x_lstsq = np.linalg.lstsq(A, b)[0]

2.计算零空间(运算符A的内核)

wanted_norm = np.sqrt(abs(1 - (np.linalg.norm(x_lstsq)*np.linalg.norm(x_lstsq))))
Z = null(A)*wanted_norm 

3.计算合成矢量

result = np.add(Z[:, 0], x_lstsq)

通过这种方式,我得到的两个向量中的一个对我的项目不正确,但对于这个特定的线性系统是正确的。所以我的问题是:如何让第二个执行相同的步骤(通过无效空间)。

在找到解决方案的过程中,我实现了另一个:基本上用手归化解决这个线性系统,使用归一化方程作为第三个方程。几何上前两个方程都设置了两个平面。这些平面的交叉给出了一条线。这样的等式:x ^ 2 + y ^ 2 + z ^ 2 = 1设置单位球。因此,穿过这条线和这个球体给了我们两点。因此,求解其中一个坐标的平方方程可以形成0到2个根(从0到2个向量)。

© www.soinside.com 2019 - 2024. All rights reserved.