我在f(0)= 0的点x_i(函数f未知,仅在数值上)具有数据点f(x_i),数据在小x处显示出峰状结构,随后在大x处出现缓慢的肩部衰减,设置在距离最大值一半的位置。我想绘制通过这些数据点的平滑线。
如果我使用贝塞尔曲线,则确实f(0)= 0可以,但是峰值明显降低了(约25%)。如果使用acsplines,则峰值看起来会更好一些,但不会保持f(0)= 0。
如何在不丢失重要信息(f(0)= 0)或分布的峰高的情况下平滑该数据集?
最佳答案
使用acsplines
进行平滑会绘制一个近似的三次样条线,该样条线不会穿过原始数据点。
更好的方法可能是使用三次样条曲线smooth csplines
,它遍历所有数据点,但可能会显示尖峰的过冲。
在您的情况下,可能最好的解决方案是使用单调三次样条曲线smooth mcsplines
,它可以保持原始数据点的单调性和凸性(请参见FN Fritsch和RE Carlson,“单调分段三次插值法”,SIAM数值分析杂志,第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'
关于gnuplot - gnuplot中的平滑峰,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30580471/