2017-04-06 112 views
0

我試圖做一個三次樣條插值,並且出於某種原因,插值在它的中間下降。這非常神祕,我無法在網上找到任何類似事件。三次樣條插值中途退出

這是我的畢業論文,所以我排除了一些標籤等故意使其不明確,但所有相關的代碼如下。就上下文而言,這是一個天文相關的情節。

from scipy.interpolate import CubicSpline 
import numpy as np 
import matplotlib.pyplot as plt 

W = np.array([0.435,0.606,0.814,1.05,1.25,1.40,1.60]) 
sum_all = np.array([sum435,sum606,sum814,sum105,sum125,sum140,sum160]) 
sum_can = np.array([sumc435,sumc606,sumc814,sumc105,sumc125,sumc140,sumc160]) 

fall = CubicSpline(W,sum_all) 
newallx=np.arange(0.435,1.6,0.001) 
newally=fall(newallx) 

fcan = CubicSpline(W,sum_can) 
newcanx=np.arange(0.435,1.6,0.001) 
newcany=fcan(newcanx) 

#----plot 

plt.plot(newallx,newally) 
plt.plot(newcanx,newcany) 
plt.plot(W,sum_all,marker='o',color='r',linestyle='') 
plt.plot(W,sum_can,marker='o',color='b',linestyle='') 
plt.yscale("log") 
plt.ylabel("Flux S$_v$ [erg s$^-$$^1$ cm$^-$$^2$ Hz$^-$$^1$]") 
plt.xlabel("Wavelength [n$\lambda$]") 
plt.show() 

,我從拿到該地塊出來這樣的,在插值明顯的差距:

img

而且在你想知道的情況下,這些都是在sum_all值和sum_can陣列(我想這並不重要,但以防萬一你想要的數字來自己繪製它):

sum_all: 
[ 3.87282732e+32 8.79993191e+32 1.74866333e+33 1.59946687e+33 
    9.08556547e+33 6.70458731e+33 9.84832359e+33] 
can_all: 
[ 2.98381061e+28 1.26194810e+28 3.30328780e+28 2.90254609e+29 
    3.65117723e+29 3.46256846e+29 3.64483736e+29] 

發生[0.606,1之間的差距.26194810e + 28]和[0.814,3.30328780e + 28]。如果我將間隔從0.001更改爲更高,則很明顯該圖不會實際中斷,而只會在y軸上低於0(但該圖是連續的)。那麼爲什麼這樣做?當然,這不是一個正確的插值?用我們的眼睛看,這顯然不是這兩點之間的良好插值關係。

任何提示或意見將不勝感激。提前感謝你!

+0

我不明白的PGM的語言,但我假設你使用單三次樣條其中有4個控制點和'噸^ 3'爲最高階多項式的一部分,這樣的限制就高達2個顛簸和1個內點。你的數據集有更多的每個,所以要麼使用更高階的SPLINE(但往往會振盪)或使用[分段插值](http://stackoverflow.com/a/30438865/2521214)。 – Spektre

+0

@Spektre'scipy.interpolate.CubicSpline'不會執行**分段**樣條插值。這意味着樣條的數量少於要插入的點的數量。因此,每對點可以有1個拐點。 – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest看起來像你得到它(+ 1)我沒有發現日誌規模.... – Spektre

回答

1

在線性標度上可以更好地觀察到故障的原因。

enter image description here

我們可以看到,實際上花鍵經過小於0,這是對數標度不確定。

所以我建議先取數據的對數,對對數比例的數據執行樣條插值,然後再縮小第10次冪。

from scipy.interpolate import CubicSpline 
import numpy as np 
import matplotlib.pyplot as plt 

W = np.array([0.435,0.606,0.814,1.05,1.25,1.40,1.60]) 
sum_all = np.array([ 3.87282732e+32, 8.79993191e+32, 1.74866333e+33, 1.59946687e+33, 
    9.08556547e+33, 6.70458731e+33, 9.84832359e+33]) 
sum_can = np.array([ 2.98381061e+28, 1.26194810e+28, 3.30328780e+28, 2.90254609e+29, 
    3.65117723e+29, 3.46256846e+29, 3.64483736e+29]) 

fall = CubicSpline(W,np.log10(sum_all)) 
newallx=np.arange(0.435,1.6,0.001) 
newally=fall(newallx) 

fcan = CubicSpline(W,np.log10(sum_can)) 
newcanx=np.arange(0.435,1.6,0.01) 
newcany=fcan(newcanx) 


plt.plot(newallx,10**newally) 
plt.plot(newcanx,10**newcany) 
plt.plot(W,sum_all,marker='o',color='r',linestyle='') 
plt.plot(W,sum_can,marker='o',color='b',linestyle='') 
plt.yscale("log") 

plt.ylabel("Flux S$_v$ [erg s$^-$$^1$ cm$^-$$^2$ Hz$^-$$^1$]") 
plt.xlabel("Wavelength [n$\lambda$]") 
plt.show() 

enter image description here

+0

非常感謝你!這似乎完全解決了它。我將來會記住我的日誌。真的很感謝! – albc