我想计算超定义平面(>;3个点)的梯度(方向和大小),例如四个x、y、z坐标:
[0, 0, 1], [1, 0, 0], [0, 1, 1], [1, 1, 0]
我计算梯度的代码如下所示(使用this post的奇异值分解,修改):
import numpy as np
def regr(X):
y = np.average(X, axis=0)
Xm = X - y
cov = (1./X.shape[0])*np.matmul(Xm.T,Xm) # Covariance
u, s, v = np.linalg.svd(cov) # Singular Value Decomposition
return u[:,1]
然而,结果我得到:
[0, 1, 0]
它既不代表梯度也不代表法向量。结果应该如下所示:
[sqrt(2)/2, 0, -sqrt(2)/2]
知道为什么我得到了一个错误的向量吗
您可以使用函数numpy.gradient来实现这一点。下面是它的一些工作原理
简言之:
方向导数将是梯度与方向(单位归一化)向量的点积
一个更简单的解决方案是使用numdifftools,特别是便利函数directionaldiff。 例如here。如果你看一下source code,你可以看到与上面提到的数学的关系
相关问题 更多 >
编程相关推荐