2017-04-06 69 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