2013-11-18 1 views
1

интерполировать мои данные, которые я в настоящее время использовать эту функцию:Интерполяция по логарифмической шкале в питона

def myinterp(x, y, der = 0, s = 0): 
    tck = interpolate.splrep(x, y, s = sigma) 
    xnew = np.arange(x[0], x[-1], (x[-1]-x[0])/x.size) 
    ynew = interpolate.splev(xnew, tck, der = n) 
    return xnew, ynew 

xnew эквивалентно x на повторно создается регулярной сетке с dx=(x[-1]-x[0])/x.size. Как сделать то же самое, но с повторной выборкой x по логарифмической шкале?

+3

Как насчет преобразования значений в логарифмическое пространство, линейно интерполировать их и затем преобразовывать обратно? – starrify

ответ

1

Вы можете просто взять логарифм, что линейно частоты дискретизации, а затем взять показатель его:

xnew = np.exp(np.arange(log(x[0]), log(x[-1]), log(x[-1]/x[0])/x.size)) 

, который может оказаться весьма дорогостоящим из-за повторного вызова Exp. Более эффективный, но немного более громоздким способом было бы использовать тот факт, что на логарифмической шкале существует постоянный множитель между последующими элементами:

f = pow(x[-1]/x[0], 1.0/(x.size-1)) 
xnew[0] = x[0] 
for i in range(1,x.size): 
    xnew[i] = xnew[i-1] * f 

Edit: Ваш вопрос говорит йх = (х [-1] -x [0])/x.size который выглядит странно для меня, если вы хотите, чтобы представлять один и тот же диапазон, используя один и тот же размер массива вам нужно

dx=(x[-1]-x[0])/(x.size-1) 

То же самое относится и к моему ответу.