Причина, по которой вы наткнулись на это, заключается в том, что вы используете только две точки для интерполяции линейной функции. У вас есть два различных значения 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
в свой список ввода, а затем сравните результаты.