2017-04-06 13 views
0

3次スプライン補間をしようとしていて、なんらかの理由で補間が途中で途絶えてしまいます。それは非常に不思議で、私はオンラインでどこでも同じような出来事の言及を見つけることができません。立方体スプライン補間が途中でなくなります

これは私の論文用ですので、意図的にあいまいにしないようにラベルなどを除外しましたが、すべての関連コードは次のとおりです。コンテキストの場合、これは天文学関連のプロットです。

img

そして、あなたが思っている場合で

、これらはsum_allの値は以下のとおりです。

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() 

は、私はそれから入手プロットが補間で明確なギャップで、次のように出てきますそして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より下に落ちるだけです(プロットは連続しています)。それでなぜそれができますか?確かにそれは正しい補間ではありませんか?私たちの目を見るだけでは、明らかにこれらの2つのポイント間の補間された接続ではありません。

ご意見やご感想をいただければ幸いです。あまり前もってありがとう!

+0

私はPGM言語を理解していないが、私はあなたが4つの制御点と 'tは^ 3'として最高次の多項式の部分を持つ単一の三次スプラインを使用すると仮定しているので2つのバンプには限界それを1つのinflexポイント。あなたのデータセットにはより多くのものがありますので、より高次のSPLINEを使用するか(または振動する傾向があります)、[区分的補間]を使用してください(http://stackoverflow.com/a/30438865/2521214)。 – Spektre

+0

@Spektre 'scipy.interpolate.CubicSpline'は、** piecewise **スプライン補間を実行します。これは、スプラインの数が、補間する点の数より1少ないことを意味します。したがって、一対のポイントごとに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

関連する問題