我有4个点,非常接近于一个平面,这是1,4-二氢吡啶循环。
我需要计算C3和N1到平面的距离,这个平面是由C1-C2-C4-C5组成的。 计算距离是可以的,但拟合平面对我来说是相当困难的。
1,4-DHP循环http://i.stack.imgur.com/dhNDo.png
1,4-DHP循环,另一个视图http://i.stack.imgur.com/6Xs0z.png
from array import *
from numpy import *
from scipy import *
# coordinates (XYZ) of C1, C2, C4 and C5
x = [0.274791784, -1.001679346, -1.851320839, 0.365840754]
y = [-1.155674199, -1.215133985, 0.053119249, 1.162878076]
z = [1.216239624, 0.764265677, 0.956099579, 1.198231236]
# plane equation Ax + By + Cz = D
# non-fitted plane
abcd = [0.506645455682, -0.185724560275, -1.43998120646, 1.37626378129]
# creating distance variable
distance = zeros(4, float)
# calculating distance from point to plane
for i in range(4):
distance[i] = (x[i]*abcd[0]+y[i]*abcd[1]+z[i]*abcd[2]+abcd[3])/sqrt(abcd[0]**2 + abcd[1]**2 + abcd[2]**2)
print distance
# calculating squares
squares = distance**2
print squares
如何使和(平方)最小化?我试过最小二乘法,但我也试过。
听起来不错,但是你应该用奇异值分解来代替非线性优化。下面创建转动惯量张量M,然后SVD得到平面的法向。这应该是一个接近最小二乘法的拟合,而且速度更快,更容易预测。它返回点云中心和法线。
例如:在(10100)处构建一个二维云,该云在x方向上很薄,在y方向上大100倍:
拟合平面非常接近于(10100),法线非常接近于x轴。
你适合一架飞机这一事实在这里只是有点关系。你要做的是从猜测开始最小化一个特殊的函数。为此,
scipy.optimize
。注意,不能保证这是全局最优的解决方案,只能保证局部最优的解决方案。一个不同的初始条件可能会收敛到不同的结果,如果你开始接近你正在寻找的局部极小值,这个效果很好。我冒昧地利用努比的广播来清理你的代码:
这就提供了:
最小二乘法应该很容易适应一个平面。一个平面的方程是:ax+by+c=z。所以用所有数据建立这样的矩阵:
以及
以及
换句话说:Ax=B,现在求x的系数。但由于你有3个以上的点,系统被过度确定,所以你需要使用左伪逆。所以答案是:
下面是一些简单的Python代码和一个例子:
你的观点的解决方案是:
相关问题 更多 >
编程相关推荐