0

我想用破幂律函数拟合我的数据。我正在使用来自两个不同文件的数据,这是我用来在 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`

但我的配件看起来像这样:

在此处输入图像描述

是我使用功能错误的方式还是其他原因?

4

1 回答 1

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

在此处输入图像描述

于 2019-01-24T09:43:57.977 回答