Gnuplot拟合峰后计算AUC结果为0的问题排查求助
Gnuplot拟合曲线积分AUC结果为0的问题排查
我是Gnuplot新手,尝试对峰值进行拟合后积分拟合曲线以计算AUC(曲线下面积)。从生成的结果图可见AUC应为非零值,但实际计算结果为0,恳请帮忙排查错误所在。
我的Gnuplot代码
FILE = 'rdf_1.dat' f(x) = (a/2/d*exp(c**2/2./d**2 + (b - x)/d) * (erf((x-b)/(sqrt(2.)*c) - c/sqrt(2.)/d) + 1.)) set fit logfile "fst" fit [1.5:2.3] f(x) FILE via a,b,c,d set table $data # Multiply the resulting value by the step size of the data sequence to get instantaneous value and then sum plot Intgrl=0 FILE u 1:(Intgrl=Intgrl+f(x))*0.05, f(x)) w table unset table plot FILE u 1:2 w l lc 'blue' ti FILE noenhanced, \ f(x) ls 1 lc 'black', \ $data u 1:2 w filledcurves lc rgb 0xddff0000 ti sprintf("Area: %.3g", Intgrl)
数据文件内容
0.050000 0.000000 0.150000 0.000000 0.250000 0.000000 0.350000 0.000000 0.450000 0.000000 0.550000 0.000000 0.650000 0.000000 0.750000 0.000000 0.850000 0.000000 0.950000 0.000000 1.050000 0.000000 1.150000 0.000000 1.250000 0.000000 1.350000 0.000000 1.450000 0.000010 1.550000 0.000548 1.650000 0.006202 1.750000 0.027577 1.850000 0.069068 1.950000 0.091299 2.050000 0.083573 2.150000 0.065806 2.250000 0.054681 2.350000 0.060911 2.450000 0.093477 2.550000 0.169883 2.650000 0.267009 2.750000 0.314563 2.850000 0.324856 2.950000 0.314537 3.050000 0.303978 3.150000 0.306779 3.250000 0.325339 3.350000 0.353281 3.450000 0.386496 3.550000 0.411760 3.650000 0.427564 3.750000 0.434807 3.850000 0.431542 3.950000 0.423512 4.050000 0.416097 4.150000 0.414516 4.250000 0.416489 4.350000 0.422986 4.450000 0.433098 4.550000 0.445442 4.650000 0.461163 4.750000 0.474391 4.850000 0.482332 4.950000 0.485715 5.050000 0.485361 5.150000 0.484130 5.250000 0.485092 5.350000 0.487679 5.450000 0.491191 5.550000 0.493824 5.650000 0.496438 5.750000 0.498746 5.850000 0.501108 5.950000 0.502376 6.050000 0.504009 6.150000 0.505605 6.250000 0.507914 6.350000 0.510423 6.450000 0.513094 6.550000 0.515798 6.650000 0.519225 6.750000 0.523168 6.850000 0.528104 6.950000 0.532143 7.050000 0.536579 7.150000 0.541007 7.250000 0.545614 7.350000 0.550174 7.450000 0.554746 7.550000 0.558285 7.650000 0.561672 7.750000 0.565361 7.850000 0.569169 7.950000 0.571944
错误原因及修正方案
核心错误点
- 积分语句语法错误:原代码中
plot Intgrl=0 FILE u 1:(Intgrl=Intgrl+f(x))*0.05, f(x)) w table存在多余的右括号,导致命令执行失败,积分变量Intgrl始终保持初始值0。 - 积分逻辑错误:原写法是先累加
f(x)再整体乘以步长,正确逻辑应为每个f(x)乘以步长后再累加,确保每一段的面积被正确计算。 - 冗余的
set table操作:不需要将拟合曲线数据保存到临时表,直接通过遍历数据的过程计算积分即可。
修正后的代码
FILE = 'rdf_1.dat' f(x) = (a/2/d*exp(c**2/2./d**2 + (b - x)/d) * (erf((x-b)/(sqrt(2.)*c) - c/sqrt(2.)/d) + 1.)) set fit logfile "fst" fit [1.5:2.3] f(x) FILE via a,b,c,d # 初始化积分变量,遍历数据计算拟合曲线的AUC Intgrl = 0 plot FILE u 1:(Intgrl = Intgrl + f(x)*0.05) w table # 绘制原始数据、拟合曲线及填充的AUC区域 plot FILE u 1:2 w l lc 'blue' ti FILE noenhanced, \ f(x) ls 1 lc 'black', \ '-' u 1:(f(x)) w filledcurves lc rgb 0xddff0000 ti sprintf("Area: %.3g", Intgrl) # 定义填充区域的下边界(从x=0到x=7.95的横轴) 0 0 7.95 0 e
修正说明
- 修复了积分计算的语法错误,将步长乘法嵌入累加操作,保证每一段面积被正确累加
- 移除了冗余的临时表操作,简化代码逻辑
- 改用直接定义填充边界的方式绘制AUC区域,确保填充范围与拟合曲线匹配
内容的提问来源于stack exchange,提问作者Bussller
相关产品推荐
相关产品推荐

