As I understand you basically want to fit different functions in different ranges. So, just use two functions in different ranges. Maybe something like this...
Edit: added a continuous function h(x)
. Data approximately from OP's graph.
# 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
And the code:
### 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
Output:
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
