В NumPy 1.12 есть проверка для перехвата нескалярных шагов, но NumPy 1.11, на которой вы работаете, не замечает входные значения массива и молча делает неправильные вещи, пытаясь рассматривать массив как шаг.
я работаю над некоторыми числовыми вычислениями. Я рассчитал около 100 000 точек функции (return_times
) только вычислимо численно, и теперь хочу взять его производным с помощьюnumpy.gradient
, Насколько я понимаю (доктор), для f (x) я могу привести следующие аргументы:numpy.gradient(arr_of_fx_datapoints, arr_of_their_x_values)
заставить это работать. И это то, что я (намеревался) сделать.
За исключением того, что это не работает. Результат почти (но не совсем) ноль везде. Ошибка воспроизведена в этом резюме моего кода ниже (sin ^ 2 (x) имеет форму, аналогичную моей исходной функции):
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()
Если я печатаюgd
, это показывает, что это действительно не является нулевым
[ inf 6.28318530e-05 6.28318529e-05 ..., -1.25666419e-09
-6.28326813e-10 -3.14161265e-10]
Итак: что я пропустил? Каков окончательный правильный путь для числового деривации в Python?
Среда: ОС Linux Mint 18.2, редактор Geany, NumPy 1.11.0.