Scilab 评论
当我第一次安装 Linux 时,我很高兴地发现 f2c(带有 shell 程序 f77 或 fort77)使得 FORTRAN 编码成为可能,并且几乎是透明的,尽管缺少 FORTRAN 编译器。但是,在尝试了许多公开可用的图形程序后,我对 FORTRAN 结果的绘图不满意。此外,我怀念 MATLAB 等程序的数学能力,我也(主要)将其用于其出色的图形功能。然后我尝试了 scilab,INRIA(法国国家信息与自动化研究所)最近为 Unix 和 Linux 发布了它。虽然图形效果不如 MATLAB,但 scilab 确实解决了我的大部分问题;以至于我也在我的工作站上安装了它。
Scilab 是一个功能齐全的科学软件包,具有数百个内置函数,用于矩阵操作、信号处理(包含其自己的工具箱)、傅里叶变换、绘图等。它基于矩阵的使用,这意味着,通过适当的规划,您无需在程序中使用下标变量。Scilab 拥有大量的帮助文件、文档和演示程序。在这里,我将仅概述它的一些功能。在一篇文章中要涵盖的内容太多了。
您需要的文档位于主目录 scilab-2.0 下的目录中。在 doc/intro 中,压缩的 PostScript 文件 intro.ps 包含用户手册,Scilab 简介。这肯定是您需要的。在 man/LaTeX-doc 中是 Docu.ps,其中包含所有 scilab 函数的列表。这实际上不是必需的,因为所有这些都可以通过 help 命令或 scilab 前端上的 help 按钮在线获得。《信号处理工具箱手册》doc/signal 中展示了 IIR 和 FIR 滤波器、频谱分析和卡尔曼滤波的示例。
作为 MATLAB 的直接后代,它的语法与之类似。例如,要定义一个向量 x,我们可以在 scilab 的 --> 提示符下键入
-->x=[ 1 3 5 8]
这会回显为
x = ! 1. 3. 5. 8. !
(感叹号表示向量或矩阵)。
矩阵乘法很简单
--> z=[ 7 8 9 10]; --> x * z' ans = 156. -->x.*z ans = ! 7. 24. 45. 80. !
第一个乘法是行向量 x 乘以列向量 z'(通过使用素数运算符转置行向量 z 创建)。这产生单个数字 156。第二个使用 .* 运算符的乘法是逐元素相乘,产生一个向量。
求解 a x = b 形式的矩阵方程也很简单。例如,让我们定义 3x3 系数矩阵 a
--> a=[2 1 3; 5 -3 1; 4 4 2] a = ! 2. 1. 3. ! ! 5. -3. 1. ! ! 4. 4. 2. !
对于 b=[1 29 -14]',一个列向量(使用素数运算符),我们可以通过几种方式找到 x
--> x=a\b x = ! 2. ! ! -6. ! ! 1. !
或者,也可以使用 x=inv(a)*b,其中 inv(a) 生成矩阵 a 的逆矩阵。
要查找并绘制 sin(2PI x/25),其中 1
-->x=[1:100];
其中分号用于阻止 scilab 回显数字。要一次找到所有数字的正弦值
-->y=sin(2*%pi*x/25);
其中 %pi 是 PI 的 scilab 内在值,向量 y 是正弦向量,第一个值 y(1)=sin(2*%pi*1/25),第二个值是 y(2)=sin(2*%pi*2/25),依此类推。要查看这些值,我们可以使用 plot(y) 绘制它们,如图 1 所示,该图显示了 scilab 前端以及由 scilab 自动生成的单独的 x-window 图。
可以通过几种不同的方式获得帮助。在 scilab 提示符下键入 help,后跟函数名称,将弹出一个窗口,其中包含该函数的帮助文本。或者使用主窗口中的帮助按钮(如图 1 所示)创建 Scilab 帮助面板(如图 2 所示)。此方法允许使用 apropos 命令搜索帮助文件,此处显示了搜索关键字 plot 的示例。图中显示了 28 个可用于 plot 的条目中的 10 个。单击 fplot3d,将弹出一个 xless 窗口,其中包含有关该函数的使用和参数的详细信息(如图 3 所示)。
我经常解决的一个问题是,当给定 s 时,求解 x=x tanh(x) 中的 x。它出现在确定已知水深中给定频率的水波长度的问题中。由于 x 出现在双曲正切函数的参数中,因此这不是一个容易解决的问题,需要迭代求解方法。我没有像在 FORTRAN 中那样编写牛顿-拉夫逊方案,而是使用了 fsolve 函数,该函数查找非线性函数系统的零点。首先,让我们在给定单个 s 值的情况下找到 x。
-->s=.5
然后我定义余数 r = s-x*tanh(x),对于 x 的正确值,它应该为零。
-->deff(`[r]=g(x)','r=s-x.*tanh(x)')
deff 函数定义 g(x),每个部分都用单引号括起来。现在使用 fsolve
-->x=fsolve(.3,g) x = .7717023
值 0.3 是我对答案的初始猜测。让我们通过将其代回 g(x) 来检查答案
-->r=g(x) r = - 1.110E-16
我们的解决方案很好。如果我们已将 s 定义为 [0.1 0.2 0.3] 并使用 x=fsolve(s,g),我们将一次获得三个解。(这就是为什么我在 r(x) 的定义中使用了 .* 而不是 *。)
我们可以将函数 g(x) 的定义直接输入到 scilab 中,也可以定义一个文件—例如 wvnum,作为函数 g(x) 的定义。该文件看起来就像上面给出的 deff 参数,包含两个单独的行,但不带单引号。然后我们使用 getf(`wvnum') 将定义调用到 scilab 中。这也可以通过“文件操作”按钮完成。
我们可以通过绘制 g(x)(例如,在 0 到 5 的范围内,步长为 0.1)来确保 x 只有一个正解
-->fplot2d((0:.1:5),g)
fplot2d 比 plot 函数的优势在于可以指定横坐标的范围并绘制函数而不是数字列表。(请注意,帮助文件示例中有一个小错误—反转了 fplot2d 的参数。这是我发现的错误之一。最糟糕的是 scilab 尝试将函数定义转换为 FORTRAN 代码时出错。请小心。)
Scilab 有各种其他可用的绘图函数。直方图、等高线图、3D 图和向量图(对流场有用)都可用。我有时使用 scilab 绘制来自另一个程序的数据。通过将数据保存在 ASCII 文件中,并知道行数和列数,可以使用 read 命令将数据读入 scilab:z=read(`datafile',m,n),其中 (m,n) 是行数和列数。然后,例如,可以使用 contour(1:m,1:n,z,10) 对数据进行轮廓绘制,以获得 10 个轮廓级别。
以三维方式绘制数据也很简单。使用上面的 z 数据,类似地调用 plot3d(1:m,1:n,z,45,45) 会生成一个 3D 图,其视点与球坐标 45 和 45(以度为单位)相关联。通过将程序设置为使用颜色,xset("use color",1),然后使用相同的参数调用 plot3d1 会生成一个彩色阴影图。查看演示程序源代码将向您展示如何为此类绘图制作动画。
打印图形很容易。一种方法是简单地使用 scilab 图形窗口中的“打印”按钮。如果您有 PostScript 打印机,这将直接将图形发送到您的 PostScript 打印机。使用命令 xbasimp(0,'foo.ps') 可以完成相同的操作,该命令将绘图窗口 0 的内容输出到 PostScript 打印机(尽管文档中说明的内容与之相反)。使用 xbasimp(0,'foo.ps',0) 将改为创建一个名为 foo.ps.0 的文件,可以使用名为 Blpr 的外部 scilab 程序打印该文件。文件 foo.ps.0 不是真正的 PostScript 文件,因为它缺少翻译 scilab 缩写的序言。Blpr 添加了该序言,生成一个 PostScript 文件,该文件可以重定向到真正的 PostScript 文件或直接打印。Scilab 还附带外部程序,用于在 LaTeX 文档中包含 PostScript 图形,如果您尚未使用带有 LaTeX 的 epsf.sty。
可以在文件中编写长程序以与 scilab 一起使用。这意味着您不必交互式地完成所有操作。通过使用“文件操作”按钮,单击程序文件名,然后单击“执行”按钮,可以轻松地将这些文件拉入 scilab 程序。调试大型程序相对简单;只需编写文件,然后反复运行它,并在进行过程中进行更正。
还有很多其他我没有提及的内容,例如积分函数、常微分方程求解器、非线性优化工具、多项式和线性系统的符号操作、Maple、C 和 FORTRAN 的接口以及许多其他内容。这些您只需自己尝试一下。但我认为您会同意,这种努力是值得的,并且 scilab 确实为 Linux 环境带来了数学实力。
Robert A. Dalrymple 在特拉华大学教授海岸工程,并指导应用海岸研究中心。他在家和工作中使用 Linux,并且从中获得的乐趣超出了应有的程度,因为他还有其他应该做的事情!