Дифференциация Python с использованием numpy, не создающая ожидаемого результата

87
10

Итак, я работаю над некоторыми численными вычислениями. Я вычислил около 100 000 точек функции (return_times) только вычислительно численно, и теперь хочу, чтобы она была получена с использованием numpy.gradient. Насколько я понимаю (doc), для 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?


Enviroment: Linux Mint 18.2 OS, редактор Geany, NumPy 1.11.0.

спросил(а) 2021-01-28T01:22:10+03:00 2 месяца, 2 недели назад
1
Решение
106

Документы не упоминают об этом, но поддержка координатного массива очень новая, NumPy 1.13. В предыдущих версиях NumPy вы можете указать только фиксированное значение скалярного шага для каждого измерения.

В NumPy 1.12 есть проверка, чтобы поймать нескалярные шаги, но NumPy 1.11, на котором вы находитесь, не замечает входной сигнал с массивом и молча делает неправильную вещь, пытаясь рассматривать массив как шаг.

ответил(а) 2021-01-28T01:22:10+03:00 2 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема