据我了解,您基本上希望在不同的范围内适应不同的功能。因此,只需在不同范围内使用两个函数。也许像这样的东西......
编辑:添加了连续功能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
