2016-01-21 101 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和朋友每個子花鍵polynoms,讓你有樣條係數==> polynoms係數。
  2. 使用每個子域上的多項式,您可以將您的問題重新表達爲每個子域上的多項式二階(或您爲interpolatint選擇什麼順序)的交集,併爲此使用標準的根檢索器(或使用解析解)。
  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]) 

索引陣列需要接近線的位置。