Есть ли кусочно-степенная интерполяция? - PullRequest
0 голосов
/ 06 ноября 2019

Даны точки данных в 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.

...