Math 如何在gnuplot中实现线性外推?

Math 如何在gnuplot中实现线性外推?,math,gnuplot,extrapolation,Math,Gnuplot,Extrapolation,无法进行正确的线性外推。这是图表 很明显,外推应该减少,因为在顶部左侧有点,在右侧,所有的东西都在底部,而且有很多点。样本数据 1.12.2010;6700 5.12.2010;330000 8.12.2010;45300 12.12.2010;15400 5.05.2011;5300 31.05.2011;1500 2.06.2011;11400 24.11.2011;51000 19.03.2012;3300 .... 我使用以下脚本绘制图形 #! /usr/bin/gnuplot -p

无法进行正确的线性外推。这是图表

很明显,外推应该减少,因为在顶部左侧有点,在右侧,所有的东西都在底部,而且有很多点。样本数据

1.12.2010;6700
5.12.2010;330000
8.12.2010;45300
12.12.2010;15400
5.05.2011;5300
31.05.2011;1500
2.06.2011;11400
24.11.2011;51000
19.03.2012;3300
....
我使用以下脚本绘制图形

#! /usr/bin/gnuplot -persist
set terminal postscript eps enhanced color solid
set output "result.ps"
set grid xtics ytics

set datafile separator ";"
set xtics rotate by 45 right
set grid xtics ytics

set xdata time
set timefmt "%d.%m.%Y"

# The equation
f(x) = a*x + b
fit f(x) "q.csv" u 1:2 via a,b

plot "q.csv" using 1:2 title "DATA" with p linestyle 3 lt 7 lw 2, \
  f(x) w l lt 1 lw 2 title "trendline"
这是在许多地方描述的线性外推部分。似乎逻辑规定它应该起作用,但不起作用

# The equation
f(x) = a*x + b
fit f(x) "q.csv" u 1:2 via a,b
我做错了什么

我。试过那里的东西,对我没有帮助。我就是这样做的

# find out the StartDate
StartDate = "1.12.2010"          # manually by setting a value

f(x) = a*(x-StartDate) + b
set fit brief nolog
b=10
fit f(x) "q.csv" u 1:2 via a,b
set key top left
set format x "%d.%m.%Y" timedate

plot "q.csv" u 1:2 ti "Data" with linespoints linestyle 1 pt 7 ps 1, \
 f(x) w l lc rgb "red" ti "Fit"


拟合失败的主要原因是:(1)一般的Marquardt-Levenberg算法不是解决线性最小二乘问题的最佳算法;(2)对
a
b
的结果解相差几个数量级

要处理(2),您可以试验
a
b
的初始值,请尝试

a = 0.001
b = 150000
这应该会有所帮助。但如果没有,您可以通过在运行
fit
命令之前设置以下变量,将Marquardt Levenberg“转换”为一步Gauss-Newton来处理(1)(请参见
help set fit
help fit控制变量,适用于较旧版本的gnuplot):

注意,gnuplot仍然需要两个步骤:一个用于找到解决方案,另一个用于验证它是否收敛



正如@theozh所指出的,通过使用
f(x)=a*(x-StartDate)+b
来移动x值通常是有帮助的。它也可能有助于像这样缩放参数:
f(x)=1000*a*x+b/1000
。或者可以尝试两者结合,或者…

欢迎使用StackOverflow!最有可能是重复的:非常感谢你的评论。试过那里的东西,对我没有帮助。我就是这样做的通过设置值f(x)=a*(x-StartDate)+b set fit-brief nolog b=10 fit f(x)“q.csv”u 1:2,通过a,b set key左上集格式x“%d.%m.%Y”timedate plot“q.csv”u 1:2 ti“Data”和线条点线条样式1 pt 7 ps 1、\lc(x)w l rgb“红色”ti“fit”手动查找起始日期StartDate=“1.12.2010”你能提供你真实的(完整的)数据吗?如果我看一下你的图,它们包含12年的非等距数据。然而,Excel只是在所有数据点之间采取等距离的步骤。这是你想要的吗?我怀疑自1970年以来,
StartDate
时间戳必须以秒为单位。如果你只有字符串,你需要这样转换:
StartDate=strtime(“%d.%m.%Y”,“01.12.2010”)
但是我相信,在你的特殊情况下,这还不足以解决问题。非常感谢你,这就是我需要的!
set fit lambda_factor 1
set fit start_lambda 0.00001

### or for older versions of gnuplot
# FIT_START_LAMBDA=0.00001
# FIT_LAMBDA_FACTOR=1