Gnuplot荧光寿命数据对数拟合异常求助:拟合曲线偏差问题
Gnuplot对数拟合荧光寿命数据偏差问题
我正在编写Gnuplot代码以对数形式展示荧光寿命发展数据,但拟合结果显示异常。以下是我的代码:
reset session cd '...' set key right bottom invert set xlabel "Zeit (ns)" set ylabel "Ticks/max(Ticks)" set xrange [0:8] set yrange [0.0001:10] set logscale y 10 plot "FLIM.dat" using 1:2:3 with yerrorbars title "Daten" f(x)=a*exp(-x/b) g(x)=c*exp(-x/d) h(x)=e*x+f fit [2:8] f(x) "FLIM.dat" using 1:(log($2)) via a,b fit [2:8] g(x) "FLIM.dat" using 1:(log($2)):($3/$2) via c,d fit [2:8] h(x) "FLIM.dat" using 1:(log($2)) via e,f replot [2:8] f(x) title "fit ohne Fehler" lt rgb "black" replot [2:8] g(x) title "fit mit Fehler" lt rgb "red" replot [2:8] exp(h(x)) title "fit per Gerade" lt rgb "green"
当前生成的拟合曲线中,f(x)和g(x)与h(x)偏差较大,请问问题出在哪里?
问题根源
- 拟合目标逻辑错误:你要拟合的是指数衰减模型
y = a*exp(-x/b),但对f(x)和g(x)进行拟合时,直接用原始指数函数去匹配对数化后的y值(即log($2)),这相当于强制让a*exp(-x/b) = log(y),完全违背了原本的模型假设,拟合结果自然偏离正确趋势。 - 对数转换的适配错误:
h(x)的拟合逻辑是对的——将指数模型转换为对数线性形式log(y) = e*x + f,再拟合线性函数,最后通过exp(h(x))还原为指数曲线,所以这条曲线是符合数据规律的。
修正方案
直接用指数函数拟合原始y值(无需预先对数化),让拟合目标与模型一致:
reset session cd '...' set key right bottom invert set xlabel "Zeit (ns)" set ylabel "Ticks/max(Ticks)" set xrange [0:8] set yrange [0.0001:10] set logscale y 10 plot "FLIM.dat" using 1:2:3 with yerrorbars title "Daten" # 直接拟合原始y值的指数模型 f(x)=a*exp(-x/b) fit [2:8] f(x) "FLIM.dat" using 1:2 via a,b # 带相对误差权重的指数拟合(对应对数空间的绝对误差) g(x)=c*exp(-x/d) fit [2:8] g(x) "FLIM.dat" using 1:2:($3/$2) via c,d # 保留原有的对数线性拟合作为对照 h(x)=e*x+f fit [2:8] h(x) "FLIM.dat" using 1:(log($2)) via e,f replot [2:8] f(x) title "fit ohne Fehler" lt rgb "black" replot [2:8] g(x) title "fit mit Fehler" lt rgb "red" replot [2:8] exp(h(x)) title "fit per Gerade" lt rgb "green"
修正说明
- 移除
f(x)和g(x)拟合时对$2的log()转换,让拟合目标回归到y = 指数函数的正确模型。 - 带权重的拟合中,
($3/$2)作为相对误差,正好对应对数空间中的绝对误差,gnuplot会自动处理权重逻辑。 - 修正后三条拟合曲线的趋势会基本一致,符合荧光寿命衰减的预期规律。
内容的提问来源于stack exchange,提问作者Patrick Horstmann
相关产品推荐
相关产品推荐

