Даны точки данных в x, y-пространстве. Я знаю, что кривая y (x) является нарушенным степенным законом. Существует ли в python быстрый алгоритм, который может возвращать функцию, которая представляет собой интерполяцию точек посредством кусочно-степенных законов в каждом интервале?
Аналогичная задача решается в PiecewisePowerlaw CosmoloPy (http://pydoc.net/CosmoloPy/0.1.103/cosmolopy.utils/). Однако здесь должны быть даны степенные индексы, в то время как в моем случае дано значение y, соответствующее каждому значению x.
import numpy as np
import pylab as pl
from scipy.interpolate import interp1d
from scipy.interpolate import UnivariateSpline
xData = [3.8e+1,4.2e+2,4.6e+3,5.0e+4,5.5e+5,6.0e+6] # Example data
yData = [1.6e+6,3.3e+5,6.6e+4,1.3e+4,1.8e+3,1.5e+2] # Example data
X = np.logspace(np.log10(xData[0]),np.log10(xData[-1]),200)
Попробуйте линейную и сплайн-интерполяцию с помощью interp1d:
pl.figure(num="Interpolation via interp1d")
for Kind in ['linear', 'quadratic', 'cubic']:
Interpolation = interp1d(xData, yData, kind=Kind, bounds_error=False, fill_value=0.0) # Try an interpolation...
pl.loglog(X,Interpolation(X)) # ...and look at it.
Очевидно, что сплайн-интерполяция дает совершенно плохие результаты, и линейная интерполяция также не идеальна. Попробуйте линейную и сплайн-интерполяцию с UnivariateSpline
pl.figure(num="Interpolation via UnivariateSpline")
for Degree in [1,2,3,4]: # Try another interpolation routine. with four different degrees of the spline...
for SmoothFact in [6,8]: # ...and with two different smoothing factors.
AnotherInterpolation = UnivariateSpline(xData, yData, k=Degree, s=SmoothFact) # Interpolate and...
pl.loglog(X,AnotherInterpolation(X)) # ...and look at it.
И поймите, что интерполяция не лучше, чемс interp1d.
На что я нацеливаюсь, это просто кусочно-степенная интерполяция xData
и yData
. В идеале, интерполятор должен быть настроен так, чтобы он принимал xData
и yData
каквходные аргументы и возвращает функцию, которая может преобразовывать значения x в y в соответствии сТерполяция.
Конечно, можно самостоятельно адаптировать интерполятор. Однако, чтобы избежать повторного изобретения колеса, я хотел бы знать, существует ли уже такой алгоритм интерполяции, реализованный в некотором пакете python.