我试图做一个三次样条插值,并且出于某种原因,插值在它的中间下降。这非常神秘,我无法在网上找到任何类似事件。三次样条插值中途退出
这是我的毕业论文,所以我排除了一些标签等故意使其不明确,但所有相关的代码如下。就上下文而言,这是一个天文相关的情节。
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_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(但该图是连续的)。那么为什么这样做?当然,这不是一个正确的插值?用我们的眼睛看,这显然不是这两点之间的良好插值关系。
任何提示或意见将不胜感激。提前感谢你!
我不明白的PGM的语言,但我假设你使用单三次样条其中有4个控制点和'吨^ 3'为最高阶多项式的一部分,这样的限制就高达2个颠簸和1个内点。你的数据集有更多的每个,所以要么使用更高阶的SPLINE(但往往会振荡)或使用[分段插值](http://stackoverflow.com/a/30438865/2521214)。 – Spektre
@Spektre'scipy.interpolate.CubicSpline'不会执行**分段**样条插值。这意味着样条的数量少于要插入的点的数量。因此,每对点可以有1个拐点。 – ImportanceOfBeingErnest
@ImportanceOfBeingErnest看起来像你得到它(+ 1)我没有发现日志规模.... – Spektre