Diferenciação Python usando numpy não produzindo a saída esperada

Então, eu estou trabalhando em alguma computação numérica. Eu calculei cerca de 100.000 pontos de uma função (return_times) apenas computável numericamente e agora deseja obter seu derivado usandonumpy.gradient. Como eu entendo (doc), para um f (x), posso fornecer os seguintes argumentos:numpy.gradient(arr_of_fx_datapoints, arr_of_their_x_values) para fazer funcionar. E é isso que eu pretendo fazer.

Exceto que isso não funciona. O resultado é quase (mas não exatamente) zero em todos os lugares. O bug é reproduzido por este resumo do meu código abaixo (sin ^ 2 (x) tem uma forma semelhante à minha função original):

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

O resultado é decepcionante:

Se eu imprimirgd, mostra que de fato não é zero zero:

[             inf   6.28318530e-05   6.28318529e-05 ...,  -1.25666419e-09
  -6.28326813e-10  -3.14161265e-10]

Então ... o que eu perdi? Qual é a melhor maneira correta de derivar numericamente em Python?

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

questionAnswers(1)

yourAnswerToTheQuestion