线性拟合不会独立调整b

时间:2013-06-08 15:52:32

标签: gnuplot

我正在使用以下gnuplot脚本绘制线性拟合:

#!/usr/bin/gnuplot
set term cairolatex
set output "linear_fit.tex"
c = 299792458.
x(x) = c / x
y(x) = x
h(x) = a * x + b
fit h(x) "linear_fit.dat" u (x($1)):(y($2)) via a,b
plot "linear_fit.dat" u (x($1)):(y($2)) w points title "", \
    (h(x)) with lines linecolor rgb "black" title "Linear Fit"

然而,在迭代收敛后,b总是1.0:https://dpaste.de/ozReq/

如何让gnuplot调整b以及?

更新:使用via a / via b交替重复适合命令几百次会产生相当不错的结果,但这不可能是它应该如何完成。

更新2:以下是linear_fit.dat中的数据:

# lambda, V
360e-9 1.119
360e-9 1.148
360e-9 1.145
400e-9 0.949
400e-9 0.993
400e-9 0.971
440e-9 0.883
440e-9 0.875
440e-9 0.863
490e-9 0.737
490e-9 0.728
490e-9 0.755
540e-9 0.575
540e-9 0.571
540e-9 0.592
590e-9 0.457
590e-9 0.455
590e-9 0.482

1 个答案:

答案 0 :(得分:3)

我认为您的麻烦源于您的x - 值非常大(大约10e14)。

如果您没有为gnuplot提供ab的初始猜测,则会假设a=1b=1作为拟合的起点。然而,这是一个糟糕的初步猜测:

enter image description here

请注意x - 和y - 轴上的对数比例 来自gnuplot documentation

  

适合可能,并且经常会失去"如果从一个解决方案开始,SSR很大并且随着参数变化而缓慢变化,或者它可能达到数值不稳定的区域(例如,太大的数字导致浮点溢出),这导致一个"未定义值"消息或gnuplot停止。

     

为了提高找到全局最优值的几率,应尽可能将起始值至少大致设置在解决方案附近,例如,在一个数量级内。您的起始值越接近解决方案,停在另一个最小值的可能性就越小。查找起始值的一种方法是在同一图表上绘制数据和拟合函数,并更改参数值和重新绘制,直到达到合理的相似性。同样的情节也可用于检查配合是否在适当的情况下停止在最小值。

在您的情况下,这样的起始值可能是:

a = 1e-15
b = -0.5

我通过引人注目your range of values获得了这些价值 使用这些起始值,线性拟合导致:

Final set of parameters            Asymptotic Standard Error
=======================            ==========================

a               = 1.97355e-015     +/- 6.237e-017   (3.161%)
b               = -0.5             +/- 0.04153      (8.306%)

看起来像这样:

enter image description here

您可以使用fit的控制设置(例如设置FIT_LIMIT = 1.e-35)或起始值来实现比此更好的适应性。


编辑

虽然我仍然无法同时修改gnuplot同时修改两个参数ab,但我发现了一种使用R的替代方法。我知道还有很多其他方法(脚本)可以执行线性拟合的语言,这个问题是关于gnuplot的。然而,R所需的努力似乎很小 这是一个示例,当保存为linear_fit.R并使用

进行调用时
R CMD BATCH linear_fit.R 

将提供线性拟合的两个系数,即gnuplot未能提供的系数。

y <- c(1.119, 1.148, 1.145, 0.949, 0.993, 0.971, 0.883, 0.875, 0.863, 
       0.737, 0.728, 0.755, 0.575, 0.571, 0.592, 0.457, 0.455, 0.482)
x <- c(3.60E-007, 3.60E-007, 3.60E-007, 4.00E-007, 4.00E-007, 
       4.00E-007, 4.40E-007, 4.40E-007, 4.40E-007, 4.90E-007, 
       4.90E-007, 4.90E-007, 5.40E-007, 5.40E-007, 5.40E-007, 
       5.90E-007, 5.90E-007, 5.90E-007)
c = 299792458.
x <- c/x
lm.out <- lm(y ~ x)
svg("linear_fit.svg")
plot(x,y) 
abline(lm.out,col="red")
summary(lm.out)

您最终会得到一个svg文件,其中包含图表和linear_fit.Rout文本文件。在那里,您将找到以下系数:

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -5.429e-01  4.012e-02  -13.53 3.55e-10 ***
x            2.037e-15  6.026e-17   33.80 2.61e-16 ***

因此,在原始问题的术语中,我们得到:

a =  2.037e-15
b = -5.429e-01

这些值非常接近交替拟合所引用的值。


如果评论被清除,这些问题被确定为相关:

What is gnuplot's internal representation of floating point numbers?

Gnuplot behaves oddly in polynomial fit. Why is that?