Neinstein - 1 month ago 19

Python Question

So, I am working on some numerical computation. I have calculated some 100,000 points of a function (

`return_times`

`numpy.gradient`

`numpy.gradient(arr_of_fx_datapoints, arr_of_their_x_values)`

Except that it doesn't work. The result is almost (but not exactly) zero everywhere. The bug is reproduced by this abstract of my code below (sin^2(x) has a shape alike to my original function):

`import matplotlib.pyplot as plt`

import numpy as np

def find_times(t_arr):

return np.power(np.sin(t_arr), 2)

t_0 = 0

t_max = np.pi-1E-10

datapoints = 100000

dt = (t_max - t_0) / datapoints

t_points = np.arange(t_0, t_max, dt, dtype=np.float64)

return_times = find_times(t_points)

gd = np.gradient(return_times, t_points)

plt.plot(t_points, gd)

plt.plot(t_points, return_times)

plt.show()

The result is disappointing:

If I print

`gd`

`[ inf 6.28318530e-05 6.28318529e-05 ..., -1.25666419e-09`

-6.28326813e-10 -3.14161265e-10]

So: What did I miss? What is the Ultimate Proper Way to numerically derivate in Python?

Enviroment: Linux Mint 18.2 OS, Geany editor, NumPy 1.11.0.

Answer Source

The docs don't mention it, but coordinate array support is very new, NumPy 1.13. In previous NumPy versions, you can only specify a fixed scalar step value for each dimension.

NumPy 1.12 has a check to catch non-scalar steps, but NumPy 1.11, which you're on, doesn't notice the array-valued input and silently does the wrong thing by trying to treat the array as a step.