【问题标题】:Fitting data using broken power-law in gnuplot在 gnuplot 中使用破幂律拟合数据
【发布时间】:2019-06-14 12:24:17
【问题描述】:

我想用破幂律函数拟合我的数据。我正在使用来自两个不同文件的数据,这是我用来在 gnuplot 工具中拟合我的数据的代码

set term wxt
    p 'Data1.dat' u 1:($8*100):2:($9*100) w xyerr lt 7 t '', \
      'Data2.dat' u 1:($8*100):2:($9*100) w xyerr lt 8 t ''
    set log x 2
    f(x) = A*(x**p)*(x**(p-q))
    A = 1.0
    p = 1.5
    q = 0.1
    rep f(x) lt 8 lw 2 t ''
    fit f(x) '< cat Data1.dat Data2.dat' u 1:($8*100):($9*100) yerr via A,p,q
    replot`

但我的试衣是这样的:

是我使用函数的方式不对还是其他原因?

【问题讨论】:

  • “破幂律”是指this thing吗?如果是,你也想适应“断点”吗?
  • 请您添加数据点好吗?
  • 嗯,你的起始参数似乎有问题。该功能看起来不像您的数据。 Gnuplot 不能创造奇迹,你必须提供合理的值,除非你适合纯多项式。
  • @maij 我试图找到适合我的数据的合适函数,我发现破碎的力量是最好的。由于我使用来自两个不同文件的数据,这些文件使整个绘图的 X 轴值增加,因此我并不关心“断点”
  • @Karl 函数在用于具有预定义的破幂律的其他绘图设备时确实适用。我发现如何在 gnuplot 中使用相同的功能很困难

标签: gnuplot power-law


【解决方案1】:

据我了解,您基本上希望在不同的范围内适应不同的功能。因此,只需在不同范围内使用两个函数。也许是这样的......

编辑:添加了一个连续函数h(x)。数据大致来自 OP 的图表。

# SO_data.dat
0.551   2.213
0.928   3.531
1.199   4.796
1.461   5.901
1.963   6.393
2.770   6.260
3.760   5.794
4.445   5.515
4.905   5.528
5.914   5.581
7.566   5.062
4.358   4.996
5.052   4.929
6.032   4.729
6.924   4.609
7.948   4.370
8.945   4.117
10.167  4.024
11.902  3.930
14.928  3.824
18.724  3.704
23.484  3.438
29.166  3.584
42.405  2.945

还有代码:

### fitting two regions
reset session
set colorsequence classic

set logscale x 2
FILE = "SO_data.dat"
set xrange[0.25:64]
set yrange[2:9]

# some start values
A = C = 4
p = r = 0.8
B = D = 8
q = s = -0.3
d = 2
a = 3
f(x) = A*x**p 
g(x) = B*x**q
h(x) = C*x**r/(exp((x-d)*a)+1) + D*x**s/(exp((-x+d)*a)+1)

fit [:2] f(x) FILE u 1:2 via A,p
fit [2:] g(x) FILE u 1:2 via B,q
fit h(x) FILE u 1:2 via C,D,r,s,a,d

c = (B/A)**(1/(p-q))   # crossing point
print sprintf("A: %.3g, p: %.3g, B: %.3g, q: %.3g, c: %.3g",A,p,B,q,c)
print sprintf("C: %.3g, r: %.3g, D: %.3g, s: %.3g, a: %.3g, d: %.3g",C,r,D,s,a,d)
plot FILE u 1:2 w p ps 2,\
    f(x) noautoscale, g(x) noautoscale, h(x) noautoscale
### end of code

输出:

A: 3.96, p: 0.795, B: 8.1, q: -0.274, c: 1.95
C: 1.43, r: 0.046, D: 8.08, s: -0.272, a: 3.63, d: 1.15

【讨论】:

  • 可以在gnuplotf(x) = x &lt; t ? A(x-t)**2 : B*(x-t)**3或者r=2; f(x) = x&lt;r? A*x**q : B*x**q中进行分段定义
  • ...尚未测试 gnuplot 是否也适合分段函数。我添加了一个看起来更好的单件和平滑功能;-)
  • 也许,但它可能是非物质的。 ;-) Marquard-Levenberg 算法(和 gnuplot 的实现)并不关心你的函数是如何定义的,只要它返回函数值。
  • 诚然,您添加的函数 h(x) 看起来实际上一个很好的模型。 OP 可能想要使用那个。
  • ...嗯,1/(exp((x-d)*a)+1) 部分与 Fermi-Dirac 统计的结构相同,所以我会说 非常 物理 ;-)
猜你喜欢
  • 2015-11-23
  • 2021-05-30
  • 1970-01-01
  • 2021-06-04
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多