在python中沿着轴平移向量,使向量长度增加

fiei3ece  于 2023-06-07  发布在  Python
关注(0)|答案(1)|浏览(172)

我面临着一个与化学(物质和建模)有关的问题,但基于线性代数和Python。所以我在这里问。
我有两个分子A和B的xyz坐标(为了清楚起见,我去掉了原子数)。

A=[[-3.046233, -5.4e-05, 0.182027], [-2.084295, 5.1e-05, 0.033334], [-3.450141, 0.000367, -0.693385]]
B=[[2.911769, 4.4e-05, -0.165016], [3.305155, 0.771695, 0.262288], [3.305, -0.772028, 0.261672]]

我能计算出A和B两点之间的距离。A 1和B[0]之间的距离为4.99单位。问题是我需要固定A的位置,但移动B,这样距离就增加到6,7,8个单位,沿着A 1-B[0]轴。我知道这是在平移一个向量,但我不知道平移向量。任何帮助来解决这个问题吗?
编辑1:(跟随@Caridorc评论)问题是沿着2-4线拖动原子4,5,6,使得只有2和4之间的距离增加。但是4-5和4-6的距离保持固定。

nhaq1z21

nhaq1z211#

(我不确定你希望结果是什么样的,但这里是你如何将A从B中平移出来,使得A1和B0正好是6个单位,并且它们的方向保持不变。
我喜欢用numpy来解决很多数值线性代数问题:

import numpy as np

# A and B have row vectors which are the positions of the points.
A=np.array([[-3.046233, -5.4e-05, 0.182027], [-2.084295, 5.1e-05, 0.033334], [-3.450141, 0.000367, -0.693385]])
B=np.array([[2.911769, 4.4e-05, -0.165016], [3.305155, 0.771695, 0.262288], [3.305, -0.772028, 0.261672]])

# The length of A1->B0 is 4.99 as you've mentioned:
A1B0_length = np.linalg.norm((A[1]-B[0]))

# Taking the unit direction vector B[0] -> A[1] by normalizing
drx_vec = A[1] - B[0]
drx_vec = drx_vec / np.linalg.norm(drx_vec)

# Choose the final length you want B[0]->A[1], then translate everything:
# Here I use 6 as an example,
translate_vec = drx_vec * 6
A_new = A + translate_vec

这将沿着A1B[0]轴移动A中的所有点,使它们之间的距离为6。如果你想改变方向,你可以平移A,使枢轴点在原点,转置A,使位置是A^T的列,然后乘以左边的旋转矩阵(见旋转矩阵),转置它,然后将它平移回原来的位置。

相关问题