我有一些数据点f(x_i),在点x_i处(只知道数值,不知道函数f)。其中f(0)=0。这些数据显示,小x的位置有一个类似峰的结构,然后在大x的位置有一个缓慢的肩膀下降,在最高点的一半开始。我想通过这些数据点绘制平滑的曲线。
如果我使用贝塞尔曲线,则确实f(0)=0是可以的,但峰值显著降低了(约25%)。如果我使用acsplines,则峰值看起来更好,但无法保持f(0)=0。
如何平滑处理该数据集而不会丢失重要信息(f(0)=0)或分布的峰度?
使用 acsplines
进行平滑处理会绘制一个近似的三次样条曲线,该曲线不会经过原始数据点。
更好的方法可能是使用立方样条曲线 smooth csplines
,它会穿过所有的数据点,但可能会在尖峰处显示过冲现象。
在您的情况下,最好的解决方案是使用单调立方样条曲线 smooth mcsplines
,它保持了原始数据点的单调性和凸性(参见 F.N. Fritsch 和 R.E. Carlson,“ Monotone Piecewise Cubic Interpolation”,SIAM Journal on Numerical Analysis 17,pp. 238-246 (1980))。
这里有一个简短的例子展示了这些差异:
test.dat
文件包含以下数据点:
0 0
0.2 1
0.4 10
0.6 80
1 30
2 20
3 13
4 7
5 2
6 1
7 0
绘制它们的脚本为
set xzeroaxis
set style data lines
set samples 500
plot 'test.dat' u 1:2 smooth acsplines title 'acsplines', \
'' u 1:2 smooth csplines title 'csplines', \
'' u 1:2 smooth mcsplines lw 2 title 'mcsplines',\
'' u 1:2 w p pt 7 title 'data points'
smooth csplines
或smooth mcsplines
。 - Christophsmooth mcsplines
的作用,所以应该可以正常工作。顺便说一句:csplines
和mcsplines
都不使用权重。 - Christoph