【问题标题】:Reconstructing curve from gradient从梯度重建曲线
【发布时间】:2017-09-02 00:28:26
【问题描述】:

假设我有一条曲线,然后我使用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();

【问题讨论】:

  • 查看三次样条曲线(和其他平滑曲线插值方法),除非您希望曲线具有特定的函数形式。

标签: python numpy math numerical-methods


【解决方案1】:

我通过使用 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]))

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

【讨论】:

  • 这非常低效,因为trapz 将在每次调用时从头开始重做累积,而增量计算是可能的。
  • 对于这样一个平滑的函数,辛普森规则应该会提供更好的准确性。
【解决方案2】:

您可以使用积分恢复初始曲线。

作为生活例子:如果你有一维移动的位置函数,你可以得到作为导数(梯度)的速度函数

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多