计算超定平面的梯度

2024-03-28 14:56:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想计算超定义平面(>;3个点)的梯度(方向和大小),例如四个x、y、z坐标:

[0, 0, 1], [1, 0, 0], [0, 1, 1], [1, 1, 0]

enter image description here

我计算梯度的代码如下所示(使用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]

知道为什么我得到了一个错误的向量吗


Tags: 代码importgt定义np代表sqrtthis
1条回答
网友
1楼 · 发布于 2024-03-28 14:56:33

您可以使用函数numpy.gradient来实现这一点。下面是它的一些工作原理

简言之:

方向导数将是梯度与方向(单位归一化)向量的点积

一个更简单的解决方案是使用numdifftools,特别是便利函数directionaldiff。 例如here。如果你看一下source code,你可以看到与上面提到的数学的关系

相关问题 更多 >