Matplotlib 三次样条插值中途退出 我尝试做一个三次样条插值,由于某种原因,插值在中间会下降。这是非常神秘的,我在网上找不到任何类似事件的提及

Matplotlib 三次样条插值中途退出 我尝试做一个三次样条插值,由于某种原因,插值在中间会下降。这是非常神秘的,我在网上找不到任何类似事件的提及,matplotlib,interpolation,astronomy,cubic-spline,Matplotlib,Interpolation,Astronomy,Cubic Spline,这是我的论文,所以我排除了一些标签等,以保持它的模糊故意,但所有相关的代码如下。在上下文中,这是一个与天文学相关的情节 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,s

这是我的论文,所以我排除了一些标签等,以保持它的模糊故意,但所有相关的代码如下。在上下文中,这是一个与天文学相关的情节

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以下,但曲线图是连续的。那么它为什么会这样做呢?这肯定不是正确的插值吗?用我们的眼睛来看,这两个点之间显然没有很好的插值关系


如有任何提示或意见,将不胜感激。提前非常感谢

在线性尺度上可以更好地观察到故障的原因

我们看到样条曲线实际上在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()

我不懂pgm语言,但我假设您使用具有4个控制点和t^3作为最高阶多项式部分的单三次样条曲线,以便将其限制为2个凹凸和1个拐点。您的数据集具有更多样条曲线,因此可以使用更高阶的样条曲线,但也可能会出现振荡,或者使用@Spektre scipy.interpolate.CubicSpline执行分段样条曲线插值。这意味着样条线的数量比要插值的点的数量少一个。因此,每对点可以有1个拐点。@ImportanceOfBeingErnest看起来你得到了+1我没有发现对数刻度…非常感谢!这似乎完全解决了问题。将来我会记住我的日志。真的很感激!