Gnuplot线性拟合异常求助:拟合结果与预期正交
Gnuplot线性拟合结果与预期正交的解决办法
看起来你遇到的问题核心是Gnuplot的xyerrors拟合默认采用正交距离拟合(Total Least Squares),而你预期的是普通最小二乘拟合(Ordinary Least Squares,仅最小化y方向误差)——这就是为什么拟合线看起来和你想要的呈正交状态,而LibreOffice默认用的是后者,所以结果符合预期。
问题拆解
- 当你使用
xyerrors选项时,Gnuplot会同时考虑x和y方向的误差,拟合的是数据点到直线的垂直距离,最终得到的是一条兼顾x、y误差的“最优”正交拟合线。 - 而普通最小二乘拟合只聚焦y方向的误差,拟合的是y对x的回归(最小化数据点到直线的竖直距离),这正是你在LibreOffice里得到的符合预期的结果。
解决方案
根据你的需求,有两种针对性处理方式:
1. 忽略x误差,采用普通最小二乘拟合(适合x误差远小于y误差的场景)
如果你的x轴误差可以忽略,或者相比y轴误差小很多,直接去掉xyerrors,改用yerrors选项,只拟合y对x的回归:
set fit errorvariables f(x)=a*x+b # 只使用x、y、y误差列(假设第3列是x误差,第4列是y误差) fit f(x) 'Data1f.txt' using 1:2:4 yerrors via a,b g(x)=c*x+d fit g(x) 'Data2f.txt' using 1:2:4 yerrors via c,d # 后续绘图命令保持不变 set xlabel 'U_G [V]' set ylabel '{/Symbol=\326}(U_{Ph}-U_0) [{/Symbol=\326}U]' set xrange [0:0.9] set yrange [0:4.5] set grid plot 'Data1.txt' using 1:2:3:4 w xyerrorbars title 'Measurement 1', f(x) title 'f(x)', 'Data2.txt' using 1:2:3:4 w xyerrorbars title 'Measurement 2', g(x) title 'g(x)'
2. 考虑x和y误差,同时实现y对x的回归(适合需要保留x误差权重的场景)
如果必须考虑x的误差影响,可以通过加权最小二乘来实现。思路是把x的误差转化为拟合的权重,给x误差大的数据点赋予更低的权重:
set fit errorvariables f(x)=a*x+b # 使用weight选项,权重为1/(x误差的平方) fit f(x) 'Data1f.txt' using 1:2:4:(1/$3**2) yerrors weight via a,b g(x)=c*x+d fit g(x) 'Data2f.txt' using 1:2:4:(1/$3**2) yerrors weight via c,d # 绘图命令不变
这种方法既保留了对x误差的考量,又能得到接近你预期的回归拟合线。
3. 快速排查:确认数据列顺序
虽然你说LibreOffice拟合正常,但还是可以快速核对一下数据文件的列顺序:第1列是x(U_G)、第2列是y(Δ(U_Ph-U0))、第3列是x误差、第4列是y误差,确保没有搞反x和y列导致的方向错误。
验证方法
修改后重新运行拟合脚本,你应该会得到和LibreOffice一致的拟合线,同时还能保留Gnuplot处理误差棒和输出误差变量的功能。
内容的提问来源于stack exchange,提问作者Ivory
相关产品推荐
相关产品推荐

