状态拟合循环的 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
我正在尝试使用 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