我想用GNUPLOT拟合一个像傅立叶展开式的函数。我有3个术语,其中许多参数应该是整数和实数。

我不知道如何设置一些变量以适合整数

我有类似的东西,其中n1,n2,n3应该是整数,其他参数为实数:

g(x)=(A1*(1+cos(n1*x-b1))+A2*(1+cos(n2*x-b2))+A3*(1+cos(n3*x-b3)))/2

fit g(x) file u ($1+4):(f($2,E_min)) via A1,A2,A3,b1,b2,b3,n1,n2,n3

最佳答案

也许这可能会简化您的问题,但希望对您有所帮助。
假设您有一个像这样的文件:

# 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


结果:
gnuplot - 我想用整数参数拟合函数-LMLPHP

希望对您有所帮助。

关于gnuplot - 我想用整数参数拟合函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58671452/

10-14 07:07