2017-04-06 2 views
0

J'essaie d'effectuer une interpolation de spline cubique et, pour une raison quelconque, l'interpolation tombe en son milieu. C'est très mystérieux et je ne trouve aucune mention d'occurrences similaires partout en ligne. Ceci est pour ma dissertation donc j'ai exclu certaines étiquettes etc. pour le garder obscurément intentionnellement, mais tout le code pertinent est comme suit. Pour le contexte, ceci est un complot lié à l'astronomie.L'interpolation de spline cubique est supprimée à mi-chemin

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

L'intrigue que je reçois de cela vient comme ça, avec un écart clair dans l'interpolation:

img

Et au cas où vous vous demandez, ce sont les valeurs du sum_all et les tableaux sum_can (je suppose qu'il n'a pas d'importance, mais juste au cas où vous voulez que les chiffres pour tracer vous-même):

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] 

L'écart passe entre [0.606,1 .26194810e + 28] et [0,814,3,30328780e + 28]. Si je change les intervalles de 0.001 à quelque chose de plus élevé, il est évident que le tracé ne se décompose pas réellement mais tombe simplement en dessous de 0 sur l'axe des ordonnées (mais l'intrigue est continue). Alors pourquoi fait-il cela? Sûrement que ce n'est pas une interpolation correcte? Juste en regardant avec nos yeux, ce n'est clairement pas une connexion bien interpolée entre ces deux points.

Tous les conseils ou commentaires seraient extrêmement appréciés. Merci d'avance!

+0

Je ne comprends pas la langue pgm mais je suppose que vous utilisez seul SPLINE cube qui a 4 points de contrôle et 't^3' dans le cadre polynôme le plus élevé de l'ordre afin que ne la limite jusqu'à 2 bosses et 1 point inflex. votre ensemble de données a plus de chacun donc soit utiliser SPLINE d'ordre supérieur (mais qui a tendance à osciller aussi) ou utiliser [interpolation par morceaux] (http://stackoverflow.com/a/30438865/2521214). – Spektre

+0

@Spektre 'scipy.interpolate.CubicSpline' effectue une interpolation de spline ** par morceaux. Cela signifie que le nombre de splines est inférieur au nombre de points à interpoler. Vous pouvez donc avoir 1 point d'inflexion par paire de points. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest ressemble à ce que vous avez (+1) Je n'ai pas repéré l'échelle logarithmique .... – Spektre

Répondre

1

La raison de la panne peut être mieux observée sur une échelle linéaire.

enter image description here

On voit que la spline passe réellement en dessous de 0, qui est non défini sur une échelle logarithmique. Donc, je suggère de prendre d'abord le logarithme des données, d'effectuer l'interpolation de spline sur les données mises à l'échelle logarithmiquement, puis de revenir en arrière par la puissance 10ème.

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

Merci beaucoup! Cela semblait le résoudre entièrement. Je me souviendrai de mes journaux à l'avenir. Vraiment reconnaissant! – albc