Может быть, это может быть упрощением вашей проблемы, но я надеюсь помочь вам. Предположим, у вас есть файл, подобный следующему:
# data.dat
0.000 4.313
10.417 4.868
20.833 5.115
31.250 4.858
41.667 3.942
52.083 3.213
62.500 2.153
72.917 1.403
83.333 0.967
93.750 1.130
104.167 1.439
114.583 2.175
125.000 2.699
135.417 3.319
145.833 3.448
156.250 3.319
166.667 2.884
177.083 2.352
187.500 1.933
197.917 1.530
208.333 1.611
218.750 2.046
229.167 2.375
239.583 2.826
250.000 3.213
Вы можете выполнить первое подгонку, чтобы найти значения параметров, а затем записать файл с такими значениями внутри и передать его для второй команды подбора.
# Function
g(x) = (A1*(1+cos(n1*x-b1))+A2*(1+cos(n2*x-b2))+A3*(1+cos(n3*x-b3)))/2
# Initial values
A1 = 1.0; n1 = 1.0; b1 = 1.0
A2 = 1.5; n2 = 2.0; b2 = 2.0
A3 = 2.0; n3 = 3.0; b3 = 3.0
set fit prescale
# First fit command
fit g(x) "data.dat" u 1:2 via A1,A2,A3, b1,b2,b3, n1,n2,n3
Хитрость заключается в округлении значений, которые вы хотите.
# File to second fit command
set print "parameters.dat"
print sprintf("A1 = %g", A1)
print sprintf("A2 = %g", A2)
print sprintf("A3 = %g", A3)
print sprintf("b1 = %g", b1)
print sprintf("b2 = %g", b2)
print sprintf("b3 = %g", b3)
print sprintf("n1 = %.0f # FIXED", n1)
print sprintf("n2 = %.0f # FIXED", n2)
print sprintf("n3 = %.0f # FIXED", n3)
unset print
Файл parameters.dat
выглядит следующим образом:
A1 = 1.15639
A2 = 1.61595
A3 = 2.45079
b1 = 46.054
b2 = 12.2914
b3 = 65.8431
n1 = 1 # FIXED
n2 = 2 # FIXED
n3 = 3 # FIXED
Теперь вторая подгонкаКоманда и окончательный график:
# Second fit command
fit g(x) "data.dat" u 1:2 via "parameters.dat"
plot "data.dat" u 1:2 w p ls -1 pt 7, g(x) w l lc "red" lw 2
Конечно, параметры теперь немного отличаются.
A1 = 0.901065
A2 = 1.59511
A3 = 2.63525
b1 = 29.8406
b2 = 34.2084
b3 = 60.7824
Результат:
Я надеюсь вам помочь.