scilab中文教程

112
Scilab 中文教程 * http://www.scilab.org.cn/ 最后编辑时间: 2007.7.1 0. 摘要、引言 [书写安排] 1. Scilab基础 1.1. Scilab概述 1.2. Scilab的运行环境与安装 1.3. Scilab集成环境 1.4. Scilab帮助系统 2. Scilab矩阵及其运算 2.1. 变量和数据操作 2.2. Scilab矩阵 2.3. Scilab运算 2.4. 字符串 2.5. 稀疏矩阵 3. Scilab程序设计 3.1. SCI文件 3.2. 程序控制结构 3.3. 函数文件 3.4. 程序举例 3.5. 程序调试 4. Scilab文件操作 4.1. 文件的打开与关闭 4.2. 文件的读写操作 4.3. 数据文件定位 5. Scilab绘图 5.1. 二维数据曲线图 5.2. 其他二维图形 5.3. 三维图形 5.4. 图形修饰处理 5.5. 图像处理及动画制作 6. Scilab数据分析与多项式计算 6.1. 数据统计处理 6.2. 数据插值 6.3. 曲线拟合 6.4. 离散傅立叶变换 6.5. 多项式计算 7. Scilab解方程与函数极值 1

Upload: dong-yanpei

Post on 07-Oct-2014

1.495 views

Category:

Documents


144 download

TRANSCRIPT

Page 1: scilab中文教程

Scilab 中文教程 第 * 章

http://www.scilab.org.cn/

最后编辑时间: 2007.7.1

目 录

0. 摘要、引言 [书写安排]

1. Scilab基础

1.1. Scilab概述

1.2. Scilab的运行环境与安装

1.3. Scilab集成环境

1.4. Scilab帮助系统

2. Scilab矩阵及其运算

2.1. 变量和数据操作

2.2. Scilab矩阵

2.3. Scilab运算

2.4. 字符串

2.5. 稀疏矩阵

3. Scilab程序设计

3.1. SCI文件

3.2. 程序控制结构

3.3. 函数文件

3.4. 程序举例

3.5. 程序调试

4. Scilab文件操作

4.1. 文件的打开与关闭

4.2. 文件的读写操作

4.3. 数据文件定位

5. Scilab绘图

5.1. 二维数据曲线图

5.2. 其他二维图形

5.3. 三维图形

5.4. 图形修饰处理

5.5. 图像处理及动画制作

6. Scilab数据分析与多项式计算

6.1. 数据统计处理

6.2. 数据插值

6.3. 曲线拟合

6.4. 离散傅立叶变换

6.5. 多项式计算

7. Scilab解方程与函数极值

1

Page 2: scilab中文教程

Scilab 中文教程 第 * 章

7.1. 线性方程组求解

7.2. 非线性方程数值求解

7.3. 常微分方程初值问题的数值解法

7.4. 函数极值

8. Scilab数值积分与微分

8.1. 数值积分

8.2. 数值微分

9. Scilab 图形化界面设计

10. Scicos图形化仿真环境

10.1. Scicos介绍

10.2. Scicos基本库

10.3. Scicos的使用

10.4. Scicos模块的添加

11. Scilab常用工具箱

11.2 图像处理工具箱

12. Scilab外部接口

12.1. C语言接口

12.2. Java语言接口

13. Matlab代码向Scilab移植

14. Scilab并行计算

15. Scilab工具箱开发

16 Scilab应用实例

附录 Scilab常用命令与函数分类索引表

参考文献

相关网站

2

Page 3: scilab中文教程

Scilab 中文教程 第 0 章

最后编辑时间: 2007.7.1

Scilab 程序设计教程 0.04

内容摘要 本书是为适应教学的需要而编写。全书以 Scilab4.1 版为基础,介绍 Scilab 程序设计的方法

与应用,主要内容包括:Scilab 操作基础、Scilab 矩阵及其运算、Scilab 程序设计、Scilab文件操作、Scilab 绘图、Scilab 数据分析与多项式计算、Scicos 图形化仿真环境以及 Scilab常用工具箱。本书符合教学规律和特点,内容丰富、取材新颖、注重实用、便于教学。本书

可作为高校理工科各专业大学生、研究生学习的教材,也可供广大科技工作者阅读使用。 本书以电子版形式在互联网上公开自由下载,争取得到资金印刷出版,目标成为 Scilab 学

习和使用的标准化中文教程,为 Scilab 在中国的发展和中国自主的科学计算软件研究做出贡

献.

作者安排:

本安排是一个大体的安排,随时注意联系,可能一次做不好,我

们的目标是逐步推进,但是必须是每周都写一点,假如每周用

2 个小时来进行. 姓名 任务 email 备注 周辛 Java 接口 [email protected] 新加坡南洋理工大学 肖瑞 Java 接口 [email protected] 新加坡管理大学 李国强 文件读写 [email protected] 中国地质大学(北京) 康彩 Scicos [email protected] 北阳科技 刘铎 第二章,第六章

的部分 [email protected] 清华大学

戴凤智 相关专业工具

箱(图象处理工

具 箱 ( SIP Toolbox))

[email protected] 日本

王彦春 相关专业工具

[email protected] 西北大学物理学系 04 基地

彭哲 相关专业工具

[email protected] 浙江大学

张冬 其它部分 [email protected] 宁夏大学 于仕琪 相关专业工具

[email protected] 中科院

目前 没有安排到的章节 安排到的 相关专业工具箱 的作者 可以选择. 我们会在后面详细附上贡献情况. 望大家每周至少抽出 2 个小时时间来做这个事情.

1

Page 4: scilab中文教程

Scilab 中文教程 第 0 章

[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected] [email protected],[email protected],[email protected] 序 黑人领袖马丁·路德·金说: “我有一个梦想。” 他的梦想是让人人生而平等,让世

界更加和平。

我们也有一个梦想,推进开放源码的普及,让我们的软件独立自主!站在巨人的肩上才

可以看得更远,开放源码运动给我们提供了这样一次机会,

在开放源码的旗帜下我们可以借助整个世界的力量建立自主的软件工业和体系。软件产

业的独立自主需要开源,发展开源需要发展开源教育,开源的精神是自由、开放、共享,与

教育可以很好的结合。开源软件由世界社区共同开发,它是开放的、自由的、免费或者低价

的,这对解决知识产权问题和降低教育成本有很大的帮助。而且中国建立起一个自主、完整

的软件产业体系,就可以从而不再受外国的制约,国家的信息安全和国家安全也将得到可靠

的保障。软件产业上的重大问题决不能妥协!发展开源教育,推广开源应用,发展开源软件,

对我国信息产业发展具有深远的意义!

2

Page 5: scilab中文教程

Scilab 中文教程 第 0 章

前言

1. 科学计算软件与 SCILAB SCILAB 是以法国国立信息与自动化研究院(INRIA)和法国桥梁学院(ENPC)的科

学家为主共同开发的“开放源码”式科学计算软件。 SCILAB 一词源于英文 “Scientific Laboratory”(科学实验室)词头的合并。SCILAB 已经得到各国研究工作者,大学教授以及

教育界和工业界人士的普遍关注,并被免费地引进到他们的研究、教学以及产品研发中,目

前正以每月 10,000 份的速度向全世界发布。 科学计算软件(如加、减、乘、除、微机分、逻辑推理等)是计算机应用的主要内容之

一,并已经与实验研究、理论计算并列为三大科学方法。而以完成科学计算为目的的应用软

件可以称为科学计算软件。事实上,除了科学问题方面的计算,科学计算软件同样适用于各

种工程技术,金融、经济等方面的应用。目前这类软件多数是以数值计算形式为主,基于符

号计算(如公式推倒)的应用软件也变得日益普及。 2. SCILAB 在世界的发展状况 科学计算软件曾在工程界的研究和发展活动中掀起了一场革命。如今,这些软件已经被

广泛应用到工业工程实验室中,成为各科研领域众多学者、教师和学生的必备工具。法国国

立信息与自动化研究院(INRIA)无疑是这场革命的先驱者。从 1994 年开始,它推出的开

放源码软件 SCILAB 积极地推动了这场革命。SCILAB 综合了多方面的研究成果,是众多

学者心血的结晶,然而 SCILAB 的诞生更应该归功于它的六位创始者----SCILAB 小组成

员:INRIA 的 Francois Delebecque, Claude Gomez, Maurice Goursat, Ramine Nikoukhah 与Serge Steer 以及法国国立桥梁学院(ENPC)的 Jean-Phillippe Chancelier. 可以说 SCILAB 软件及其工具箱已经取得了很大的成功:每月都有来自全球的近万人

次登录 SCILAB 网站,并下载该软件。如此国际化的成功一方面因为该软件本身的语法和

基本功能完全可以和行业参照软件 MATLAB 相媲美,另一方面因为它是完全免费的。此外,

这份成功也应归功于其源代码开放的特征;使用者可以完全控制其开发计划,并通过嵌入最

新最先进的技术,还可以优化 SCILAB 软件。 当然,每一个成功之后应该是有一个进步,SCILAB 完全能够而且应该看得更高,走

得更远。我们的目标是:在未来几年中使 SCILAB 成为一个优秀的数字科学计算工具;并

在教育、研究以及工业领域内得到认可,成为一个具有国际水平的参照工具;借助于免费的

优势促进其发展,加强 SCILAB 使用者和参与群体的安全性;确保工业需要和行业先进技

术的优先联系。为朝此目标发展,INRIA 决定在 2002 年加大力度,并与学术界和工业界的

合作者共同建立“SCILAB 共同体”(Consortium SCILAB)。如此宏大的计划如果仅仅局限于

法国或是欧洲范围内是远远不够的,只有将其放在国际环境下才能取得成功。因此,SCILAB 小组的成员正努力逐步扩大 SCILAB 在国外的影响。 3. SCILAB 在中国的推广 中国科学院自动化所和法国国立信息与自动化研究院(INRIA)联合创办的中法信息、

自动化与应用数学实验室吸引了中法许多大学和科研单位的科学家,这些科学家紧密合作,

从事了许多基础性、公益性的前沿科学研究。 最近,双方科学家又在推动发展和普及科学计算自由软件 SCILAB。他们组织了基于

SCILAB 平台的应用软件比赛,又出版 SCILAB 相关的书籍,以便让更多的同仁们了解和掌

握 SCILAB。中法科学家还在策划进一步完善这一具有巨大应用前景(尤其是对中国科技与

教育界)的开放源代码自由软件,体现了中法科学家共有的社会责任。

3

Page 6: scilab中文教程

Scilab 中文教程 第 0 章

十余年来,INRIA 和法国国立桥梁学院(ENPC)的科学工作者坚持 SCILAB 的开放源

代码与自由软件原则,最近又与中法联合实验室的同仁们共同努力准备将其在中国推广普

及,这一行为理所当然地受到了中法两国科学家地支持。许多中国高校地学生还积极参与了

基于 SCILAB 软件平台的应用软件比赛。中国科技部“863”计划和法国驻华使馆,也对此给

予了积极的支持。由胡包钢老师编写的《科学计算自由软件——SCILAB 教程》的出版,是

推动该工作在中国进一步开展的重要一步。 值得一提的是“SCILAB 中国经历”的开始:法国国际农业研究发展中心(CIRAD)研

究员 Philippe de Reffye 功不可没,在中国的三年中,他在中国科学院与 INRIA 共同创建的

中法实验室(LIAMA)工作,在那里他用 SCILAB 软件成功的开展了植物建模方面的研究。

对于此项应用 SCILAB 的创始者们是完全没有预想到的。同时,他还与中国若干数学、计

算机及农业研究所之间建立了紧密的合作关系。就像种子一经播下,便迅速成长一样, SCILAB 很快就在中国交到了许多朋友。2001、2002 年连续两届的 SCILAB 研讨会分别在

LIAMA 和上海复旦大学成功召开。“2002 年 SCILAB 竞赛”在众多中国大学的参与和支持

下顺利举行,并借在北京举行的中欧信息论坛之际举行了正式的颁奖仪式。“2003 年 SCILAB竞赛”也已经圆满落幕,并于西安召开了 2003 年中-法科学计算自由软件 SCILAB 研讨会。 经过 2003,2003 两届 SCILAB 竞赛,更多的中国大学生们了解和接受了 SCILAB,竞赛

作品的水平逐年提高。现在,SCILAB 竞赛每年举办一届,影响力越来越大,让我们盼望着

更多高水平作品和更多 SCILAB 使用者的出现。也希望随着 SCILAB 在中国的传播,自由

科学软件能够逐渐为广大教育科研人员所接受和使用。

4

Page 7: scilab中文教程

Scilab 中文教程 第 * 章

最后编辑时间: 2007.7.1 本章志愿作者+维护人员:***;***;***;***

1. Scilab 基础

1.1. Scilab 概述

Scilab(Scientific Laboratory) 是以法国国立信息与自动化研究院( INRIA )的科学家为

主共同开发的“开放源码”式科学计算软件,它主要有两个功能:数值计算和计算结果可视化。 SCILAB 数据类型丰富,可以很方便地实现各种矩阵运算。 SCILAB 也能处理比数字矩阵

复杂得多的对象,例如控制专业的多项式传递函数矩阵。 SCILAB 允许用户在线建立自定

义函数。函数在 SCILAB 中被当作数据对象处理。另外 SCILAB 具有功能丰富的图形显

示能力,可以完成各种常规形式的计算结果的可视化功能。 SCILAB 为用户提供如下计算和开放式编程环境: 1 、多种容易操作的数据类型。 2 、一个作为广泛计算基础的合理有效的基本函数集。 3 、一个开放式编程环境,新的函数能很容易 地被添加。 Intersci 是一个有用的发布工具,通过它能建立接口,添加新的函数及工具箱,例如增

加新的 FORTRAN 代码和 C 代码到 SCILAB 中。 SCILAB 还包括一些应用于不同科学

计算领域的工具箱, 例如应用于数学建模、 信号处理、网络分析、决策优化、线形与非线

性控 制等多个方面的工具箱。它的工具箱允许图形定义和模拟复杂的 连续和离散的混杂系

统。 SCILAB 由 3 个独立的部分组成:一个解释器、函数库( SCILAB 程序)以及一个 FORTRAN 和 C 程序库。另外 SCILAB 是一种解释性语言,能运行于 Windows 、 Linux 以及 UNIX 等操作系统环境下。 SCILAB 与目前流行的 MATLAB 软件起源相同,都源

自于 Cleve Moler 于 1980 年开发的程序,其功能与 MATLAB 软件相似,并且表达式的

语法、函数的调用和大多数控制指令都相似。

1.2. Scilab 的运行环境与安装

1.2.1.Windows 下安装

1

Page 8: scilab中文教程

Scilab 中文教程 第 * 章

Scilab 安装初始界面

Scilab 协议界面

选择一个路径(不要选择含中文的路径)

2

Page 9: scilab中文教程

Scilab 中文教程 第 * 章

1.2.2.Linux 下安装

MAKE

1.3. Scilab 集成环境

File 菜单: -> New Scilab 打开新的 Scilab 程序 -> Exec 执行一个 Sclab 程序文件 ->Open 打开一个 Sclab 程序文件 ->Load 加载 Scilab 数据文件或者编译过的函数文件 ->Save 保存 Scilab 变量数据文件 ->Chang Directoy 改变当前的 Scilab 工作区目录 ->Get Current Directoy 得到当前的 Scilab 工作区目录 ->Print Setup 打印设置 ->Print 打印 ->Exit 退出 Edit 菜单: ->Select all 选择目前工作区所有文本 ->Copy 复制文本 ->Paste 粘贴 ->Empty Clipboard 清空剪贴板

3

Page 10: scilab中文教程

Scilab 中文教程 第 * 章

Preferences 菜单: ->Language 选择语言 ->Colors 用户可以自己定义界面的显示颜色 ->Toolbar 显示和隐藏工具栏 ->File's Association 设置文件关联 ->Choose Font 设置字体 ->Clear History 按键盘的上下键可以选择最近输入的 Scilab 命令,本选项清除最近输

入的命令提示。 ->Clear Command Window 清空屏幕显示 ->Console 打开 Scilab 命令行形式 Control 菜单 ->Resume 回复 ->Abort 取消运行 ->Interrupt 中止运行 -> -> -> Editor 菜单 打开 Scilab 程序编辑器 Applications 菜单 ->Scicos Scilab 图形化仿真模块 ->Edit Graph 编辑图形 ->M2SCI 将 Matlab 语言的命令程序转换为 Scilab 的程序 ->Browser Variables 察看当前工作区的各个变量的值,并且可以编辑 ?菜单 ->Scilab HELP 帮助 ->Configure 帮助的显示方式设置 ->Scilab Demos Scilab 功能演示 -> -> -> -> -> -> -> -> ->

4

Page 11: scilab中文教程

Scilab 中文教程 第 * 章

.sav 文件为 Scilab 变量数据文件

1.4. Scilab 帮助系统

Scilab 具有详尽的帮助文档,并且具有查找功能,可以帮助用户快速的找到所需要的内

容。

5

Page 12: scilab中文教程

Scilab 中文教程 第 * 章

后编辑时间: 2007.7.1 本章志愿作者+维护人员:刘铎

2. Scilab 数据

Scilab 具有丰富的数据类型,如整型、字符型、结构体等,以上的数据类型都以矩阵的

形式存在,所以矩阵是 Scilab 基本的数据对象。本章重点介绍 Scilab 中各种数据的表示方

法和基本运算。

2.1. Scilab 数据的特点

矩阵是 Scilab 基本的数据对象,Scilab 的大部分运算是在矩阵运算的意义下执行的。

Scilab 下的变量不需要预先定义,其直接根据第一次使用时的数据类型自动确定类型。

2.2. 变量和数据操作

2.2.1.变量命名

Scilab 中的变量命名,变量以字母开头,后接字母、数字、下划线。Scilab 中变量区分

大小写。Scilab 中函数调用时必须使用小写,否则就会出错。 ans : 当函数没有指定的输出时,结果就放在变量 ans 中

2.2.2.变量赋值

Scilab 中变量可以直接赋值,也可以使用已知变量组成的表达式赋值。 如: a = 1 b = a + 1 Scilab 命令语句后面可以不使用结束符号,但如果使用";" 则表示不在屏幕输出此项

运算显示。 Scialb 中的注释采用 "//" 只支持单行注释 Clear 命令用来清除工作区所有变量内容

1

Page 13: scilab中文教程

Scilab 中文教程 第 * 章

2.2.3.特殊变量和常数

Scilab 中预留了部分特殊常数:

%i表示虚数的单位 1− ;

%pi表示圆周率(π=3.1415927…);

%e自然对数的底(e=2.7182818…);

%eps表示机器精度(换言之%eps是使得1+%eps=1 成立的 大数);

%inf表示无穷大;

%nan表示非数字``NotANumber'' respectively.

%s表示变量为s 的零多项式,也即s=poly(0,'s');

%t表示布尔变量真(等价与 1==1);

%f表示布尔变量伪(等价与~%t)。

2.2.4.内存变量管理

Scilab 的内存便利管理使用 Browser Variables 完成。可以完成变量的察看、编辑、删除。 Scilab 工作区中的变量可以通过 Save 和 Load 命令进行保存和读取 命令 Save 文件路径 Load 文件路径 可以使用 Browser Variables 菜单或者 browsevar();命令来在变量浏览器中察看 Scilab 中预定

义的各个常数。

2

Page 14: scilab中文教程

Scilab 中文教程 第 * 章

打开变量浏览器,设置显示预定义变量。

2.3. Scilab 矩阵

2.3.1.标量

标量可以是实数或复数,生成标量的方法就是对用户自己起的变量名字进行赋值:

3

Page 15: scilab中文教程

Scilab 中文教程 第 * 章

例如:

-->a=5+2*%i

a =

5. + 2.i

-->B=-2+%i;

-->b=4-3*%i

b =

4. - 3.i

-->a*b

ans =

26. - 7.i

-->a*B

ans =

- 12. + i

注意 Scilab 的变量是区分大小写的,如上例中:

-->B

B =

- 2. + i

4

Page 16: scilab中文教程

Scilab 中文教程 第 * 章

-->b

b =

4. - 3.i

注意 在 Scilab 中,一条命令后面跟不跟分号“;”决定着是否输出该条命令的执行结果。

-->a=5+2*%i

a =

5. + 2.i

-->a=5+2*%i;

-->

2.3.2.向量的生成

生成向量的 常用方法就是在各个分量之间使用逗号(空格)隔开或者用分号隔开。

例如:

-->v=[2,-3+%i,7]

v =

2. - 3. + i 7.

-->v'

ans =

5

Page 17: scilab中文教程

Scilab 中文教程 第 * 章

2.

- 3. - i

7.

-->w=[-3;-3-%i;2]

w =

- 3.

- 3. - i

2.

-->v'+w

ans =

- 1.

- 6. - 2.i

9.

-->v*w

ans =

18.

-->w'.*v

ans =

- 6. 8. - 6.i 14.

注意 向量的各分量之间使用逗号或者空格隔开时,生成的是行向量;而用分号隔开时,

6

Page 18: scilab中文教程

Scilab 中文教程 第 * 章

生成的是列向量。

-->v=[2,-3+%i,7]

v =

2. - 3. + i 7.

-->v=[2;-3+%i;7]

v =

2.

- 3. + i

7.

空矩阵[]也是合法的向量,它有零行零列:

-->Empty=[]

Empty =

[]

注意 单引号(')给出的是向量的转置(对于复向量,计算的是复共轭转置)。例如

-->A=[1,2,3]

A =

1. 2. 3.

-->A'

ans =

1.

7

Page 19: scilab中文教程

Scilab 中文教程 第 * 章

2.

3.

-->A=[1+%i,2+2*%i]

A =

1. + i 2. + 2.i

-->A=[1+%i,2+2*%i,3+%i]

A =

1. + i 2. + 2.i 3. + i

-->A'

ans =

1. - i

2. - 2.i

3. - i

具有相同维数的向量之间可以相加和相减。具有相同维数的行向量和列向量之间也可以进行

点积运算。逐个元素之间可以进行乘法(.*)和除法(./)。

注意 空格在不同位置所起到的作用也是不同的,例如:

-->v=[1 +3]

v =

1. 3.

8

Page 20: scilab中文教程

Scilab 中文教程 第 * 章

-->w=[1 + 3]

w =

4.

-->w=[1+ 3]

w =

4.

-->u=[1, + 8- 7]

u =

1. 1.

如果要生成递增或递减的等差向量,可以采用如下的构造方法:

-->v=5:-.5:3

v =

5. 4.5 4. 3.5 3.

生成的向量以第一个值开始,第三个值结束,而第二个值则作为步长(即等差序列的差值),

缺省的步长是 1,如:

-->v=1:10

v =

1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

常值序列可以使用ones函数和zeros函数生成,如

9

Page 21: scilab中文教程

Scilab 中文教程 第 * 章

-->v=[1 5 6]

v =

1. 5. 6.

-->ones(v)

ans =

1. 1. 1.

-->ones(v')

ans =

1.

1.

1.

-->ones(1:4)

ans =

1. 1. 1. 1.

-->3*ones(1:4)

ans =

3. 3. 3. 3.

-->zeros(v)

ans =

10

Page 22: scilab中文教程

Scilab 中文教程 第 * 章

0. 0. 0.

-->zeros(1:5)

ans =

0. 0. 0. 0. 0.

注意 当ones函数或zeros函数的变量是一个向量时,执行的结果是得到一个和该向量具有相

同维数的全 1或全 0矩阵。

使用“:”生成向量 格式: 向量名称 = 初值:步长:终值 自动生成均等分的向量,默认步长为1 -->s = 1:4 s = 1. 2. 3. 4. -->s = 1:0.4:4 s = column 1 to 6 1. 1.4 1.8 2.2 2.6 3. column 7 to 8 3.4 3.8 使用 Linspace 函数生成向量 -->s = linspace(1,100,10) s = column 1 to 6

11

Page 23: scilab中文教程

Scilab 中文教程 第 * 章

1. 12. 23. 34. 45. 56. column 7 to 10 67. 78. 89. 100. 使用 Logspace 函数生成向量 -->s = logspace(1,100,10) s = 1.0D+50 * column 1 to 3 1.000D-49 1.000D-38 1.000D-27 column 4 to 6 1.000D-16 0.00001 1000000. column 7 to 9 1.000D+17 1.000D+28 1.000D+39

2.3.3.矩阵的生成

行中各分量用逗号或者空格分隔,各行之间用分号隔开。

就如通常意义上的,矩阵和标量、向量、其他矩阵之间可以进行乘法运算。

矩阵之间的加法运算、减法运算都是逐元素进行的,逐个元素之间的乘法和除法的运算符则

分别是“.*”和“./”。

-->A=[2 1 4;5 -8 2]

A =

2. 1. 4.

12

Page 24: scilab中文教程

Scilab 中文教程 第 * 章

5. - 8. 2.

-->b=ones(2,3)

b =

1. 1. 1.

1. 1. 1.

-->A.*b

ans =

2. 1. 4.

5. - 8. 2.

-->A*b'

ans =

7. 7.

- 1. - 1.

注意

ones(a,b)函数的作用是生成一个 a 行 b 列的全 1 矩阵;

zeros(a,b)函数的作用是生成一个a行b列的全 1 矩阵。

矩阵本身也可以作为更大的矩阵中的一个元素。

而且,矩阵的维数也可以变化。

-->A=[1 2;3 4]

A =

1. 2.

13

Page 25: scilab中文教程

Scilab 中文教程 第 * 章

3. 4.

-->B=[5 6;7 8];

-->C=[9 10;11 12];

-->D=[A,B,C]

D =

1. 2. 5. 6. 9. 10.

3. 4. 7. 8. 11. 12.

-->E=matrix(D,3,4)

E =

1. 4. 6. 11.

3. 5. 8. 10.

2. 7. 9. 12.

-->F=eye(E)

F =

1. 0. 0. 0.

0. 1. 0. 0.

0. 0. 1. 0.

-->G=eye(4,3)

G =

1. 0. 0.

14

Page 26: scilab中文教程

Scilab 中文教程 第 * 章

0. 1. 0.

0. 0. 1.

0. 0. 0.

注意:矩阵D就是以其他矩阵作为元素生成的;而matrix函数的作用是生成一个新的矩阵E,

其元素和矩阵D相同,但其维数是由第二个参数指定的。矩阵D中元素的排列次序是自顶而下、

自左而右的,从这个意义上讲,矩阵E中元素的排列次序和矩阵D是相同的。

eye(a,b)函数可以生成一个a行b列矩阵,其主对角线元素为 1。(函数的变量也可以是矩阵E,

此时a和b是E的维数)。

稀疏常数矩阵也可以由其中的非零元素来定义(可以通过“help sparse”指令了解具体的

细节),而由该方法定义的矩阵在使用上与通常的矩阵无异。

2.3.4.布尔矩阵

布尔变量是指%t(表示真)和%f(表示伪),它们可以用于布尔矩阵中。布尔矩阵的操作和一

般矩阵相同,例如可以连接、可以转置等。

对于布尔矩阵常用的操作符就是==和~,而且==和~还可以用于布尔矩阵的构造。

若B是一个布尔矩阵,or(B)和and(B)分别进行逻辑或运算和与运算。

-->%t

%t =

T

-->[1,2]==[1,3]

ans =

15

Page 27: scilab中文教程

Scilab 中文教程 第 * 章

T F

-->[1,2]==1

ans =

T F

-->a=1:5; a(a>2)

ans =

3. 4. 5.

-->A=[%t,%f,%t,%f,%f,%f];

-->B=[%t,%f,%t,%f,%t,%t]

B =

T F T F T T

-->A|B

ans =

T F T F T T

-->A&B

ans =

T F T F F F

当两个稀疏数值型矩阵进行比较时,其结果将生成一个稀疏的布尔矩阵。稀疏的布尔矩阵在

16

Page 28: scilab中文教程

Scilab 中文教程 第 * 章

使用上和一般布尔矩阵无异。

2.3.5.矩阵运算

下表中列出了 Scilab 里基本的矩阵操作:

符号或命令 操作

[ ] 矩阵的定义, concatenation

; 行之间的分隔符

( ) extraction m=a(k)

( ) insertion: a(k)=m

' 转置

+ 加法

- 减法

* 矩阵乘法

\ 左除

/ 右除

^ 乘幂

.* 逐个元素的相乘

.\ 逐个元素的左除

./ 逐个元素的右除

.^ 逐个元素的乘幂运算

17

Page 29: scilab中文教程

Scilab 中文教程 第 * 章

2.4. Scilab 运算

2.4.1.加法和减法

矩阵的加减运算需要参与运算的两个矩阵大小相同,然后直接可以进行运算。 C= A+B C=A-B

2.4.2.乘法运算

C = A* B 矩阵乘 C=A.*B 向量乘

2.4.3.除法运算

C= A\B 矩阵左除 C=A/B 矩阵右除

2.4.4.矩阵求逆

C = inv (A)

2.4.5.乘方运算

C = A^p 矩阵乘方 C=A.^p 向量乘方

18

Page 30: scilab中文教程

Scilab 中文教程 第 * 章

2.4.6.矩阵转秩

C = A' 布尔矩阵 字符串矩阵 多项式矩阵 表(List)类型

2.5. 字符串

Scilab 中的字符串可以直接运算 -->s ="aaa"+"bbb" s = aaabbb

2.5.1.字符串查找

i = strindex(str1,str2) -->i=strindex("abcdef","bc") i = 2.

2.5.2.大小写转换

小写变大写 -->s = convstr("abc",'u') s = ABC 大写变小写 -->s = convstr("ABC",'l') s =

19

Page 31: scilab中文教程

Scilab 中文教程 第 * 章

abc

2.5.3.字符串替换

-->strsubst('abcdef','bc','00') ans = a00def

20

Page 32: scilab中文教程

Scilab 中文教程 第 3 章

最后编辑时间: 2007.7.1 本章志愿作者+维护人员:***;***;***;***

3. Scilab 程序设计

3.1. Scilab 文件

Scilab 的程序文件是文本文件,可以用一般的编辑器建立和编辑。Scilab 自带的 scipad编辑器有更多的功能,如语法高亮等。 SCI 文件分为 2 类,命令文件和函数文件。命令文件扩展命为 SCI 或者 SCE,函数文件

的扩展名为 SCI。 命令文件可以直接使用 exec 命令执行,而函数文件是被其他程序调用,

使用前必须采用 GETF 命令加载。 命令文件中的变量为全局变量,函数文件中的变量为局部变量。 例: 编辑代码 clear a=1 b=2 c=a+b 写入 c.sci 然后执行 exec('C:\Documents and Settings\Administrator\桌面\c.sci');disp('exec done'); --> a = 1. b = 2. c = 3.

3.2. 程序控制结构

Scilab 作为一个高级的解释形语言,也提供了其它语言一样的基本程序控制语句。

3.2.1.选择结构

1

Page 33: scilab中文教程

Scilab 中文教程 第 3 章

3.2.1.1. if 语句

if 基本格式 if [表达式] 语句块 end 例如: clear a=2; if(a==2) a=a+1 end 输出 --> a = 3.

if-else if [表达式] 语句块 1 else 语句块 2 end 例 clear a=1; if(a==2) a=a+1 else a=a-1 end 输出: a = 0.

elseif

2

Page 34: scilab中文教程

Scilab 中文教程 第 3 章

if [表达式 1] 语句块 1 elseif [表达式 2] 语句块 2 end 例: clear a=3; if(a==2) a=a+1 elseif a==1 a=a-1 else a=10 end 输出 --> a = 10.

select 语句 多项选择判断,基本语法: select 表达式 0 case 表达式 1 then 语句块 1 case 表达式 2 then 语句块 2 .... case 表达式 n then 语句块 n else 语句块 n+1 end 例: a=1; b=1; c=2; select a

3

Page 35: scilab中文教程

Scilab 中文教程 第 3 章

case b then c=a+b; c=c+1; case c then c=c-1; else c=a; end disp(c); 输出 --> 3.

3.2.2.循环结构

3.2.2.1. for 语句

语法格式: for 循环变量 = 初值:步长:终值 循环体(语句块) end 缺省步长为 1,每一个 for 与一个 end 对应,允许嵌套,不允许交叉。 例: clear for a =3:2:9 c=a; disp(c); end 输出 --> 3.

4

Page 36: scilab中文教程

Scilab 中文教程 第 3 章

5. 7. 9. 以矩阵来控制循环次数 例: clear; M = [1,2,3,4]; c=0; for a=M c=c+1; disp(c); end 输出: --> 1. 2. 3. 4. 因为 Scilab 中的变量均以矩阵形式存储,因此多均可用以 For 语句控制循环次数。

3.3. 函数文件

Scilab 的函数文件的扩展名为 SCI。文件名一般为小写。第一次调用前必须使用"getf"命令把函数加载到 Scilab 命令环境。 例如:写一个函数 写入 kc.sci 文件 function c = abc(a,b) // tese c =a +b

5

Page 37: scilab中文教程

Scilab 中文教程 第 3 章

调用: -->getf("c:\kc\kc.sci") -->r = abc(3,5) r = 8. SCI 函数也允许动态建立,直接建立在命令文件中 例: clear function c = abc2(a,b) // tese c =a +b endfunction r = abc2(5,9); disp(r) 输出: --> 14.

3.4. 程序调试

6

Page 38: scilab中文教程

Scilab 中文教程 第 3 章

7

Page 39: scilab中文教程

Scilab 中文教程 第 3 章

8

Page 40: scilab中文教程

Scilab 中文教程 第 4 章

本章志愿作者+维护人员:***;***;***;*** 最后编辑时间: 2007.7.1

4. Scilab 文件操作

4.1. 文件的打开与关闭

4.2. 文件的读写操作

数据文件定位

1

Page 41: scilab中文教程

Scilab 中文教程 第 4 章

2

Page 42: scilab中文教程

Scilab 中文教程 第 5 章

本章志愿作者+维护人员:***;***;***;*** 最后编辑时间: 2007.7.1

5. Scilab 绘图

5.1. 二维数据曲线图

5.2. 其他二维图形

5.3. 三维图形

5.4. 图形修饰处理

5.5. 图像处理及动画制作

5.6. 底层绘图操作

1

Page 43: scilab中文教程

Scilab 中文教程 第 5 章

2

Page 44: scilab中文教程

Scilab 中文教程 第 5 章

3

Page 45: scilab中文教程

Scilab 中文教程 第 6 章

本章志愿作者+维护人员:***;***;***;*** 最后编辑时间: 2007.7.1

6. Scilab 数据分析与多项式计算

6.1. 数据统计处理

6.2. 数据插值

6.3. 曲线拟合

6.4. 离散傅立叶变换

6.5. 多项式计算

6.6. 稀疏矩阵

6.7. 数值积分

1

Page 46: scilab中文教程

Scilab 中文教程 第 6 章

6.8. 数值微分

6.9. 线性方程组求解

6.10. 非线性方程数值求解

6.11. 常微分方程初值问题的数值解法

6.12. 函数极值

2

Page 47: scilab中文教程

Scilab 中文教程 第 6 章

3

Page 48: scilab中文教程

Scilab 中文教程 第 7 章

本章志愿作者+维护人员:***;***;***;*** 最后编辑时间: 2007.7.1

7. Scilab解方程与函数极值

1

Page 49: scilab中文教程

Scilab 中文教程 第 7 章

2

Page 50: scilab中文教程

Scilab 中文教程 第 8 章

本章志愿作者+维护人员:***;***;***;*** 最后编辑时间: 2007.7.1

8. Scilab 数值积分与微分

1

Page 51: scilab中文教程

Scilab 中文教程 第 8 章

2

Page 52: scilab中文教程

Scilab 中文教程 第 9 章

本章志愿作者+维护人员:***;***;***;*** 最后编辑时间: 2007.7.1

9. Scilab 图形化界面设计

(期待 Scilab 5.0 Java 界面接口)

1

Page 53: scilab中文教程

Scilab 中文教程 第 9 章

2

Page 54: scilab中文教程

Scilab 中文教程 第 10 章

本章志愿作者+维护人员: 康彩 最后编辑时间: 2007.7.1

10. Scicos 图形化仿真环境

10.1. Scicos 介绍

10.2. Scicos 基本库

1

Page 55: scilab中文教程

Scilab 中文教程 第 10 章

2

Page 56: scilab中文教程

Scilab 中文教程 第 10 章

3

Page 57: scilab中文教程

Scilab 中文教程 第 10 章

4

Page 58: scilab中文教程

Scilab 中文教程 第 10 章

5

Page 59: scilab中文教程

Scilab 中文教程 第 10 章

6

Page 60: scilab中文教程

Scilab 中文教程 第 10 章

7

Page 61: scilab中文教程

Scilab 中文教程 第 10 章

10.3. Scicos 的使用

8

Page 62: scilab中文教程

Scilab 中文教程 第 10 章

10.4. Scicos 模块的添加

9

Page 63: scilab中文教程

Scilab 中文教程 第 10 章

10

Page 64: scilab中文教程

Scilab 中文教程 第 11 章

本章志愿作者+维护人员:***;***;***;*** 最后编辑时间: 2007.7.1

11. Scilab 常用工具箱

1

Page 65: scilab中文教程

Scilab 中文教程 第 11 章

11.1. 信号处理

11.1.1. 概述

11.1.2. 常用函数

11.1.3. 实例

11.2. 图像处理

11.2.1. 概述

11.2.2. 常用函数

11.2.3. 实例

11.3. 模糊系统

11.3.1. 概述

11.3.2. 常用函数

11.3.3. 实例

11.4. 神经网络系统

11.4.1. 概述

11.4.2. 常用函数

11.4.3. 实例

2

Page 66: scilab中文教程

Scilab 中文教程 第 11 章

11.5. 有限元分析

11.5.1. 概述

11.5.2. 常用函数

11.5.3. 实例

11.6. 优化计算

11.6.1. 概述

11.6.2. 常用函数

11.6.3. 实例

11.7. 小波分析

11.7.1. 概述

11.7.2. 常用函数

11.7.3. 实例

11.8. 金融分析

11.8.1. 概述

11.8.2. 常用函数

11.8.3. 实例

3

Page 67: scilab中文教程

Scilab 中文教程 第 11 章

1

本章志愿作者+维护人员: 戴凤智

最后编辑时间: 2007.7.1

11.Scilab 常用工具箱

11.2 图像处理

本节介绍广泛应用于 scilab 的图像处理工具箱 SIP (Scilab Image Processing)。它由

Ricardo Fabbri <[email protected]>开发,可以从 http://siptoolbox.sourceforge.net/ 下载

SIP 源码,安装程序及相关资料。 本节在编写过程中,特别参考了 Jocelyn Druel <[email protected]>

编写的 SIP 用户手册 <A SIP User Manual>,在此一并表示感谢。

11.2.1 概述

SIP 通过 ImageMagick 工作,因此所有 ImageMagick 能处理的图像文件形式 SIP 几乎

都可以处理。并且在 Scilab 中,图像是通过矩阵的各种操作来处理的,这给图像处理带来极

大方便。 SIP 是自由软件(GPL license),你可以使用它,修改它,传播它。只要别说这是你自

己的东西就可以了,就这么简单。 可以以两种方式下载 SIP(http://siptoolbox.sourceforge.net/)。二进制形式的文件双击

后自动安装,源码形式的需要自己编译。下载时请注意是 Windows 版还是 Linux 版。具体的

安装方法请参照下载文件包里的 install.txt 文件。 在此还要说明的是,本节只是对 SIP 的使用和常用函数做一个介绍,SIP 拥有大量函数

可供图像处理时使用,若想详细了解的话还是要看函数使用参考书(可以从 SIP 主页下载文

献,目前 0.3.0 版参考手册共有 102 页)。 当你安装完 SIP 后,会自动安装上一个简单教程。如果你想看一下例子,在启动 Scilab

和 SIP 后,请执行 exec(SIPDEMO)

会给出随 SIP 安装时带的例子。如果你想直接使用函数来进行图像处理,请继续看下文。

11.2.2 简单例子

1.读取图像文件 imread(图 1)

--〉mat = imread(‘ararauna.jpg’);

将图像文件 ararauna.jpg 读入矩阵 mat。当然如果图像文件在别的地方,就需要转换路径,

Page 68: scilab中文教程

Scilab 中文教程 第 11 章

2

--〉chdir(SIPDIR+’images’)

图 1 imread( )

读入图像文件之后所有对矩阵有效的运算均可使用。需要说明的是,使用 imread 读入图形文件后,结

果矩阵中的数字是在 0 和 1 间的实数。

2.显示图像 imshow(图 2)

--〉xbasc( ); (清除当前图形窗口)

--〉imshow(mat);

图 2 imshow( )

3.将矩阵存为图像文件 imwrite

--〉imwrite(mat, ‘/home/test.jpg’); (操作环境为 linux 时,要确保有写的权限)

4.简单的图像处理 --- 全体变暗(图 3)

--〉dmat = mat * 0.6;

--〉xset(‘window’, 2); (新开出一个图像显示窗体)

Page 69: scilab中文教程

Scilab 中文教程 第 11 章

--〉imshow(dmat);

图 3 简单图像处理

5.简单的图像处理 --- 直接在图像上划线(图 4)

--〉image = imread(SIPDIR+’images/ararauna.jpg’);

--〉[r c] = size(image); (图像文件的行数和列数)

--〉image(10, : , 1) = 1; (在图像第 10 行画一红色直线)

--〉image( : , 10, 2) =1; (在图像第 10 列画一绿色直线)

3

图 4 简单图像处理

Page 70: scilab中文教程

Scilab 中文教程 第 11 章

4

--〉imshow(image);

6.彩色图像变灰度图 im2gray(图 5)

--〉mat = imread(‘ararauna.jpg’);

--〉gmat = im2gray(mat);

--〉imshow(mat);

--〉xset(‘window‘, 1); xbasc( ); imshow(gmat);

图 5 灰度图处理

当然可以直接使用函数 gray_imread,可以将彩色图像直接转变成灰色图读入。

gmat = gray_imread(‘ararauna.jpg’);

7.二值化彩色或灰度图 im2bw(图 6)

函数 im2bw 可以将彩色或灰度图通过阀值变为 2 值图(即黑白图)。

--〉mat = imread(‘ararauna.jpg’);

--〉bmat = im2bw(mat, 0.7); (阀值为 0.7)

--〉imshow(bmat);

--〉bbmat = im2bw(mat, 0.5); (阀值为 0.5)

Page 71: scilab中文教程

Scilab 中文教程 第 11 章

5

--〉xset(‘window‘, 1); xbasc( ); imshow(bbmat);

图 6 二值化处理

11.2.3 常用函数

1.矩阵运算 前文已经说过,图像文件在 Scilab 中是通过矩阵来处理的,这里先给出矩阵的四则运算。当然两个参

加运算的矩阵应该满足矩阵四则运算的基本条件。

1.1 两个矩阵的平均

--〉mat1 = imread(‘image1.jpg’);

--〉mat2 = imread(‘image2.jpg’);

--〉mat_mean = (mat1 + mat2) / 2;

--〉xbasc( ); imshow(mat_mean);

1.2 两个矩阵相乘

--〉mat = imread(image.jpg);

--〉pmat = mat .* mat; (点积,相同坐标位置的元素相乘)

--〉tmat = mat * mat; (两个矩阵相乘)

Page 72: scilab中文教程

Scilab 中文教程 第 11 章

6

1.3 两个矩阵相加

需要强调的是,利用 imread 读入的图形文件矩阵的元素,是在 0 和 1 间的实数。因此,两个 8bit 图形

文件的相加,需要以下步骤:

--〉mat1 = imread(‘image1.jpg’);

--〉mat2 = imread(‘image2.jpg’);

--〉mat_modulo = uint8(mat1 * 255) – uint8(mat2 * 255); (模 256)

--〉mat_modulo = double(mat_modulo) / 255;

1.4

Page 73: scilab中文教程

Scilab 中文教程 第 12 章

本章志愿作者+维护人员:***;***;***;*** 最后编辑时间: 2007.7.1

12. Scilab 外部接口

12.1. C 语言接口

1

Page 74: scilab中文教程

Scilab 中文教程 第 12 章

2

Page 75: scilab中文教程

Scilab 中文教程 第 12 章

本章志愿作者+维护人员:周辛,肖瑞 最后编辑时间: 2007.7.1

12.2. Java 语言接口

Scilab 提供了 Java 语言接口,Java 语言程序开发用户如需使用 Scilab 的强大功能,只需要

将%sci-home%\bin 目录中的 javasci\*.class 文件加载进其编写的 Java 源码中就可以了。其中,

%sci-home%是指 Scilab 的安装目录。 Scilab 提供七个对象类来完成接口转换,它们是: SciComplex:用于在 Scilab 中表示复数的类 SciComplexArray:用于在 Scilab 中表示复数数组的类 SciDouble:用于在 Scilab 中表示双精度类型的类 SciDoubleArray:用于在 Scilab 中表示双精度类型数组的类 SciString:用于在 Scilab 中表示字符串的类 SciStringArray:用于在 Scilab 中表示字符串数组的类 Scilab:调用 Scilab 引擎的类 事实上,使用 Scilab 的 Java 语言接口是一件非常容易的事情。你可以将 Java 程序中任何复

杂的数学计算提交给 Scilab 去做,这只需要我们将各种类型的数据发送给 Scilab 引擎,并获

取相应的结果就可以了。因此,像 SciComplex、SciComplexArray、SciDouble、SciDoubleArray、SciString、SciStringArray 这些对象类的作用都是为了定义相应的接口传递数据类型的;而

Scilab 是一个静态类,用于连接 Scilab 引擎并进行相应的操作。我们以 SciDoubleArray 为例

介绍 javasci 的功能:

1

Page 76: scilab中文教程

Scilab 中文教程 第 12 章

1 public static void main(String[] args) { 2 3 SciDoubleArray a = new SciDoubleArray("A",4,1, new double [] {1,2,3,4} ); 4 SciDoubleArray b = new SciDoubleArray("B",4,1, new double [] {3,1,2,4} ); 5 SciDoubleArray c = new SciDoubleArray("C",4,1, new double [] {0,0,0,0} ); 6 7 Scilab.Exec("disp(A);"); 8 Scilab.Exec("disp(B);"); 9 Scilab.Exec("disp(C);"); 10 11 a.disp(); 12 b.disp(); 13 c.disp(); 14 15 Scilab.Exec("C=A+B;"); 16 a.Get(); 17 b.Get(); 18 c.Get(); 19 20 a.disp(); 21 b.disp(); 22 c.disp(); 23 24 Scilab.Finish(); 25 }

程序的 3~5 行是数据构造过程。在 Java 程序中,对象实例具有名称 a、b、c,而在 Scilab中也需要定义相应变量的名称 A、B、C。SciDoubleArray 具有三个构造器,每个构造器都

需要提供对象在 Scilab 中的变量名称。Scilab.Exec 方法是 Scilab 引擎的操作方法,所有的

Scilab 命令都可以字符串参数的方式,通过该方法提交给 Scilab 引擎。例如本例中”disp(A)”便是提交给 Scilab 的命令。Scilab 类还提供其他一些重要的方法,例如在 24 行程序结束的

时候需要调用 Scilab.Finish()断开 Java 程序与 Scilab 引擎的接口连接。Scilab 类主要负责的

正是对于 Scilab 引擎的操作,然而,各个数据类型对象实例也可以通过 Scilab 引擎对自己操

作,Job、disp、Get、Send 就是这其中的重要方法。例如:a.Job("A=rand(4,4)")操作是对象 a在 Scilab 引擎中为自己按随机数发生器赋值的过程。disp 方法的作用是显示该数据、Get 方法的作用是从 Scilab 引擎获取数据的操作,而 Send 方法的作用是从 Java 代码中发送数据到

Scilab 引擎的操作。特别注意的是,在程序 15 行,我们请求 Scilab 引擎计算"C=A+B;"的操

作,而如果 18 行”c.Get();”不存在,我们得到的就不是计算后的 C 值,因此一定要使用 Get方法获得更新的数据值。 总之,Scilab 的 Java 语言接口包括了数据类型对象和 Scilab 引擎操作两部分对象类,Java语言开发人员可以方便的使用该接口来调用 Scilab 引擎进行复杂的数学计算。

2

Page 77: scilab中文教程

Scilab 中文教程 第 13 章

本章志愿作者+维护人员:***;***;***;*** 最后编辑时间: 2007.7.1

13. Matlab 代码向 Scilab 移植

1

Page 78: scilab中文教程

Scilab 中文教程 第 13 章

2

Page 79: scilab中文教程

Scilab 中文教程 第 14 章

本章志愿作者+维护人员:***;***;***;*** 最后编辑时间: 2007.7.1

14. Scilab 并行计算

1

Page 80: scilab中文教程

Scilab 中文教程 第 14 章

2

Page 81: scilab中文教程

Scilab 中文教程 第 15 章

本章志愿作者+维护人员:于仕琪 最后编辑时间: 2007.7.1

15. Scilab 工具箱开发

1 工具箱结构 工具箱的根目录名为工具箱的名字(比如 mytoolbox),它包含 8 个子目录: * macros: Scilab 宏 (例如用 Scilab 代码写的,以.sci 为文件名扩展名的函数),buldmacros宏和 loadmacros 宏脚本。 * src: 源代码(所有的 .c 和 .f 文件),一个 buildsrc 脚本 * sci_gateway: 接口程序,和一个 buildsci_gateway * help: 英语和法语帮助,其子目录明分别为 eng 和 fr,里面包含.xml 帮助文件,buildhelp和 loadhelp 脚本。 * etc: .html, .pdf, .txt, .jpeg, ... * unit tests: .tst files (测试你的工具箱的脚本) * demos: 各种展示你的工具箱的例子。 * includes: .h 文件。 和四个文件: * readme.txt: 工具箱描述和安装说明。 * builder.sce: 主 builder * loader.sce: 主 loader * license.txt: 协议 2 子目录内的 builder 和 loader 主 builder 和主 loader 脚本运行每个子目录(如 macros,src, help 等)里的子 builder 和子 loader,来生成或者装载需要的库和帮助文件。

1

Page 82: scilab中文教程

Scilab 中文教程 第 15 章

3 宏目录 为了方便,在宏目录里的 builder 和 loader 分别命名为 buildmacros.sce 和 loadmacros.sce,当

然您也可以命名为其他的名字。 一个宏(macros)是以 Scilab 语言写的一个函数(以.sci 结尾) 假设目前我们的工具箱 mytoolbox 只包含一个.sci 文件,函数 foo1(见下面的代码)的功能

如下:输入一个方阵 A,这个函数返回向量 X,X 是 A 对角线上的正数元素。 foo1.sci function [X]=foo1(A) //这个函数返回方阵 A 对角线上的正数元素 // 检查 A 的类型和大小 if type(A)<>1 then error("type of input argument must be a double"); end if size(A,1)<>size(A,2) then error("input argument must be a square matrix"); end //提取对角线上的正数 X=[]; for i=1:size(A,1) if A(i,i)>0 then X($+1)=A(i,i); end end endfunction 3.1 builder 宏 下面的 builder 宏从 macros 目录中的.sci 文件中创建一个变量,(这儿的名字是 mytoolboxlib= toolbox_name +'lib')并保存到库文件中。下面的 builder 宏代码是通用的,它做两步操作,

第一步是找到 buildmacros.sce 所在的位置(详细内容查看 get_absolute_file_path 函数的帮

助),第二步是生成库文件(详细内容查看 genlib 函数的帮助)。 buildmacros.sce

2

Page 83: scilab中文教程

Scilab 中文教程 第 15 章

mode(-1) //在这种模式下,下面执行的代码不会显示在屏幕上 toolboxname='mytoolbox' //定义工具箱的名字 pathB=get_absolute_file_path('buildmacros.sce') //获取本文件的绝对路径 disp('Building macros in ' +pathB) //打印提示到屏幕 genlib(toolboxname+'lib',pathB,%t) //生成宏库 clear pathB genlib toolboxname //清除刚才定义的变量 请将字符串'mytoolbox'题换成你的工具箱的名字。 3.2 loader 宏 这个 loader 宏将 macros 目录中的所有 lib 都装载到 scilab。跟 builder 宏一样,它是一个通用

的脚本。它第一步确定 loadmacros.sce 文件的位置,第二步装载 lib 到 Scilab(详细内容查

看 load 函数的帮助) loadmacros.sce mode(-1) //在这种模式下,下面执行的代码不会显示在屏幕上 pathL=get_absolute_file_path('loadmacros.sce') //获取本文件的绝对路径 disp('Loading macros in ' +pathL) //打印提示到屏幕 load(pathL+'/lib') //装载 lib 到 scilab clear pathL //清除刚才定义的变量 4 接口和 src 目录 primitive 是指一个 Scilab 函数,它使用一个接口程序来调用以 C 或者 Fortran 代码写的函数。

对于每个 Scilabprimitive,我们必须为它在 sci_gateway 目录中创建对应的接口函数。 在使用 C 语言的写接口程序的情况下,当一个 Scilab primitive 被调用的时候,接口函数收

件检查输入和输出的数值,类型和大小是否正确(使用 CheckRhs 和 CheckLhs 函数),并从

Scilab 内部堆栈中获取 rhs 参数的地址,传给接口函数。 我们这里并不展开描述接口函数的所有可能情况,更多的例子请参考 SCI/examples 目录的

例程。 4.1 接口程序例程 下面一步一步的解释几个 C 语言的例子,理解了这个例子,可以帮助你写出其他的接口函

数,并添加到你的工具箱。

3

Page 84: scilab中文教程

Scilab 中文教程 第 15 章

例子 a: 假定一个程序 vectsum,它返回输入的两个向量的和。它的 C 语言函数名是 sci_sumab,在

Scilab 中调用它的命令是 sumab。 为了方便,Scilab 中的调用命令都用"sci_"开头。 下面描述了 C 语言函数 vectsum 和 sci_sumab,这两个函数当我们在 Scilab 窗口中输入--> Y=sumab(A,B )的时候被使用。 vectsum.c void vectsum(int n, double * a, double * b, double * y) { int k; for (k = 0; k < n; ++k) y[k] = a[k] + b[k]; } sci_sumab.c #include "stack-c.h" extern int vectsum(int n, double * a, double * b, double * y); void sci_sumab(char *fname){ int l1, m1, n1, l2, m2, n2, l3, n; /* 1 - Check the number of inputs/outputs arguments */ int minlhs=1, maxlhs=1, minrhs=2, maxrhs=2; CheckRhs(minrhs,maxrhs) ; CheckLhs(minlhs,maxlhs) ; /* 2 - Check inputs arguments type, and get the size and the address in the Scilab stack of the inputs arguments */ GetRhsVar(1, "d", &m1, &n1, &l1); GetRhsVar(2, "d", &m2, &n2, &l2); /* 3 - Check that the inputs arguments have the same size */ /* it's possible to use the chekdims and getscalar functions to make these checks*/ n=m2*n2; if( n1!=n2 || m1!=m2) { cerro("inputs arguments must have the same size"); return 0; }

4

Page 85: scilab中文教程

Scilab 中文教程 第 15 章

if(n1!=0 && m1!=0) if(n1!=1 && m1!=1) { cerro("inputs arguments must be vectors"); return(0); } /* 4 - Create a new variable corresponding to the output argument */ CreateVar(3,"d",&m2,&n2,&l3); /* 5 -call vectsum routine: returns in stk(l3) the sum of a and b*/ vectsum(n,stk(l1),stk(l2),stk(l3)); /* 6 - Specif ouput argument */ LhsVar(1) = 3; return 0; } 第一步: call CheckRhsVar(minrhs,maxrhs) and CheckLhsVar(minlhs,maxlhs) instructions CheckRhsVar function uses the arguments minrhs and maxrhs to check that: minrhs <= number of input arguments <= maxrhs The number of inputs and outputs arguments (respectively 2 and 1) of vectsum are constant, so minrhs=maxrhs=2 and minlhs=maxlhs=1, but for certains functions (see example2) they can be variable, in this case the variables minrhs/minlhs and maxrhs/maxlhs are different. We can use directly the defined variables Rhs(=number of inputs) and Lhs(=number of outputs) instead of the functions CheckRhsVar and CheckLhsVar. 第二步: call GetRhsVar(1,"d",&m1,&n1,&l1) instruction GetRhsVar function checks that the type of inputs arguments of sumab are correct, and gets their size and their address in the Scilab stack. We describe below all arguments of GetRhsVar function: * 1 : corresponds to the position on the stack of the first input argument of sumab, i.e A, (2 corresponds to B,...) * m1 : gets the rows number of A (m2 for B) * n1 : gets the columns number of A (n2 for B) * l1 : gets the address of A in the Scilab stack (l2 for B) 第三步: call CreateVar(3,"d",&m2,&n2,&l3) instruction CreateVar function creates in the Stack at the 3th position a variable which corresponds to the

5

Page 86: scilab中文教程

Scilab 中文教程 第 15 章

output argument of vectsum (here Y) * 3 : position of the created variable in the stack. This position (here 3) must follows the position of the last input argument (here2) of sumab * "d": sets the type of the created variable, here double * m2: sets the rows number of the created variable(here equal to the rows number of the second input argument B: m2) * n2: sets the columns number of the first created variable (here equal to the columns number of the second input argument B: n2) * l3: gets the address of the created variable in the Scilab stack 第四步: call vectsum(n,stk(l1),stk(l2),stk(l3)) instruction The C function vectsum returns in stk(l3) the sum of stk(l1) and stk(l2) (i.e a and b) 第六步: call LhsVar(1) = 3 instruction The first output argument (here Y) of sumab takes the value of the variable placed in the 3th position on the stack (i.e stk(l3)) 例子 b: In the second example we describe the interface program named sci_fun of the Scilab primitive named fun. This function call the C routines fun1 and fun2 and has 2 syntaxes which are: First syntax: --> [X, Y ]=fun(A); Given a vector A, this function returns the positives components of A in a vector X and the sum of its positives components in a scalar Y. Second syntax: --> [X ]=fun(A); Given a vector A, this function returns the positives components of A in a vector X. The number of outputs arguments (i.e Lhs value) is variable: for the first syntax Lhs=1, for the second syntax Lhs=2. The number of intputs arguments (i.e Rhs value) is constant: Rhs=1 (first and second syntax). So the interface program must check that: 1<=Lhs<=2 (set minlhs=1, maxlhs=2) and Rhs=1 (set minrhs=maxrhs=1) fun1.c (the C function fun1 creates the vector X and the scalar Y. It calls the C function fun2 to get the needed size of X in order to allocate the corresponding memory place) extern void fun2(double *, int, int *);

6

Page 87: scilab中文教程

Scilab 中文教程 第 15 章

void fun1(double * a, int na, int * nx, double ** x , double * y){ int i, k1=0; *y=0; fun2(a, na, nx); *x=(double *)malloc((*nx)*sizeof(double)); *y=0; for(i=0;i<na;i++) if(a[i]>0) { *(*x+k1)=a[i]; *y += a[i]; k1++; }; } fun2.c void fun2(double * a, int na, int * nx) { int i; *nx=0; for(i=0;i<na;i++) if (a[i]>0) (*nx)++; } sci_fun.c #include "stack-c.h" extern void fun1(double * , int, int *, double **, double *); int sci_fun(char *fname) { int la, ma, na, m=1, nx, i, lx, ls; double * x, s; /* 1 - Check the number of inputs and outputs arguments */ /* You can use the variables: Lhs and Rhs */ int minlhs=1, maxlhs=2, minrhs=1, maxrhs=1; CheckRhs(minrhs,maxrhs) ; CheckLhs(minlhs,maxlhs) ; /* 2 - Check the rhs type, get the rows number (ma) and the columns number (na) of rhs, and its address (la) in the Scilab stack (first position) */

7

Page 88: scilab中文教程

Scilab 中文教程 第 15 章

GetRhsVar(1, "d", &ma, &na, &la); /* 3 - Check rhs is a vector */ if(ma!=0 && na!=0 ) { if(ma!=1 && na!=1) { cerro("input argument must be a vector"); return(0); } } fun1(stk(la), na*ma, &nx, &x, &s); /* 4 - Create the place for the first output argument x ( a vector of doubles, size: 1*nx ) to the address lx in the Scilab stack (second position) */ CreateVar(2, "d", &m, &nx, &lx); /* if there are two outputs variables then: Create the place for the second output s ( a double, size 1*1) to the address ls in the Scilab stack (third position) */ /* get the value of s, and put it in the Scilab stack */ if(Lhs==2) { CreateVar(3, "d", &m, &m, &ls); *stk(ls)=s; } /* get the components of x, and put them in the Scilab stack */ for(i=0;i<nx;i++) stk(lx)[i]=x[i]; /* free memory */ free(x); /* 5 - Specification of outputs variables */ LhsVar(1) = 2; if(Lhs==2) LhsVar(2) = 3; return 0; }

8

Page 89: scilab中文教程

Scilab 中文教程 第 15 章

4.2 基本的 builder 现在 src和 sci_gateway包含了所有为primitives fun和 sumab创建builder所需要的文件(fun1.c, fun2.c, sci_fun.c, vectsum.c, sci_sumab.c) 。 我们需要撰写两个 builder: * 一是在 src 目录中,builder(叫做 buildersrc)需要创建一系列跟 C 语言函数对应的共

享库(请参考 ilib_for_link 函数帮助)。 * 另一个是在 interface 目录中, builder(叫做 buildsci_gateway)创建新的共享库来连

接已经编译好的 C 或者 Fortran 语言的接口,并生成 loader(参考 ilib_build 函数帮助)。这

个 loader 文件调用 addinter 函数,加载动态连接库到 Scilab(参考 addinter 函数帮助)。 buildsrc.sce ilib_for_link('mytoolboxsrc',['fun1.o' 'fun2.o','vectsum.o'],[],"c") buildsci_gateway.sce // must be run from this directory ilib_name = 'libmytoolbox' // interface library name files = ['sci_fun.o', 'sci_sumab.o']; // objects files libs = ["../src/libmytoolboxsrc"] // other libs needed for linking table = [ 'fun', 'sci_fun'; 'sumab','sci_sumab']; // table of (scilab_name,interface-name) // do not modify below ilib_build(ilib_name,table,files,libs) The ilib_name value is the interface library name, the vector files contains all the object interface files, the vector libs contains the libraries needed for linking (here the library included in the src directory), the variable table contains the primitives names (first column) and the corresponding interfaces programs names (second column) 5 帮助目录 这个子目录里包含.xml 文件,buildhelp 脚本和 loadhelp 脚本。

9

Page 90: scilab中文教程

Scilab 中文教程 第 15 章

在 Unix/Linux 系统中,你需要 sabcmd 来创建帮助手册,它是 Sablotron 软件包的一部分,

是 一 个 XML 语 言 解 析 器 。 可 以 从 这 儿 下 载 :

http://www.scilab.org/download/index_download.php?page=related_tool.html 5.1 创建.xml 文件 这儿是一个模板,用来展示如何撰写.xml 帮助文件。你需要做的只是为你的函数的.xml 文

件填充各个项目的内容(如 Langage,title,type,date, short description,……),并将他

们放入 help 目录中。 <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> <!DOCTYPE MAN SYSTEM "/home/scilab/scilab-3.0/man/manrev.dtd"> <MAN> <LANGUAGE>eng</LANGUAGE> <TITLE>sumab</TITLE> <TYPE>Scilab Function </TYPE> <DATE>20-Mar-2006</DATE> <SHORT_DESCRIPTION name="add function name"> add short decription here</SHORT_DESCRIPTION> <CALLING_SEQUENCE> <CALLING_SEQUENCE_ITEM>add function syntax</CALLING_SEQUENCE_ITEM> </CALLING_SEQUENCE> <PARAM> <PARAM_INDENT> <PARAM_ITEM> <PARAM_NAME>add param name</PARAM_NAME> <PARAM_DESCRIPTION> <SP> : add here the parameter description </SP> </PARAM_DESCRIPTION> <PARAM_ITEM> <PARAM_NAME>add param name</PARAM_NAME> <PARAM_DESCRIPTION> <SP> : add here the parameter description </SP> </PARAM_DESCRIPTION>

10

Page 91: scilab中文教程

Scilab 中文教程 第 15 章

</PARAM_ITEM> </PARAM_INDENT> </PARAM> <DESCRIPTION> <DESCRIPTION_INDENT> <DESCRIPTION_ITEM> <P> Add here a paragraph of the function description. Other paragraph can be added </P> </DESCRIPTION_ITEM> <DESCRIPTION_ITEM> <P> Add here a paragraph of the function description </P> </DESCRIPTION_ITEM> </DESCRIPTION_INDENT> </DESCRIPTION> <EXAMPLE><![CDATA[ Add here scilab instructions and comments ]]></EXAMPLE> <SEE_ALSO> <SEE_ALSO_ITEM> <LINK> add a key here</LINK> </SEE_ALSO_ITEM> <SEE_ALSO_ITEM> <LINK> add a key here</LINK> </SEE_ALSO_ITEM> </SEE_ALSO> <BIBLIO> <Add here the function bibliography if any </BIBLIO> <AUTHORS> <AUTHORS_ITEM label='enter here the author name'> Add here the author references </AUTHORS_ITEM> </AUTHORS> <USED_FUNCTIONS> Add here the used function name and references </USED_FUNCTIONS>

11

Page 92: scilab中文教程

Scilab 中文教程 第 15 章

</MAN> 5.2 帮助 builder builder 脚本(这儿是 buildhelp.sce)创建一个 whatis.htm 文件,里面是所有函数的简短描述,

并将.xml 文件转换为.html 文件(更多信息请查阅 xmltohtml 函数帮助)。 > function) buildhelp.sce mode(-1) //强制进入 slient 模式,不显示执行的代码在屏幕 path=get_absolute_file_path('builhelp.sce'); //得到这个文件的绝对路径 add_help_chapter("Title1",path); //将帮助添加到帮助章节中 xmltohtml(path,"Title1") //将 xml 转为 html clear path add_help_chapter get_absolute_file_path //清除无用的变量 5.3 帮助 loader 帮助 loader(这儿是 loadhelp.sce)添加你的函数帮助文档到 Scilab 的帮助浏览器中。 loadhelp.sce mode(-1) //强制进入 slient 模式,不显示执行的代码在屏幕 path=get_absolute_file_path('loadhelp.sce');//得到这个文件的绝对路径 add_help_chapter("Title1",path);//加载帮助 clear path add_help_chapter get_absolute_file_ 5.4 总 builder 和总 loader 总的 builder 和 loader 在顶层执行,他们去调用每个子 builder 和子 loader,下面的是这两个

脚本的例子: builder.sce mode(-1); mainpathB=get_absolute_file_path('builder.sce'); chdir(mainpathB); if isdir('src') then //如果存在 src 目录 chdir('src'); //进入 src 目录

12

Page 93: scilab中文教程

Scilab 中文教程 第 15 章

exec('buildsrc.sce'); //执行 src 目录里的 builder.sce chdir('..'); //回到上一层目录 end //end if;下面类似 if isdir('sci_gateway') then chdir('sci_gateway'); exec('buildsci_gateway.sce'); chdir('..'); end if isdir('macros') then chdir('macros'); exec('buildmacros.sce'); chdir('..'); end if isdir('help') then chdir('help'); exec('buildhelp.sce'); chdir('..'); end clear mainpathB loader.sce mode(-1); mainpathL=get_absolute_file_path('loader.sce'); chdir(mainpathL); if isdir('sci_gateway') then chdir('sci_gateway'); exec('loader.sce'); chdir('..'); end if isdir('macros') then chdir('macros'); exec('loadmacros.sce'); chdir('..'); end if isdir('help') then chdir('help'); exec('loadhelp.sce'); chdir('..'); end clear mainpathL

13

Page 94: scilab中文教程

Scilab 中文教程 第 15 章

5.5 上传你的工具箱 * 阅读下面连接里如何贡献代码的说明: http://www.scilab.org/contrib/index_contrib.php?page=howto.html * 将你的工具箱打包并压缩成一个文件,比如是 mytoolbox.zip. * 通 过 这 个 链 接 上 传 你 的 工 具 箱 及 其 工 具 箱 的 相 关 说 明 :

http://www.scilab.fr/contrib/index_contrib.php?page=upload.html 另外,建议使用 http://sourceforge.net 或者其他类似的开源平台来管理工具箱代码。

SourceForge.net 网站提供了管理软件的版本控制系统(SVN 和 CVS),主页空间,发布系统,

Bug 管理系统。它不仅可以让你的软件管理更规范,而且会让更多的人知道你的工具箱,让

更多的人受益于你的劳动成果。

14

Page 95: scilab中文教程

Scilab 中文教程 第 16 章

本章志愿作者+维护人员:***;***;***;*** 最后编辑时间: 2007.7.1

16. Scilab 应用实例

16.1. Scilab 在模拟电路分析中的应用

16.1.1. 概述

16.1.2. 实例

16.2. Scilab 在数字电路设计中的应用

16.2.1. 概述

Scicos Hardware Description Language Tools (Scicos-HDL 0.4) Scicos 硬件设计工具箱 Scicos-HDL 是一个在 Scilab/Scicos 下仿真和设计硬件电路的工具,开发历时 3 年

(2004-2007)时间,可以运行在 Linux 和 Windows 平台。我们在原来 Scicos 元件库的基础上 新增了 4 个硬件电路仿真和测试库,包括 50 多个硬件电路仿真元件和 VHDL、verilog 语言

编译器模块。当前的 Scicos-HDL0.4 版可以完成组合逻辑电路设计、时序逻辑电路设计和基

本的数字信号处理,支持 VHDL、verilog 2 种硬件描述语言,支持自动文档生成,并且生成

的 HDL 代码均为可综合。本项目遵从 LGPL 协议发行,目前作为 Scicos 的一个子项目,已

经加入到 Scicos 开发计划。 项目发布网址:http://scicoshdl.sourceforge.net

16.2.2. 实例

1

Page 96: scilab中文教程

Scilab 中文教程 第 16 章

16.3. == 期待进一步添加

2

Page 97: scilab中文教程

Scilab 中文教程 第 16 章

3

Page 98: scilab中文教程

Scilab 中文教程 第 * 章

本章志愿作者+维护人员:***;***;***;***

附录 Scilab 常用命令与函数分类索引表

scilab部分函数

1. 通用指令

help 在线帮助

apropos 文档中关键词搜寻

ans 缺省变量名以及 新表达式的运算结果

clear 从内存中清除变量和函数

exit 关闭SCILAB

quit 退出SCILAB

save 把内存变量存入磁盘

exec 运行脚本文件

mode 文件运行中的显示格式

getversion 显示SCILAB版本

ieee 浮点运算溢出显示模式选择

who 列出工作内存中的变量名

edit 文件编辑器

type 变量类型

what 列出SCILAB基本命令

format 设置数据输出格式

chdir 改变当前工作目录

getenv 给出环境值

mkdir 创建目录

pwd 显示当前工作目录

evstr 执行表达式

2.运算符和特殊算符

- 减

* 矩阵乘

.* 数组乘

^ 矩阵乘方

.^ 数组乘方

反斜杠或左除

/ 斜杠或右除

./或. 数组除

== 等号

~= 不等号 < 小于

1

Page 99: scilab中文教程

Scilab 中文教程 第 * 章

> 大于

= 大于或等于

&,and 逻辑与

|,or 逻辑或

~,not 逻辑非

: 冒号

( ) 园括号

[ ] 方括号

{ } 花括号

. 小数点

, 逗号

; 分号

// 注释号

= 赋值符号

' 引号

' 复数转置号

.' 转置号

ans 新表达式的运算结果

%eps 浮点误差容限,

%i 虚数单位 = √(-1)

%inf 正无穷大

%pi 圆周率, π=3.1415926535897.... 3. 编程语言结构

abort 中止计算或循环

break 终止 内循环

case 同select一起使用

continue 将控制转交给外层的for或while循环

else 同if一起使用

elseif 同if一起使用

end 结束for,while,if 语句

for 按规定次数重复执行语句

if 条件执行语句

otherwise 可同switch一起使用

pause 暂停模式

return 返回

select 多个条件分支

then 同if一起使用

while 不确定次数重复执行语句

eval 特定值计算

feval 函数特定值计算或多变量计算

function 函数文件头

global 定义全局变量

isglobal 检测变量是否为全局变量

2

Page 100: scilab中文教程

Scilab 中文教程 第 * 章

error 显示错误信息

lasterror 显示 近的错误信息

sprintf 按格式把数字转换为串

warning 显示警告信息

4.基本数学函数

acos 反余弦

acosh 反双曲余弦

acot 反余切

acoth 反双曲余切

acsc 反余割

acsch 反双曲余割

asin 反正弦

asinh 反双曲正弦

atan 反正切

atanh 反双曲正切

cos 余弦

cosh 双曲余弦

cotg 余切

coth 双曲余切

sin 正弦

sinh 双曲正弦

tan 正切

tanh 双曲正切

exp 指数

log 自然对数

log10 常用对数

log2 以2为底的对数

sqrt 平方根

abs 绝对值

conj 复数共轭

imag 复数虚部

real 复数实部

ceil 向上(正无穷大方向)取整

fix 向零方向取整

floor 向下(负无穷大方向)取整

round 四舍五入取整

sign 符号函数

gsort 降次排序

erf 误差函数

erfc 补误差函数

gamma gamma函数

interp 插值函数

interpln 线性插值函数

intsplin 样条插值函数

3

Page 101: scilab中文教程

Scilab 中文教程 第 * 章

smooth 样条平滑函数

spline 样条函数

quarewave 方波函数

sign 符号函数

double 将整数转换为双精度浮点数

5.基本矩阵函数和操作

eye 单位阵

zeros 全零矩阵

ones 全1 矩阵

rand 均匀分布随机阵

genmarkov 生成随机Markov矩阵

linspace 线性等分向量

logspace 对数等分向量

logm 矩阵对数运算

cumprod 矩阵元素累计乘

cumsum 矩阵元素累计和

toeplitz Toeplitz 矩阵

disp 显示矩阵和文字内容

length 确定向量的长度

size 确定矩阵的维数

diag 创建对角阵或抽取对角向量

find 找出非零元素1的下标

matrix 矩阵变维

rot90 矩阵逆时针旋转90度

sub2ind 据全下标换算出单下标

tril 抽取下三角阵

triu 抽取上三角阵

conj 共轭矩阵

companion 伴随矩阵

det 行列式的值

norm 矩阵或向量范数

nnz 矩阵中非零元素个数

null 清空向量或矩阵中的某个元素

orth 正交基

rank 矩阵秩

trace 矩阵迹

cond 矩阵条件数

rcond 逆矩阵条件数

inv 矩阵的逆

lu LU分解或高斯消元法

pinv 伪逆

qr QR分解

givens Givens变换

linsolve 求解线性方程

4

Page 102: scilab中文教程

Scilab 中文教程 第 * 章

lyap Lyapunov方程

hess Hessenberg 矩阵

poly 特征多项式

schur Schur 分解

expm 矩阵指数

expm1 矩阵指数的Pade逼近

expm2 用泰勒级数求矩阵指数

expm3 通过特征值和特征向量求矩阵指数

funm 计算一般矩阵函数

logm 矩阵对数

sqrtm 矩阵平方根

6. 特性值与奇异值

spec 矩阵特征值

gspec 矩阵束特征值

bdiag 块矩阵, 广义特征向量

eigenmarkov 正则化Markov特征向量

pbig 特征空间投影

svd 奇异值分解

sva 奇异值分解近似

7. 矩阵元素运算

cumprod 元素累计积

cumsum 元素累计和

hist 统计频数直方图

max 大值

mean 平均值

median 中值

min 小值

prod 元素积

sort 由大到小排序

std 标准差

sum 元素和

trapz 梯形数值积分

corr 求相关系数或方差

8. 稀疏矩阵运算

sparse 稀疏矩阵(只存储非零元素)

adj2sp 邻接矩阵转换为稀疏矩阵

full 稀疏矩阵转换为全矩阵

mtlb_sparse 将SCILAB稀疏矩阵转换为MATLAB稀疏矩阵格式

sp2adj 稀疏矩阵转换为邻接矩阵

speye 稀疏矩阵方式单位阵

sprand 稀疏矩阵方式随机矩阵

5

Page 103: scilab中文教程

Scilab 中文教程 第 * 章

spzeros 稀疏矩阵方式全零阵

lufact 稀疏矩阵LU分解

lusolve 稀疏矩阵方程求解

spchol 稀疏矩阵Cholesky分解

9. 输入输出函数

diary 生成屏幕文本记录

disp 变量显示

file 文件管理

input 用户键盘输入

load 读已存的变量

mclose 关闭文件

mget 读二进制文件

mgetl 按行读ASCII码文件

mgetstr 读字符串中单个字

mopen 打开文件

mput 写二进制文件

mfscanf 读ASCII码文件

print 将变量记录为文件

read 读矩阵变量

save 存变量为二进制文件

strartup 启动文件

write 按格式存文件

xgetfile 对话方式获取文件路径

x_dialog 建立Xwindow参数输入对话框

Tk_Getvar 得到Tk文件变量

Tk_EvalFile 执行Tk文件

10. 函数与函数库操作

deff 在线定义函数

edit 函数编辑器

function 打开函数定义

functions SCILAB函数或对象

genlib 在给定目录下建立所有文件的

函数库

get_function_path 读函数库的文件存储目录路径

getd 读函数库中的全部文件

getf 在文件中定义一个函数

lib 函数库定义

macro SCILAB函数或对象

macrovar 输入变量个数

newfun 输出变量个数

11. 字符串操作

6

Page 104: scilab中文教程

Scilab 中文教程 第 * 章

code2str 将SCILAB数码转换为字符串

convstr 字母大小转换

emptystr 清空字符串

grep 搜寻相同字符串

part 字符提取

str2code 将字符串转换为SCILAB数码

string 字符串转换

strings SCILAB对象, 字符串

strcat 连接字符

strindex 字符串的字符位置搜寻

strsubst 字符串中的字符替换

12. 日期与时间

date 日期

getdate 读日期与时间

timer CPU时间计时

13. 二维图形函数

plot2d 直角坐标下线性刻度曲线

champ 2维向量场

champ1 由颜色箭头表示的2维向量场

contour2d 等高线图

errbar 曲线上增加误差范围框线条

grayplot 应用颜色表示的表面

xgrid 画坐标网格线

histplot 统计频数直方图

Matplot 散点图阵列

14. 三维图形函数

plot3d 三维表面

plot3d1 用颜色或灰度表示的三维表面

param3d 三维中单曲线

param3d1 三维中多曲线

contour 三维表面上的等高线图

hist3d 三维表示的统计频数直方图

geom3d 三维向二维上的投影

15. 线条类图形

xpoly 单线条或单多边形

xpolys 多线条或多各多边形

xrpoly 正多边形

xsegs 非连接线段

xfpoly 单个多边形内填充

xfpolys 多个多边形内填充

7

Page 105: scilab中文教程

Scilab 中文教程 第 * 章

xrect 矩形

xfrect 单个矩形内填充

xrects 多个矩形内填充

xarc 单个弧线段或弧园

xarcs 多个弧线段或弧园

xfarc 单个弧线段或弧园填充

xfarcs 多个弧线段或弧园填充

xarrows 多箭头

16. 图形注释, 变换

xstring 图形中字符

xstringb 框内字符

xtitle 图形标题

xaxis 轴名标注

plotframe 图形加框并画坐标网格线

isoview 等尺寸比例显示(原图形窗口不改变)

square 等尺寸比例显示(原图形窗口改变)

xsetech 设置小窗口

xchange 转换实数为图形象素坐标值

subplot 设置多个子窗口

17. 图形颜色及图形文字

colormap 应用颜色图

getcolor 交互式选择颜色图

addcolor 增加新色于颜色图

graycolormap 线性灰度图

hotcolormap 热色(红到黄色)颜色图

xset 图形显示方式设定

xget 读当前图形显示方式设定

getsymbol 交互式选择符号和尺寸

18. 图形文件及图形文字

xsave 将图形存储为文件

xload 从磁盘中读出图形文件

xbasimp 将图形按PS文件打印或存储为文件

xs2fig 将图形生成Xfig 格式文件

xbasc 取消图形窗及其相关内容

xclear 清空图形窗

driver 选择图形驱动器

xinit 图形驱动器初始化

xend 关闭图形

xbasr 图形刷新

replot 更改显示范围后的图形刷新

xdel 关闭图形

8

Page 106: scilab中文教程

Scilab 中文教程 第 * 章

xname 改变当前图形窗名称

19. 控制分析用图形

bode 伯德图坐标

gainplot 幅值图坐标(伯德图中的幅值图)

nyquist 奈奎斯特图

m_circle M-圆图

chart 尼库拉斯图

black Black-图

evans 根轨迹图

sgrid s平面图

plzr 零-极点图

zgrid z平面图

20. 图形应用中的其它指令

graphics 图形库指令表

xclick 等待鼠标在图形上的点击输入

locate 由鼠标点击读入图形中的多点位置坐标

xgetmouse 由鼠标点击读入图形中的当前点位置坐标

21. 系统与控制

abcd 状态空间矩阵

cont_mat 可控矩阵

csim 线性系统时域响应

dsimul 状态空间的离散时域响应

feedback 反馈操作符

flts 时域响应(离散、采样系统〕

frep2tf 基于传递函数的频域响应

freq 频域响应

g_margin 幅值裕量

imrep2ss 基于状态空间的脉冲响应

lin 线性化操作

lqe Kalman滤波器

lqg LQG补偿器

lqr LQ补偿器

ltitr 基于状态空间的离散时域响应

obscont 基于观测器的控制器

observer 观测器

obsv_mat 观测矩阵

p_margin 相位裕量

phasemag 相位与幅值计算

ppol 极点配置

repfreq 频域响应

ricc Riccati 方程

9

Page 107: scilab中文教程

Scilab 中文教程 第 * 章

rtitr 基于传递函数的离散时域响应

sm2ss 系统矩阵到状态空间变换

ss2ss 反馈连接的状态空间到状态空间变换

ss2tf 状态空间到传递函数变换

stabil 稳定性计算

tf2ss 传递函数到状态空间变换

time_id SISO系统 小方差辨识

22. 鲁棒控制

augment 被控对象增广操作

bstap Hankel 矩阵近似

ccontrg H控制器

dhnorm 离散H范数

h2norm H范数

h_cl 闭环矩阵

h_inf H∞控制器

h_norm H范数

hankelsv Hankel矩阵奇异值

leqr H控制器的LQ增益

linf 无穷范数

riccati Riccati矩阵

sensi 敏感函数

23. 动态系统

arma ARMA模型

arma2p 基于AR模型中获得多项式矩阵

armac ARMAX辨识

arsimul ARMAX系统仿真

noisegen 噪声信号发生器

odedi 常微分方程仿真检测

prbs_a 伪随机二进制序列发生器

reglin 线性拟合

24. 系统与控制实例

artest Arnold 动态系统

bifish 鱼群人口发展的离散时域模型

boucle 具有观测器的动态系统相位图

chaintest 生物链模型

gpech 渔业模型

fusee 登陆火箭问题

lotest Lorennz吸引子

mine 采矿问题

obscontl 可控可观系统

portr3d 三维相位图

10

Page 108: scilab中文教程

Scilab 中文教程 第 * 章

portrait 二维相位图

recur 双线性回归方程

systems 动态系统

tangent 动态系统的线性化

tadinit 动态系统的交互初始化

25. 非线性工具(优化与仿真〕

bvode 边界值问题的常微分方程

dasrt 隐式微分方程过零解

dassl 代数微分方程

datafit 基于测量数据的参数辨识

derivative 导数计算

fsolve 非线性函数过零解

impl 线性微分方程

int2d 二维定积分

int3d 三维定积分

intg 不定积分

leastsq 非线性 小二乘法

linpro 线性规划

lmisolver 线性不等矩阵

ode 常微分方程

ode_discrete 离散常微分方程

ode_root 常微分方程根解

odedc 连续/离散常微分方程

optim 非线性优化

quapro 线性二次型规划

semidef 半正定规划

26. 多项式计算

coeff 多项式系数

coffg 多项式矩阵逆

degree 多项式阶数

denom 分母项

derivat 有理矩阵求导

determ 矩阵行列式值

factors 因式分解

hermit Hermit 型

horner 多项式计算

invr 有理矩阵逆

lcm 小公倍数

ldiv 多项式矩阵长除

numer 分子项

pdiv 多项式矩阵除

pol2des 多项式矩阵到表达式变换

11

Page 109: scilab中文教程

Scilab 中文教程 第 * 章

pol2str 多项式到字符串变换

polfact 小因式

residu 余量

roots 多项式根

simp 多项式化简

systmat 系统矩阵

27. 信号处理

%asn 椭圆积分

%k Jacobi 完全椭圆积分

%sn Jacobi 椭圆函数

analpf 模拟量低通滤波器

buttmag Butterworth 滤波器响应

cepstrum 倒谱计算

cheb1mag Chebyshev 一型响应

cheb2mag Chebyshev 二型响应

chepol Chebyshev 多项式

convol 卷积

corr 相关, 协方差

cspect 谱估计(应用相关法)

dft 离散富立叶变换

fft 快速富立叶变换

filter 滤波器建模

fsfirlin FIR滤波器设计

hank 协方差矩阵到Hankel矩阵变换

hilb Hilbert 变换

iir IIR数字滤波器

intdec 信号采样率更改

kalm Kalman 滤波器更新

mese 大熵谱估计

mfft 多维快速富立叶变换

mrfit 频率响应拟合

phc Markov 过程

srkf Kalman 滤波器平方根

sskf 稳态 Kalman 滤波器

system 观测更新

wfir 线性相位FIR滤波器

weiener Weiener(维纳)滤波器

window 对称窗函数

yulewalk 小二乘滤波器

zpbutt Buthererworth 模拟滤波器

zpch1 Chebyshev 模拟滤波器

28. 音频信号

12

Page 110: scilab中文教程

Scilab 中文教程 第 * 章

analyze 音频信号频域图

auread 读 *.au 音频文件

auwrite 写 *.au 音频文件

lin2mu 将线性信号转换为μ率码信号

loadwave 取 *.wav 音频文件

mapsound 音频信号图示

mu2lin 将μ率码信号转换为线性信号

playsnd 音频信号播放

savewave 存 *.wav 音频文件

wavread 读 *.wav 音频文件

wavwrite 写 *.wav 音频文件

29. 语言与数据转换工具

ascii 字符串的ASCII码

excel2sci 读ASCII格式的Excel文件

fun2string 将SCILAB函数生成ASCII码

mfile2sci 将MATLAB的M格式文件转换为SCI格式文件

mtlb_load 取MATLAB第4版本文件中变量

matlb_save 按MATLAB第4版本文件格式存变量

pol2tex 将多项式转换为TeX格式

sci2for 将SCILAB函数转换为FORTRAN格式文件

texprint 按TeX格式输出SCILAB对象

translatepaths 将子目录下的所有 MATLAB 文件转换为 SCI 文件格式

参考文献

相关网站

13

Page 111: scilab中文教程

Scilab 中文教程 第 * 章

14

Page 112: scilab中文教程

Scilab 中文教程 第 * 章

15