从梯度重建曲线
Reconstructing curve from gradient
假设我有一条曲线,然后我使用 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();
您可以使用积分恢复初始曲线。
举个例子:如果你有用于一维移动的位置函数,你可以获得作为导数(梯度)的速度函数
v(t) = s(t)' = ds / dt
并且有了速度,您可以获得位置(并非所有函数都可以分析积分 - 在这种情况下使用数值积分)并添加一些未知常数(移位) - 并且您可以使用初始位置恢复精确值
s(T) = Integral[from 0 to T](v(t)dt) + s(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]))
积分数组包含数值积分的结果。
假设我有一条曲线,然后我使用 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();
您可以使用积分恢复初始曲线。
举个例子:如果你有用于一维移动的位置函数,你可以获得作为导数(梯度)的速度函数
v(t) = s(t)' = ds / dt
并且有了速度,您可以获得位置(并非所有函数都可以分析积分 - 在这种情况下使用数值积分)并添加一些未知常数(移位) - 并且您可以使用初始位置恢复精确值
s(T) = Integral[from 0 to T](v(t)dt) + s(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]))
积分数组包含数值积分的结果。