我在点x_i处有数据点f(x_i)(函数f未知,只有数字),f(0)= 0.数据显示小x处的峰状结构,然后是缓慢的肩峰衰减较大的x设置在最大值的一半。我想通过这些数据点绘制平滑的线条。 如果我使用bezier,那么f(0)= 0确实没问题,但峰值显着(降低约25%),降低。如果我使用acsplines,那么峰值看起来会好一些,但不保持f(0)= 0。 如何在不丢失重要信息(f(0)= 0)或分布的峰高的情况下平滑该数据集?
答案 0 :(得分:8)
使用acsplines
平滑绘制近似三次样条曲线,它不会通过原始数据点。
更好的方法可能是使用三次样条曲线smooth csplines
,它会遍历所有数据点,但可能显示尖峰的过冲。
在您的情况下,最好的解决方案是使用单调三次样条,smooth mcsplines
,它保持原始数据点的单调性和凸性(参见FN Fritsch和RE Carlson," Monotone Piecewise Cubic Interpolation& #34;,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'