目标:
根据确定的线性系统(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 = <向量,法线向量>,<>-标量乘法
据我所知,两个方程式确定一条线,而归一化则给出一个统一的球面。所以我的解决方案是交叉线和统一球体。但是,也无法理解如何获得两种解决方案。
答案 0 :(得分:0)
尝试使用伪逆np.linalg.pinv函数:https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.linalg.pinv.html
答案 1 :(得分: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个向量)。