使用 gnuplot 计算数值导数
Computing numerical derivative with gnuplot
我一直在尝试使用 gnuplot 计算导数,使用另一个 discussion 中的脚本,即使使用相同的数据文件。但是我不断收到此错误:
gnuplot> d(y) = ([=10=] == 0) ? (y1 = y, 1/0) : (y2 = y1, y1 = y, y1-y2)
^
"prova.g", line 7: ')' expected
我不知道在这里做什么。有帮助吗?
这是我 collection 中的数值导数示例。需要 gnuplot >=5.0
代码:
### numerical derivatives
reset session
# create some data
MyFunction = "sin(x)/x"
set table $Data
set samples 150
plot [-10:10] '+' u 1:(@MyFunction) w table
unset table
DerivX(colX) = (dx=column(colX)-x0,x0=column(colX),column(colX)-dx/2)
DerivY(colY) = (dy=column(colY)-y0,y0=column(colY),dy/dx)
set table $Deriv1
plot x0=y0=NaN $Data u (DerivX(1)):(DerivY(2)) w table
unset table
set table $Deriv2
plot x0=y0=NaN $Deriv1 u (DerivX(1)):(DerivY(2)) w table
unset table
set table $Deriv3
plot x0=y0=NaN $Deriv2 u (DerivX(1)):(DerivY(2)) w table
unset table
plot $Data u 1:2 w l lc rgb "red" ti MyFunction, \
$Deriv1 u 1:2 w l lc rgb "web-green" ti "1st Derivative", \
$Deriv2 u 1:2 w l lc rgb "blue" ti "2nd Derivative", \
$Deriv3 u 1:2 w l lc rgb "magenta" ti "3rd Derivative"
### end of code
结果:
添加:(gnuplot 4.2.6 版本)
gnuplot 4.2.6 没有数据块和串行评估,但这里有一个没有这些功能的麻烦解决方法。
为了说明,我创建了一些数据文件Data.dat
(您已经有了输入文件)
将数据文件绘制到另一个文件中temp1.dat
跳过第一行数据
使用系统命令 paste
将文件逐行合并到另一个文件 temp2.dat
(在 Linux 上已经在系统上或在 Windows 你必须安装,例如 CoreUtils
from GnuWin).
现在您可以计算第 1 列和第 4 列以及第 2 列和第 5 列的两个连续数据点之间的 dx
和 dy
。
小缺点:由于文件长度不同,最后一行应该跳过。这可能可以以某种方式消除,但我目前不知道如何。
这就是 temp2.dat
的样子:
#Curve 0 of 1, 150 points #Curve 0 of 1, 150 points
#x y type #x y type
-10 -0.0544021 i -9.86577 -0.0432646 i
-9.86577 -0.0432646 i -9.73154 -0.0310307 i
-9.73154 -0.0310307 i -9.59732 -0.0178886 i
...
代码:
### numerical derivative for gnuplot 4.2.6
reset
DATA = "Data.dat"
set table DATA
set samples 150
plot sin(x)/x
unset table
TEMP1 = "temp1.dat"
TEMP2 = "temp2.dat"
set table TEMP1
plot DATA u 1:2 every ::1
unset table
system(sprintf('paste %s %s > %s',DATA, TEMP1, TEMP2))
x0(col) = (column(col)+column(col+3))/2.
dx(col) = (column(col+3)-column(col))/2.
dy(col) = (column(col+3)-column(col))/2.
plot DATA u 1:2 w lp pt 7 title "Data", \
TEMP2 u (x0(1)):(dy(2)/dx(1)) w lp pt 7 title "1st Derivative"
### end of code
结果:(gnuplot 4.2.6 截图)
我一直在尝试使用 gnuplot 计算导数,使用另一个 discussion 中的脚本,即使使用相同的数据文件。但是我不断收到此错误:
gnuplot> d(y) = ([=10=] == 0) ? (y1 = y, 1/0) : (y2 = y1, y1 = y, y1-y2)
^
"prova.g", line 7: ')' expected
我不知道在这里做什么。有帮助吗?
这是我 collection 中的数值导数示例。需要 gnuplot >=5.0
代码:
### numerical derivatives
reset session
# create some data
MyFunction = "sin(x)/x"
set table $Data
set samples 150
plot [-10:10] '+' u 1:(@MyFunction) w table
unset table
DerivX(colX) = (dx=column(colX)-x0,x0=column(colX),column(colX)-dx/2)
DerivY(colY) = (dy=column(colY)-y0,y0=column(colY),dy/dx)
set table $Deriv1
plot x0=y0=NaN $Data u (DerivX(1)):(DerivY(2)) w table
unset table
set table $Deriv2
plot x0=y0=NaN $Deriv1 u (DerivX(1)):(DerivY(2)) w table
unset table
set table $Deriv3
plot x0=y0=NaN $Deriv2 u (DerivX(1)):(DerivY(2)) w table
unset table
plot $Data u 1:2 w l lc rgb "red" ti MyFunction, \
$Deriv1 u 1:2 w l lc rgb "web-green" ti "1st Derivative", \
$Deriv2 u 1:2 w l lc rgb "blue" ti "2nd Derivative", \
$Deriv3 u 1:2 w l lc rgb "magenta" ti "3rd Derivative"
### end of code
结果:
添加:(gnuplot 4.2.6 版本)
gnuplot 4.2.6 没有数据块和串行评估,但这里有一个没有这些功能的麻烦解决方法。
为了说明,我创建了一些数据文件
Data.dat
(您已经有了输入文件)将数据文件绘制到另一个文件中
temp1.dat
跳过第一行数据使用系统命令
paste
将文件逐行合并到另一个文件temp2.dat
(在 Linux 上已经在系统上或在 Windows 你必须安装,例如CoreUtils
from GnuWin).现在您可以计算第 1 列和第 4 列以及第 2 列和第 5 列的两个连续数据点之间的
dx
和dy
。小缺点:由于文件长度不同,最后一行应该跳过。这可能可以以某种方式消除,但我目前不知道如何。
这就是 temp2.dat
的样子:
#Curve 0 of 1, 150 points #Curve 0 of 1, 150 points
#x y type #x y type
-10 -0.0544021 i -9.86577 -0.0432646 i
-9.86577 -0.0432646 i -9.73154 -0.0310307 i
-9.73154 -0.0310307 i -9.59732 -0.0178886 i
...
代码:
### numerical derivative for gnuplot 4.2.6
reset
DATA = "Data.dat"
set table DATA
set samples 150
plot sin(x)/x
unset table
TEMP1 = "temp1.dat"
TEMP2 = "temp2.dat"
set table TEMP1
plot DATA u 1:2 every ::1
unset table
system(sprintf('paste %s %s > %s',DATA, TEMP1, TEMP2))
x0(col) = (column(col)+column(col+3))/2.
dx(col) = (column(col+3)-column(col))/2.
dy(col) = (column(col+3)-column(col))/2.
plot DATA u 1:2 w lp pt 7 title "Data", \
TEMP2 u (x0(1)):(dy(2)/dx(1)) w lp pt 7 title "1st Derivative"
### end of code
结果:(gnuplot 4.2.6 截图)