我想使我的数据具有幂函数定律失效的功能。我正在使用来自两个不同文件的数据,这是我用来在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`
但是我的拟合看起来像这样:
是我使用函数的方式错误还是其他原因?
答案 0 :(得分: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