Я использую функцию InterpolatedUnivariateSpline из библиотеки scipy.interpolate. Я знаю, что существует функция, оценивающая производную полученного сплайна. Что меня интересует, так это производная журнала сплайна. Есть ли способ рассчитать это напрямую?
Да. Не знаю, почему я так не думал. Во всяком случае, остается вопрос, можно ли определить функцию, зависящую от сплайна, которую можно дифференцировать с помощью python (аналитически)? Я думаю, что это относится к сплайнам, поскольку полиномиальные функции легко дифференцируются аналитически.
Можно взять сплайн журнала ваших данных. Тогда производная доступна напрямую.
Да, но это не то же самое, поскольку он должен использовать правило цепочки, как указано выше.






Предложение FlyingTeller, вероятно, оптимален: производная log (f) - это f'/f, который достаточно легко реализовать:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import InterpolatedUnivariateSpline
x = np.arange(1, 9)
y = np.sqrt(x) # something to use as y-values
spl = InterpolatedUnivariateSpline(x, y)
logder = lambda x: spl.derivative()(x)/spl(x) # derivative of log of spline
t = np.linspace(x.min(), x.max())
plt.plot(t, logder(t))
plt.show()
Построение сплайна на основе логарифма данных также является разумным подходом, но это не то же самое, что логарифм исходного сплайна.
if you can define a function, depending on a spline, which can be differentiated by python (analytically)
Аналитическая дифференциация произвольной функции выходит за рамки SciPy. В приведенном выше примере я должен был знать, что производным log(x) является 1/x; SciPy этого не знает. SymPy - это библиотека для символьных математических операций, таких как производные.
Можно использовать SymPy, чтобы найти производную функции символически, а затем превратить ее с помощью lambdify в вызываемую функцию, которую могут использовать SciPy, matplotlib и т. д.
Также можно работать со сплайнами в полностью символический путь с помощью SymPy, но это медленно.
Можно ли было бы написать его самостоятельно, используя цепное правило?