Search code examples
pythonnumpymathnumerical-methods

Reconstructing curve from gradient


Suppose I have a curve, and then I estimate its gradient via finite differences by using np.gradient. Given an initial point x[0] and the gradient vector, how can I reconstruct the original curve? Mathematically I see its possible given this system of equations, but I'm not certain how to do it programmatically.

Here is a simple example of my problem, where I have sin(x) and I compute the numerical difference, which matches 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.


Solution

  • I found how to do it, by using numpy's trapz function (trapezoidal rule integration).

    Following up on the code I presented on the question, to reproduce the input array test, we do:

    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]))
    

    The integral array then contains the results of the numerical integration.