我正在使用以下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
答案 0 :(得分:3)
我认为您的麻烦源于您的x
- 值非常大(大约10e14
)。
如果您没有为gnuplot提供a
和b
的初始猜测,则会假设a=1
和b=1
作为拟合的起点。然而,这是一个糟糕的初步猜测:
请注意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%)
看起来像这样:
您可以使用fit
的控制设置(例如设置FIT_LIMIT = 1.e-35
)或起始值来实现比此更好的适应性。
编辑
虽然我仍然无法同时修改gnuplot同时修改两个参数a
,b
,但我发现了一种使用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?