2016-01-21 5 views
1

Я хочу рассчитать точки пересечения между линией и интерполяционной функцией. Я могу построить интерполяцию, а линию на рисунке:Вычислить пересечение между линией и интерполяцией

import matplotlib.pyplot as plt 
import numpy as np 
import scipy.interpolate as scp 

y = [ 815.97, 815.95, 815.98, ..., 815.9] #60 elements 
x = [405383892, 405383894, 405383895, ..., 405383896] #60 elements 

mediana = np.median(x) 
f = scp.interp1d(x,y,bounds_error=False,fill_value=0.,kind='cubic') 
new_x_array = np.arange(min(x),max(x),0.01) 
plt.figure()  
plt.plot(new_x_array,f(new_x_array),'r-') 
plt.plot([x[0],x[59]], [mediana,mediana], 'g-') 
plt.plot(x, y, 'mo') 

Figure

Но я не нашел способ вычисления пересечений точек между красной функцией и зеленой линией. Каков обычный способ найти пересечение между ними?

ответ

2

interp1d выполняет сплайн-интерполяцию между вашими точками данных. Насколько я знаю, в scipy нет метода, который дает вам все корни в домене для этой интерполяции, но поскольку его сплайн-интерполяция позволяет решить эту проблему.

Вы можете сделать следующее.

  1. Восстановить полиномы сплайнов на каждом поддомене с помощью splev и друзей, поэтому у вас есть коэффициенты сплайна ==> коэффициенты полиномов.
  2. С полиномами на каждом поддомене вы можете переформулировать свою проблему как пересечение полинома 2-го порядка (или того, какой порядок вы выбрали для интерполяции) на каждом поддомене и использовать для этого стандартный корневой искатель (или использовать аналитическое решение).
  3. Проверьте, находятся ли корни внутри поддомена. Если да, вы нашли пересечение.

Так что для низкого сплайн-ордера это должно быть прямолинейным.

1

Спасибо за ответ! Я буду использовать это решение в будущем. Наконец я решил, что ищет для значений близких к интерполяции линии:

index=[] 
for pos in range(0,len(new_x_array)-1): 
    if (mediana > f(new_x_array[pos])) & (mediana < f(new_x_array[pos+1])): 
     index.append(new_x_array[pos]) 
    if (mediana < f(new_x_array[pos])) & (mediana > f(new_x_array[pos+1])): 
     index.append(new_x_array[pos]) 

Массив индекса занимает позицию, близкую к линии.

Смежные вопросы