2017-09-02 51 views
0

假设我有一条曲线,然后通过使用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.

+0

查看三次样条曲线(以及其他平滑曲线插值方法),除非您希望曲线具有特定的功能形式。 – barrycarter

回答

0

我发现如何做到这一点,通过使用numpy的的trapz功能(trape精确值zoidal规则集成)。

对我提出的问题的代码跟进,重现输入数组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])) 

整体阵列则包含数值积分的结果。

+0

这是非常低效的,因为'trapz'会在每次调用时重新从头开始累计,而增量计算是可能的。 –

+0

对于这样一个平滑的函数,辛普森的规则应该会给出更好的准确性。 –

0

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

随着生活例如:如果你有用于位置功能1D移动,就可以得到功能速度作为衍生物(梯度)

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

并且具有速度,则可以潜在地获得位置(不是所有的功能都积分析 - 在这种情况下,数值积分使用),还有一些未知的常数(移)加入 - 与初始位置就可以恢复

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