2017-04-06 3 views
0

입방 스플라인 보간을하려고하는데 어떤 이유로 그 중간에 보간이 해제됩니다. 매우 신비 롭고 온라인에서도 비슷한 사건에 대한 언급을 찾을 수 없습니다.큐빅 스플라인 보간이 중간에서 벗어났습니다

이것은 내 논문을위한 것입니다. 그래서 일부 레이블 등을 의도적으로 애매하게 유지하기 위해 제외 시켰습니다. 그러나 모든 관련 코드는 다음과 같습니다. 문맥에서 이것은 천문학 관련 플롯입니다.

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 아래로 단지 넘어갑니다 (그러나 플롯은 연속입니다). 그런데 왜 그렇게합니까? 확실히 보간법이 아닙니다. 우리의 눈으로 바라 보는 것만으로도 분명히 두 지점 사이의 잘 보간 된 연결이 아닙니다.

모든 도움말이나 의견은 극명하게 평가 될 것입니다. 미리 감사드립니다.

+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

관련 문제