29 lines
858 B
Python
29 lines
858 B
Python
|
import numpy as np
|
||
|
|
||
|
|
||
|
def make_continuous_copy(alpha):
|
||
|
alpha = (alpha + np.pi) % (2.0 * np.pi) - np.pi
|
||
|
continuous_x = np.zeros_like(alpha)
|
||
|
continuous_x[0] = alpha[0]
|
||
|
for i in range(1, len(alpha)):
|
||
|
if not (np.sign(alpha[i]) == np.sign(alpha[i - 1])) and np.abs(alpha[i]) > np.pi / 2:
|
||
|
continuous_x[i] = continuous_x[i - 1] + (
|
||
|
alpha[i] - alpha[i - 1]) - np.sign(
|
||
|
(alpha[i] - alpha[i - 1])) * 2 * np.pi
|
||
|
else:
|
||
|
continuous_x[i] = continuous_x[i - 1] + (alpha[i] - alpha[i - 1])
|
||
|
|
||
|
return continuous_x
|
||
|
|
||
|
|
||
|
def derivative_of(x, dt=1, radian=False):
|
||
|
if radian:
|
||
|
x = make_continuous_copy(x)
|
||
|
|
||
|
if x[~np.isnan(x)].shape[-1] < 2:
|
||
|
return np.zeros_like(x)
|
||
|
|
||
|
dx = np.full_like(x, np.nan)
|
||
|
dx[~np.isnan(x)] = np.gradient(x[~np.isnan(x)], dt)
|
||
|
|
||
|
return dx
|