Почему выходные данные linspace и interp1d всегда одинаковы? - PullRequest
0 голосов
/ 08 сентября 2018

Итак, я выполнял свое задание, и мы должны использовать интерполяцию (линейную интерполяцию) для того же. Нас попросили использовать пакет interp1d из scipy.interpolate и использовать его для генерации новых значений y с учетом новых значений x и старых координат (x1,y1) и (x2,y2).
Чтобы получить новые x координаты (давайте назовем это x_new), я использовал np.linspace между (x1,x2) и новыми y координатами (давайте назовем это y_new), которые я обнаружил, используя функцию interp1d на x_new.

Однако я также заметил, что применение np.linspace к (y1,y2) генерирует точно такие же значения y_new, которые мы получили из interp1d на x_new.

Может кто-нибудь объяснить мне, почему это так? И если это правда, всегда ли это правда?
И если это всегда так, зачем вообще нужно использовать функцию interp1d, когда мы можем использовать np.linspace вместо нее?

Вот код, который я написал:

import scipy.interpolate as ip
import numpy as np

x = [-1.5, 2.23]
y = [0.1, -11]

x_new = np.linspace(start=x[0], stop=x[-1], num=10)
print(x_new)

y_new = np.linspace(start=y[0], stop=y[-1], num=10)
print(y_new)

f = ip.interp1d(x, y)
y_new2 = f(x_new)
print(y_new2)  # y_new2 values always the same as y_new

1 Ответ

0 голосов
/ 08 сентября 2018

Причина, по которой вы наткнулись на это, заключается в том, что вы используете только две точки для интерполяции линейной функции. У вас есть два различных значения x с соответствующими значениями y. Затем вы просите interp1d найти линейную функцию f(x)=m*x +b, которая наилучшим образом соответствует вашим входным данным. Поскольку у вас есть только две точки в качестве входных данных, существует точное решение, потому что линейная функция точно определена двумя точками. Чтобы увидеть это: возьмите лист бумаги, нарисуйте две точки и подумайте, сколько прямых линий вы можете нарисовать, чтобы соединить эти точки.

Линейная функция, которую вы получаете из двух входных точек, определяется параметрами m=(y1-y2)/(x1-x2) и b=y1-m*x1, где (x1,y1),(x2,y2) - ваши две входные точки (или элементы в ваших массивах x и y в вашем фрагмент кода.

Итак, что же делает np.linspace(start, stop, num,...)? Это дает вам num равномерно распределенных точек между start и stop. Эти точки start, start + delta, ..., end. Ширина шага delta задается как delta=(end-start)/(num - 1). -1 происходит от того, что вы хотите включить свою конечную точку. Таким образом, n -ая точка в вашем интервале будет лежать на xn=x1+n*(x2-x1)/(num-1). При каких значениях y эти точки окажутся в итоге после того, как мы применим нашу линейную функцию из interp1d? Позволяет подключить его:

f(xn)=m*xn+b=(y1-y2)/(x1-x2)*(x1+n/(num-1)*(x2-x1)) + y1-(y1-y1)/(x1-x2)*x1. Упрощение этого приводит к f(xn)=(y2-y1)*n/(num - 1) + y1. И это именно то, что вы получаете от np.linspace(y1,y2,num), т.е. f(xn)=yn!

Теперь, это всегда работает? Нет! Мы использовали тот факт, что наша линейная функция определяется двумя конечными точками интервалов, которые мы используем в np.linspace. Так что это не будет работать в целом. Попробуйте добавить еще одно значение x и еще одно значение y в свой список ввода, а затем сравните результаты.

...