【问题标题】:Computing numerical derivative with gnuplot用 gnuplot 计算数值导数
【发布时间】:2021-09-12 20:05:45
【问题描述】:

我一直在尝试使用 gnuplot 计算导数,使用另一个 discussion 中的脚本,即使使用相同的数据文件。但是我不断收到此错误:

gnuplot> d(y) = ($0 == 0) ? (y1 = y, 1/0) : (y2 = y1, y1 = y, y1-y2)
                                ^
         "prova.g", line 7: ')' expected

我不知道在这里做什么。有什么帮助吗?

【问题讨论】:

  • 您运行的是哪个版本的 gnuplot?我只能用大约 17 岁的 gnuplot 4.0 重现此错误消息。
  • 启动时显示:版本 4.2 补丁级别 6
  • 这可能是原因。不能更新到新版本吗?当前版本是 5.4
  • 这是在我的 uni 拥有的远程服务器上,不幸的是,我认为未经授权我不能这样做(我不知道从哪里获得)。
  • 嗯,gnuplot 4.2.6 是从 2009 年开始的。那么,您的管理员落后了 12 年?!让我检查一下这样的旧版本是否有办法。

标签: plot gnuplot numerical-methods derivative


【解决方案1】:

这是我收藏的数值导数示例。需要 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 没有数据块和串行评估,但这里有一个没有这些功能的麻烦解决方法。

  1. 为了说明,我创建了一些数据文件Data.dat(你已经有了你的输入文件)

  2. 将数据文件绘制到另一个文件temp1.dat 跳过第一行数据

  3. 使用系统命令paste 将文件逐行合并到另一个文件temp2.dat 中(在系统上已经安装的Linux 或必须安装的Windows 上,例如GnuWin 中的CoreUtils)。

  4. 现在您可以分别在第 1 列和第 4 列以及第 2 列和第 5 列的两个连续数据点之间计算 dxdy

  5. 小缺点:由于文件长度不同,最后一行应该被跳过。这可能可以以某种方式消除,但我目前不知道如何。

这就是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 截图)

【讨论】:

  • 完美运行,只需要更改数据。相当巧妙!
  • @AnotherUser 很高兴听到:-)。为什么必须更改数据?好吧,在您的问题中,您没有显示数据。无论如何,也许您要求您的管理员将 gnuplot 更新到更新的版本,12 年前的版本有点太旧了。
  • 是的,我的问题是关于实际数据,而不仅仅是分析函数。下次与教授交谈时,我一定会提出更新
  • @AnotherUser 抱歉,您当然必须更改数据。您不想要sin(x)/x,而是想要your 数据文件。您还可以根据需要轻松更改列。
  • 是的,我想这么多,很容易。感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多