Posted on ::

科学计算自由软件——SCILAB 简介

科学计算软件现已在工程和科学研究中得到了广泛的应用,同时也成为教师和学生的必备工具。这里我们向大家介绍由法国国立信息与自动化研究院推出的科学计算自由软件——Scilab。

“科学无国界”,“科学成果是人类共同努力的结晶”。基于这种共识,法国科学家正与我国科学家合作推广这一软件,期望这一自由软件能使中国科学工作者、教师和学生受益,并参与这一软件的继续研究与开发。

Scilab 是一个非常优秀的科学计算软件。它不仅能解决各种各样的计算问题,而且能使计算过程和计算结果可视化,同时还能模拟一些事物的变化过程。我们希望 Scilab 能成为你的好朋友,时刻伴随着你,帮助你学好数学。

如果你还没有这个软件,请访问 Scilab 主页:

  • http://www.inria.fr/scilab/
  • 或中法实验室主页:http://liama.ia.ac.cn/scilab/

在这些网站上,可下载最新版本的 Scilab 软件。目前最新版本为 4.1。下面我们对 Scilab 做一简要的介绍,这里只是给大家引路,如果想更深入地学习,请参考网站上介绍的有关书籍。

当前 Scilab 没有汉化,一般在英文状态下使用。

1. 数值的四则运算与数组

Scilab的界面与Windows的一些应用软件基本相同,这里不做介绍。界面主要包括菜单栏和工作窗口。各菜单用英文标记。点击菜单后还会看到下拉菜单的内容。

1.1 四则运算

Scilab 的工作界面,你可以把它作为一个计算器,在其上可以进行各类科学计算。计算完可以保存,需要时还可打印出来。

例 1 计算:$3+6-7 \times 2+12 \div 3$。

解: 运行“Scilab”,在命令行输入算式:

-->3+6-7*2+12/3
// 输入算式时,“×”号用“*”号替代,“÷”用“/”符号替代。按Enter键,即生成计算结果。
ans = -1.
// ans 是英语 answer 的缩写,意思是“结果”,Scilab 把它作为生成计算结果的默认变量名称。

例 2 计算 $[5+3\times(12-7)]\div4$。

解: 在命令行输入算式:

-->(5+3*(12-7))/4
// 注意:在表达式中,外层的中括号仍输入小括号,碰到大括号也是输入小括号。
// 被除式(分子)或除式(分母),如果是运算式,要用小括号括起来,告诉计算机进行优先计算。
ans = 5.

从以上计算可以看到,只要正确地输入算式,按 Enter 键立刻就可得到计算结果。如果你遇到繁难的数值计算,不妨让 Scilab 替你代劳。


1.2 数值、变量和表达式

数值、变量和表达式的含义与数学上的含义基本相同。

  • Scilab 的数值采用十进制,精确度的默认值为小数点后 7 位。
  • 给变量命名,第一个字母必须是英文字母。

在命令行输入:

--> a = 2/3
a = .6666667

运算结果,分数值 $\frac{2}{3}$ 以它的近似值 0.6666667 储存起来,以便下面计算时调用。这时变量 a 取值为 0.6666667。

变量 a 的值一直保存到给 a 重新赋值或用命令 clear 清除。如果在命令行输入 clear,按 Enter 键,则清除 Scilab 临时保存的所有变量。


1.3 数组及其在计算中的应用

如果算式只是求和,Scilab 可把各个加数输入到中括号内,两数之间用空格或逗号分开,然后给这组数起个名称。

例如,求 $2+3-5+8$,可在命令行输入:

--> a = [2 3 -5 8];   // 如果在命令行输入结束后输入分号,则命令计算机储存但不显示输入结果
--> sum(a)            // “sum” 是 Scilab 的一条命令,命令计算机求数组 a 中各项的和
ans = 8.

向命令行输入的 [2 3 -5 8] 称为数组。数组中的数,除用空格分隔外,还可用逗号分隔。如以上数组可输入 [2, 3, -5, 8]

创建数组和利用数组进行计算是 Scilab 的重要特色和核心内容,同学们一定要学会它的输入方法。在 Scilab 界面上,数组排列有横排和竖排两种,分别称为行数组列数组。在 Scilab 中还有多行多列组成的数组,称为多维数组,这里我们暂不提及。一行或一列数组统称为一维数组

行向量或列向量的输入方法

在命令行输入:

--> a = [1, 2, 3, 4, 5]   // 按 Enter,生成行向量
a = 
! 1. 2. 3. 4. 5. !

输入:

--> b = [1; 2; 3; 4; 5]   // 数字之间用分号分开,此时分号表示此行数据至此结束,后面的数据(若有的话)为下一行的数据。按 Enter,生成列向量
b = 
! 1. !
! 2. !
! 3. !
! 4. !
! 5. !

上面输入数组是逐个元素输入。有些特殊的数组可用冒号 : 生成。例如输入:

--> c = 1:0.5:4            // 按 Enter,生成行向量
c = 
! 1. 1.5 2. 2.5 3. 3.5 4. !

这种生成方式表明,在 1 和 4 之间按间距 0.5 生成一个行向量。中间的数字 0.5 称作这个向量的步长

数组在计算中的应用举例

例 3 (1) 令 $x = -3, -2.5, -2, \dots, 2, 2.5, 3$,求 $x^2$ 的值。
(2) $x = \pi$,求 $x^2$ 的值。

解: (1) 在 Scilab 的命令行,输入行向量:

--> x = -3:0.5:3
x = 
column 1 to 12   // 显示行中第 1 至第 12 个元素
! -3 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 !
column 13        // 显示第 13 个元素
! 3. !

--> y = x^2       // 注意 x² 是如何输入的
y = 
column 1 to 11
! 9. 6.25 4. 2.25 1. .25 0. .25 1. 2.25 4. !
column 12 to 13
! 6.25 9. !

行数组 y 中每一个元素与行数组 x 中的元素相对应,即:

$$f(-3) = 9, f(-2.5) = 6.25, \dots, f(3) = 9$$

(2) 输入:

--> x = %pi;      // %pi 表示圆周率 π 的近似值 3.1415927
--> y = x^2
y = 9.8696044

由此可见,使用数组计算一组变量的函数值非常方便。

如果你想保留你的计算作业,你可点击界面上部的标有 File(文件)的按钮,再在下拉菜单中点击 Save(保存)存盘。如果第一次存盘,计算机还要求你给文件命名。


练习

1. 计算:
(1) $1 + 3 + 5 + 7 + 9 + 11$
(2) $5 - 3 + 7 + 28 - 315 + 300$
(3) $2 \times 3 + 4 \times 5 - 15 \div 3$
(4) $\frac{1}{2} + \frac{4}{5} - \frac{6}{11} + \frac{7}{13}$

2. $x = -2, -1.8, -1.6, \dots, 1.6, 1.8, 2$,求函数 $y = x^2$,$z = x^2 + 2x - 8$ 的值。


1.4 函数命令

我们知道,函数是一个数集中的元素生成与另一数集中元素的对应法则。两个实数的加、减、乘、除四则运算都可看成一对数偶构成的集合到实数集的对应法则。实质上,Scilab 就是一种函数语言。编程人员按照计算法则编写各种各样的计算程序,生成各种函数供我们使用。

Scilab 中许多函数都有专门的名字供我们直接调用。下面举例说明。

功能指令示例
求平方根sqrt()--> sqrt(2)1.4142136
求绝对值abs()--> abs(-3)3.
求幂(常数)^--> 2^(2/3)1.5874011
求幂(底数为 $e$)exp()--> exp(3)20.085537
常用对数($\lg$)log10()--> log10(5).69897
自然对数($\ln$)log()--> log(8)2.0794415
日期date()--> date()17-Sep-2003
多项式零点roots()见下方示例
解一次方程组inv()见下方示例

多项式零点示例

求函数 $f(x) = x^2 - 3x + 2$ 的零点:

--> x = poly(0, 'x');
--> p = 2 - 3*x + x^2;
--> roots(p)
ans = 
! 1. !
! 2. !

这个函数的零点为:$x = 1$ 或 $x = 2$。

解一次方程组示例

解方程组 $\begin{cases} x + 3y = -7 \\ 2x - 5y = 19 \end{cases}$:

--> A = [1, 3; 2, -5];
--> B = [-7; 19];
--> inv(A) * B
ans = 
! 2. !
! -3. !

即此方程组的解为 $x = 2$,$y = -3$。

在 Scilab 中现已有几百条函数命令,以后我们将有机会陆续学习如何使用它们。


练习

1. 计算:
(1) $2^{1.5}$,$3^{1.2}$,$0.3^{1.3}$
(2) $\lg 23$,$\lg 345$,$\ln 8.5$
(3) $\lg 2$,$\lg 16$,$\lg 32$

2. 求下列函数的零点:
(1) $f(x) = x^3 - x^2 - 5x + 6$
(2) $f(x) = 3x^3 - x^2 + 5x - 8$

3. 解方程组:
(1) $\begin{cases} 2x - 3y = -10 \\ 2x + 7y = 56 \end{cases}$
(2) $\begin{cases} 2x - 3y = -5 \\ 3x + y = 3.5 \end{cases}$
(3) $\begin{cases} x + 3y - z = 4 \\ 2x + 5y + 3z = 21 \\ 3x - y - z = -2 \end{cases}$
(4) $\begin{cases} 5x - 7y + 2z = -39 \\ 2x - 7y + 11z = -108 \\ x + y + z = 0 \end{cases}$


2. 函数图形的绘制

plot 是绘制平面图形的最基本的指令。它的基本格式为:

  1. plot(Y):如果 Y 为一数组,则以 Y 的元素为纵坐标,以相应元素的下标为横坐标值绘制。
  2. plot(X, Y):如果 X 和 Y 为两个数组,则其中 Y 是 X 的函数。
  3. plot2d(X, Y):这里 X, Y 的意义同上,分别代表 X 和函数 Y 的计算法则。

例 1

--> x = -2.2:0.1:3.2;
--> plot(x, x^3 - 2*x^2 - 5*x + 6)

图 1(略)

plot2dplot 用法类似,用 plot2d 可在同一坐标系中同时绘制多条曲线。

例 2

--> x = [-2.5:0.1:3.5]';
--> plot2d(x, [x^3, -2*x^2, -5*x + 6])

图 2(略)

在最新版本的图形窗口中,增加了编辑图形属性的菜单,它可以编辑图形和当前坐标轴的各种属性。


3. 程序控制语句

一般说来,前面两节讲的数值计算、函数调用命令等都是按顺序执行的。但是,有时我们需要计算机按照某种条件的成立与否,有选择地执行某些语句或者重复执行某些语句。为此,Scilab 提供了选择控制语句和循环控制语句以满足这种需求。下面我们仅通过 if 语句和 for 语句来简单地介绍 Scilab 中选择控制语句和循环控制语句的语法形式及其功能。

3.1 if 语句

if 语句的基本语法形式为:

if 条件表达式
    语句序列;
end

该语句的功能为:如果条件表达式的结果为真,则依次执行其后面的语句序列;如果该表达式的结果为假,则不执行其后面的语句序列。

如果希望在表达式的结果为假时执行其他语句,则应该使用如下形式的 if 语句:

if 条件表达式
    语句序列1;
else
    语句序列2;
end

此时当条件表达式的结果为真时,依次执行语句序列1,然后结束本 if 语句;如条件表达式的结果为假时,则依次执行语句序列2,然后结束本 if 语句。

应该注意的是 if 语句的书写格式,如果将条件表达式及语句序列写在同一行,则需要在条件表达式后加上关键字 then, 以示分隔:

if 条件表达式 then 语句序列; end

if 条件表达式, 语句序列; end

例 1 一运动物体,其运动速度为时间 $t$ 的函数:

$$ v = \begin{cases} 5, & 0 \le t < 5 \\ 5 + 10(t-5), & t \ge 5 \end{cases} $$

对任意给定的 $t(t \ge 0)$,试写出求这个物体在 $t$ 时刻的速度的程序语句。

解: 在 Scilab 命令行直接输入:

--> t = input("t="); if t < 5 v = 5; else v = 5 + 10*(t-5); end; disp(v)
t=; --> 4
5.

--> t = input("t="); if t < 5 v = 5; else v = 5 + 10*(t-5); end; disp(v)
t=; --> 8
35.

其中 disp 是 Scilab 的输出命令。

3.2 for 语句

for 语句的基本语法形式为:

for 循环变量 = 初值:步长:终值
    循环体
end

for 语句的执行过程可描述如下:先对循环变量赋初值,然后与循环变量的终值进行比较,若比较的结果为真,则执行循环体,然后循环变量“增加”一个步长值。再与循环变量的终值进行比较,若比较为真,再执行循环体,循环变量再“增加”一个步长值。依此类推,循环往复,直到循环变量与终值的比较为假时停止。

应该指出的是,若将 for 语句写在一行,则必须在终值之后增加关键字 do,,以示分隔,具体形式如下:

for 循环变量 = 初值:步长:终值 do 循环体 end

for 循环变量 = 初值:步长:终值, 循环体 end

另外,若循环变量每次“增加”的步长为 1,则此时步长可以缺省:

for 循环变量 = 初值:终值
    循环体
end

值得注意的是,在 for 语句中,若步长为正值,则仅当初值小于或等于终值时,循环体才能够被执行。若步长为负值,则必须初值大于或等于终值时循环体才能被执行。

例 2 输出 1~9 的平方根表。

解: 在 Scilab 命令行直接输入:

--> for i = 1:9, A(1,i) = i; A(2,i) = sqrt(i); end; disp(A)
// 按 Enter 键

column 1 to 6
! 1. 2. 3. 4. 5. 6. !
! 1. 1.4142136 1.7320508 2. 2.236068 2.4494897 !

column 7 to 9
! 7. 8. 9. !
! 2.6457513 2.8284271 3. !

其中 A(1, i)A(2, i) 分别表示当 i 从 1 取到 9 时,第一行数组和第二行数组。


用计算机作函数的图象(选学)

Scilab 命令行演示示例:

--> // 等待用户输入
--> x = -3:0.5:3;      // 赋值指令,为 x 赋值。由 -3 每间隔 0.5 取一个值,一直取到 3。输入分号“;”不显示结果
--> y = x^2;           // 给出函数表达式,并计算 y 的值
--> [x; y]             // 列 x, y 对应值表,显示结果

--> plot2d(x, y, style=[0], strf="045")    // 建立坐标系,描点
// style 为描点指令,其参数 [0] 确定点形状。strf="045" 使 y 轴居中

--> xgrid(6)           // 在坐标系中画网格,参数 6 表示画粉红色
--> plot2d(x, y, strf="045")    // 作更多的点画出图象