【问题标题】:smooth peaks in gnuplotgnuplot中的平滑峰
【发布时间】:2015-06-01 18:19:20
【问题描述】:

我有数据点 f(x_i) 在点 x_i(函数 f 未知,仅在数字上), f(0) = 0。数据显示小 x 处的峰状结构,随后是缓慢的肩部衰减较大的 x 设置在最大值的一半处。我想通过这些数据点绘制平滑线。 如果我使用贝塞尔曲线,那么 f(0)=0 确实是可以的,但峰值显着降低(约 25%)。如果我使用 acsplines,那么峰值看起来会好一些,但 f(0) = 0 不会保持。 如何在不丢失重要信息 (f(0)=0) 或分布的峰值高度的情况下平滑该数据集?

【问题讨论】:

  • 尝试三次样条,smooth csplinessmooth mcsplines
  • 谢谢,确实 cplines 或 mcsplines 比其他人更好地保持峰值。然而,这是有代价的:如果我选择的权重使得峰高是正确的,那么现在曲线的其余部分(高 x 处的肩膀)看起来会摇摆不定。有没有办法在 gnuplot 中进行分段平滑??
  • smooth mcsplines 就是这样做的,所以应该可以正常工作。顺便说一句:csplinesmcsplines 都不使用权重。
  • 抱歉,我不够清楚:mcsplines 确实可以很好且平滑地再现峰值区域,但在尾部会出现摆动。我想抑制这些摆动。

标签: gnuplot smoothing


【解决方案1】:

使用acsplines 进行平滑处理会绘制一个近似三次样条,它不会通过您的原始数据点。

更好的方法是使用三次样条曲线smooth csplines,它会遍历所有数据点,但可能会显示尖峰的过冲。

在您的情况下,可能最好的解决方案是使用单调三次样条,smooth mcsplines,它保持原始数据点的单调性和凸性(参见 F.N. Fritsch 和 R.E. Carlson,“单调分段三次插值”,SIAM Journal on数值分析 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'

【讨论】:

  • 感谢这些扩展的解释。现在我明白了为什么 mcsplines 不适合我。我使用的数据点有一些数字噪声,因此平滑曲线不应通过这些点。如果权重选择正确,acsplines 在峰值右侧的区域做得很好,但它也会平滑峰值(它会显着降低最大值)。这就是为什么我想对曲线的不同部分应用不同的平滑算法。在你的小例子中,对最右边的 6 个点进行一些分散,然后找到一条平滑的曲线。
  • 你需要平滑曲线做什么?您可以使用 mcsplines 绘制峰值周围的数据,并使用 acsplines 绘制尾部。使用every 限制区域,然后您可以读取峰值 fwhm,但您会发现两条曲线相交处不连续
  • 我需要用于出版物的平滑曲线。我所寻找的只是一条平滑曲线,它从数据点中去除了统计噪声,并保留了峰值(具有明确的物理理由),大约(假设在 5% 以内)正确的最大值。因此,不连续性不是那么理想的特征。
  • 嗯,这些要求是矛盾的,我不认为你可以找到一个没有可疑黑客的单一合适的平滑方法。我的问题更多地针对线条是否应该是眼睛的指南,或者如果你想估计,例如峰宽或下降时间等。如果您有一些数据模型,您也可以进行拟合。
猜你喜欢
  • 1970-01-01
  • 2015-08-06
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 2012-12-04
  • 2019-10-13
相关资源
最近更新 更多