从梯度重建曲线

时间:2017-09-02 00:28:27

标签: python numpy math numerical-methods

假设我有一条曲线,然后使用np.gradient通过有限差分估计其梯度。给定初始点x [0]和梯度向量,如何重建原始曲线?在数学上我看到了这个方程组的可能性,但我不确定如何以编程方式进行。

以下是我的问题的一个简单示例,其中我有sin(x)并计算与cos(x)匹配的数值差异。

test = np.vectorize(np.sin)(x)
numerical_grad = np.gradient(test, 30./100)
analytical_grad = np.vectorize(np.cos)(x)

## Plot data.
ax.plot(test, label='data', marker='o')
ax.plot(numerical_grad, label='gradient')
ax.plot(analytical_grad, label='proof', alpha=0.5)
ax.legend();

Sine and its gradient.

2 个答案:

答案 0 :(得分:0)

您可以使用集成恢复初始曲线。

作为生命示例:如果你有1D移动的位置功能,你可以获得速度函数作为导数(渐变)

 v(t) = s(t)' = ds / dt

有了速度,你可以获得位置(并非所有函数都是可分解的 - 在这种情况下使用数值积分),并且添加了一些未知的常数(移位) - 并且初始位置可以恢复精确值

s(T) = Integral[from 0 to T](v(t)dt) + s(0)

答案 1 :(得分:0)

我通过使用numpy的trapz函数(梯形规则集成)找到了如何做到这一点。

跟进我在问题上提出的代码,为了重现输入数组test,我们做了:

x = np.linspace(1, 30, 100)
integral = list()
for t in range(len(x)):
    integral.append(test[0] + np.trapz(numerical_grad[:t+1], x[:t+1]))

然后,积分数组包含数值积分的结果。