状态拟合循环的 Gnuplot 方程

Gnuplot equation of state fitting loop

我正在尝试使用 Birch Murnaghan 状态方程制作一个脚本来拟合 50 个自由能与体积的文件。我适合 3 个参数,emin、v0 和 k0。我似乎无法让一个循环工作,该循环会循环遍历每个适合它的文件,然后制作 50 个包含三个适合参数的新文件。

   birch(x) = emin + 1.5*v0*k0/1602 * ( 0.75*(1+2*xsi)*(v0/x)**(4.0/3.0) \
-xsi/2*(v0/x)**2 - 3.0/2.0*(1+xsi)*(v0/x)**(2.0/3.0) + 0.5*(xsi+1.5) )
emin=-8
k0=2000
v0=10
xsi=0

do for [n=100:5000:100]{
   file = sprintf('free.%.f',n)
   fit birch(x) file via emin,v0,k0
   A = A.sprintf(%f,emin)
   B = B.sprintf(%f,v0)
   C = C.sprintf(%f,k0)
}

''' 数据保存在 free.100 free.200 等文件中直到 free.5000,有谁知道我该怎么做我真的只想制作一个脚本所以我不必手动适应所有数据

我会使用set print命令来指定打印命令的输出文件。

do for [n=100:5000:100]{
   input_file = sprintf('free.%.f',n)
   fit birch(x) input_file via emin,v0,k0

   # set output file for print command
   output_file = sprintf('free.%.f.result', n)
   set print output_file

   # write output, choose format as you need it
   print(input_file)
   output_line = sprintf('emin = %f', emin)
   print(output_line)
   print(v0)
   print(k0)
}

这将免费创建 50 个输出文件。100.result, ... 在当前目录中。以下 print 命令的输出转到这些文件。

更新

要打印函数的值,您可以使用两种方法:


do for [n=100:5000:100]{

   ...
   fit ...
   ...

   # with 'set table' command into a separate file
   table_file = sprintf('free.%.f.table', n)
   set table table_file
   set xrange [6:7]
   set samples 11
   plot birch(x)
   unset table

   # print manually into normal print output file
   # please note, step size must be an integer
   do for [i = 60:70:1] { 
      x = i/10.0
      output_line = sprintf("%f  %f", x, birch(x))
      print(output_line)
   } 
}

(当我编写@maij 时已经post 给出了一个答案。不过我还是post 我的例子)

您没有指定输出文件的外观。 为了在 gnuplot 中向文件写入内容,您可以使用 set print <FILE>,检查 help set print。 检查以下示例:

代码:

### store fitting parameters into file
reset session

myFile(n)  = sprintf("free.%d",n)
myParamFile(n) = sprintf("free.%d.param",n)
set key left

# create some test data in files
do for [i=100:600:100] {
    set print myFile(i)
        m = int(rand(0)*10)+0.1
        c = int(rand(0)*10)
        do for [j=1:20] {
            print sprintf("%g %g",j, m*j + 5*m*rand(0) + c)
        }
    set print
}

set fit brief nolog
f(x) = a*x + b

set multiplot layout 3,2
    do for [i=100:600:100] {
        fit f(x) myFile(i) via a,b
        set print myParamFile(i)
            print sprintf("a = %g",a)
            print sprintf("b = %g",b)
        set print
        plot myFile(i) w p pt 7 lc "blue" ti myFile(i), \
             f(x) w l lc "red" 
    }
unset multiplot
### end of code

结果:

free.100.param

a = 3.29395
b = 8.13496

free.200.param

a = 1.99086
b = 7.94427

free.300.param

a = 2.11392
b = 12.3286

free.400.param

a = 3.97004
b = 13.3108

free.500.param

a = 7.60895
b = 15.8168

free.600.param

a = 0.0982883
b = 8.2272