为了账号安全,请及时绑定邮箱和手机立即绑定

下确定系统解决方案python

下确定系统解决方案python

MYYA 2021-11-16 16:20:13
目标: 从欠定线性系统 (2x3) Ax = b 计算向量第三个方程应该是统一方程 (x^2 + y^2 + z^2 = 1)。我有正确的矩阵系数,但无法得到正确的结果;尝试以这种方式求解Ax = b:函数返回运算符的空空间。然后我正在设置矩阵并试图解决它。from scipy.linalg import qr, null_space, svdfrom scipy import transpose, compressdef 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 vh0normal_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 vectorob = np.sign(np.linalg.det([x_k, x_k1, normal_vec])) # normal vector of vertex vh1 that I want to get solving the systemnormal_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 systemA = 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)))] *= obprint("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 >, <> - 标量乘法据我所知 ,两个方程设置了一条线,归一化给出了一个统一的球体。所以我的解决方案是线和统一球的交叉点。但是,也无法理解如何获得这两种解决方案。
查看完整描述

2 回答

?
白衣非少年

TA贡献1155条经验 获得超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 个向量)。


查看完整回答
反对 回复 2021-11-16
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

尝试使用伪逆 np.linalg.pinv 函数:https ://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.linalg.pinv.html


查看完整回答
反对 回复 2021-11-16
  • 2 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信