第一章 概述 1.1 MATLAB简介及安装 1.2 MATLAB的目录结构 1.3 MATLAB的工作环境 1.4 MATLAB的通用命令 习 题 MATLAB将计算、可视化和编程等功能集于一个易于使用的环境,并遇有如下特点: 功能强大; 简单易学; 编程效率高。
1.1 MATLAB简介及安装 1.MATLAB的发展历程 1980年,美国新墨西哥大学计算机科学系主任Cleve 着 手编写供学生使用的子程序接口程序,取名为MATLAB; 1984年,推出了MATLAB第一个商业版本; 1992年,推出MATLAB 4.0版; 1997年,推出MATLAB 5.0版; 2000年,推出MATLAB 6.0版; 2004年,推出MATLAB 7.0版; 2008年,推出MATLAB 7.6版;
2.MATLAB的特点 开发环境 编程 数值处理 图形化 图形用户界面 文件I/O和外部应用程序接口
3.MATLAB的安装 MATLAB对PC系统的要求
安装MATLAB后,在安装目录下将包含如下文件夹。
续表
1.3 MATLAB的工作环境 MATLAB工作环境
1.菜单和工具栏 【Debug】菜单用于调试程序。 【Desktop】菜单用于设置主窗口中需要打开的窗口。 这里只简单介绍默认情况下的菜单和工具栏。 【File】菜单主要用于对文件的处理。 【Edit】菜单主要用于复制、粘贴等操作,与一般Windows 程序的类似,在此不作详细介绍。 【Debug】菜单用于调试程序。 【Desktop】菜单用于设置主窗口中需要打开的窗口。 【Window】菜单列出当前所有打开的窗口。 【Help】菜单用于选择打开不同的帮助系统。
当用户单击“Current Directory”窗口时,使得该窗口成 为活动窗口,同时增加一个如下图所示的菜单【View】,用 于设置如何显示当前目录下的文件。
当用户单击“Workspace”窗口时,使得该窗口成为活动 窗口,同时增加如下图所示的菜单【View】和【Graphics】。
2.命令窗口 MATLAB命令窗口中的“>>”为运算提示符,表 MATLAB处于准备状态。 当在提示符后输入一段程序或一段运算式后【Enter】键,MATLAB会给出计算结果,并再次进入准备状态(所得结果将被保存在工作空间窗口中)。 单击命令窗口右上角的“ ”按钮,可以使命令窗口脱离主窗口而成为一个独立的窗口。
3.历史命令窗口 保留自安装后所有使用过命令的历史记录,并标明使用时间; 可以通过用鼠标双击某一历史命令来重新执行该命令; 通过上下文菜单,可删除或粘贴历史记录; 可为选中的表达式或命令创建一个M文件; 可为表达式或命令创建快捷按钮。
4.当前工作目录窗口 当前工作目录是指MATLAB运行文件时的目录。只有 在当前工作目录或搜索路径下的文件、函数可以被运行或 调用。
5.工作空间窗口 工作空间窗口将显示目前内存中所有的MATLAB变量 的变量名、数据结构、字节数以及类型等信息.
1.4 MATLAB的通用命令 1.常用命令 2.输入内容的编辑 3.标点 4.搜索路径与扩展
1.常用命令
2.输入内容的编辑
3.标点 在MATLAB中,一些标点符号被赋予了特殊的功能:
4.搜索路径与扩展 用户自己书写的函数有可能并没有保存在搜索路径下。要解决这个问题,只需把程序所在的目录扩展成MATLAB的搜索路径即可。 选择MATLAB主窗口中的【File】|【Set Path】菜单, 进入【设置搜索路径】对话框。通过该对话框可为 MATLAB添加或删除搜索路径。 在命令窗口中输入path或genpath可得到MATLAB的所有搜索路径。
(2)设置MATLAB的搜索路径 方法一:在MATLAB命令窗口中输入editpath或 pathtool命令或通过【File】|【Set Path】菜单,进入 “设置搜索路径”对话框,通过该对话框编辑搜索路径。 方法二:在命令窗口执行“path(path, ‘D:\Study ’)”,然后通过 “设置搜索路径”对话框查看“D:\Study”是否在搜索路径中。 方法三:在命令窗口执行“addpath D:\Study- end”,将新的目录加到整个搜索路径的末尾。如果将end改为begin,可以将新的目录加到整个搜索路径的开始。
1.5 MATLAB的帮助系统 1.命令窗口查询帮助系统 2.联机帮助系统 3.联机演示系统
1.命令窗口查询帮助系统 常见的帮助命令
2.联机帮助系统 用户可以通过下述方法进入MATLAB的联机帮助系统。 直接单击MATLAB主窗口中的“ ”按钮; 选中Help菜单的前4项中的任意一项; 在命令窗口中执行helpwin、helpdesk或doc。
3.联机演示系统 可以通过以下方式打开联机演示统。 选择MATLAB主窗口菜单的【Help】|【Demos】选项;
1.6 MATLAB示例
习 题 1.简述MATLAB的主要功能。 2.在命令窗口输入“w=3+2”,然后依次使用clear和clc 命 令,分别观察命令窗口、工作空间窗口和历史命令窗 口的变化。 3.将硬盘上一已有目录,加入到搜索路径,并将其设置为 当前工作目录。 4.通过命令窗口,查询函数sin()的用法。 5.通过联机帮助系统,查询函数inv()的用法。
6.通过联机演示系统,查询并运行“Control Systems Toolboxes”下的“Case Studies”中的“Yaw Damper for a 747 Aircraft”演示程序。 7.在命令窗口依次执行“w=5;”、“p=2*w”和 “q=p+w”。 8.在命令窗口同时执行下述代码: w=5; p=2*w q=p+w
第二章 基础知识 2.1 数 据 类 型 2.2 基本矩阵操作 2.3 运算符和特殊符号 2.4 字符串处理函数 习 题
2.1 数 据 类 型 1.数值类型 2.逻辑类型 3.字符和字符串类型 4.结构体类型
1.数值类型 数值类型包含:整数;浮点数;复数;Inf;NaN (1)整数类型 (2)浮点数类型 :有单精度和双精度两种浮点数。
(3)复数类型 (4)Inf和NaN 在MATLAB中可以用i或者j来表示虚部。 Inf和-Inf分别表示正无穷大和负无穷大。除法运算中除数为0或者运算结果溢出都会导致inf或-inf的运行结果。 在MATLAB中用NaN(Not a Number)来表示一个既不是实数也不是复数的数值。 (4)Inf和NaN
2.逻辑类型 在MATLAB中逻辑类型包含true和false,分别由1和0 表示。在MATLAB中用函数logical()将任何非零的数值转 换为true(即1),将数值0转换为false(即0)。 3.字符和字符串类型 在MATLAB中,数据类型(char)表示一个字符。一个char类型的1n数组称为字符串string。
4.结构体类型 结构体类型是一种由若干属性(field)组成的 MATLAB数组,其中的每个属性可以是任意数据类型。 下图表示了一个结构体(Personel),它包括3个属性(Name、Score和Salary),其中Name是一个字符串,Score是一个数值,Salary是一个15的向量。
(1)结构体数组的构造 (2)结构体数组的访问 利用函数struct() 在MATLAB中,函数struct()的具体用法如下: 构造一个结构体(数组)有两种方法: 利用赋值语句 通过赋值语句为结构体中的每个指定属性赋值,从而构造结构体。 利用函数struct() 在MATLAB中,函数struct()的具体用法如下: 其中,strArray、'field'和val分别表示结构体名、属性名和相应的属性值。 (2)结构体数组的访问 通过结构体数组的下标引用,可以访问任意元素的所有属性,同时可以对属性进行赋值。
2.2 基本矩阵操作 2.2.1 矩阵的构造 2.2.2 矩阵大小的改变 2.2.3 矩阵下标引用 2.2.4 矩阵信息的获取 2.2.5 矩阵结构的改变 2.2.6 稀疏矩阵
在MATLAB中,所有的数据均以二维、三维或高维矩 阵的形式存储,每个矩阵的单元可以是数值类型、逻辑类 型、字符类型或者其他任何数据类型。 对于标量,可以用11矩阵来表示; 对于一组n个数据,可以用1n矩阵来表示; 对于多维数组,可以用多维矩阵来表示。 在MATLAB中,用命令whos来显示数据的类型、存储 空间等信息。
2.2.1 矩阵的构造 1.简单矩阵构造 最简单的方法是采用 矩阵构造符“[]”。构 造1n矩阵(行向量) 时,可以将各元素依 次放入矩阵构造符[]内, 并且以空格或者逗号 分隔;构造mn矩阵 时,每行如上处理, 并且行与行之间用分 号分隔。
2.特殊矩阵构造
3.向量构造 其常用的用法: (1)a:b 返回以a为起点,以1为步长,且所有取值在a 与b之间的向量。
(2)a:s:b 返回以a为起点,以s为步长,且所有取值在a与b之 间的向量。
2.2.2 矩阵大小的改变 1.矩阵的合并 矩阵的合并就是把两个或者两个以上的矩阵连接成一个新矩阵。 2.2.2 矩阵大小的改变 1.矩阵的合并 矩阵的合并就是把两个或者两个以上的矩阵连接成一个新矩阵。 表达式C=[A B]在水平方向合并矩阵A和B; 表达式C=[A;B]在竖直方向合并矩阵A和B。 具有相同行数的两 个矩阵,合并为一 个新矩阵 不具有相同行数的两个矩阵,不允许合并为一个新矩阵
除了矩阵合并符“[]”外,还可以使用矩阵合并函数。 矩阵合并函数的描述和基本调用格式如下表所示。
2.矩阵行列的删除 要删除矩阵的某一行或者是某一列,只需将该行或者该列赋 予一个空矩阵[]即可。
1.访问单个元素 2.线性引用元素 3.访问多个元素 2.2.3 矩阵下标引用 本小节将介绍通过矩阵下标来存取元素值的方法,包括访问单个元素、线性引用元素和访问多个元素等。 1.访问单个元素 2.线性引用元素 3.访问多个元素
1.访问单个元素
2.线性引用元素 对于矩阵A,线性引用元素的格式为A(k)。通常这样的 引用用于行向量或列向量,但也可用于二维矩阵。 MATLAB按列优先排列的一个长列向量格式(线性引用 元素)来存储矩阵元素。
3.访问多个元素 若A是二维矩阵: A(:,:) 返回矩阵A的所有元素。 A(i,:) 返回矩阵A第i行的所有元素。 A(i,k1:k2) 返回矩阵A第i行的自k1到k2列的所有元素。 A(:,j) 返回矩阵A第j列的所有元素。 A(k1:k2,j) 返回矩阵A第j列的自k1到k2行的所有元素 若A是多维矩阵,也可以通过类似的方法实现对其访问
2.2.4 矩阵信息的获取 1.矩阵尺寸信息 矩阵尺寸函数可以得到矩阵的形状和大小信息
2.元素的数据类型 查询元素数据类型信息的部分函数如下表所示:
3.矩阵的数据结构 判断矩阵是否为某种指定数据结构的函数如下表所示。
2.2.5 矩阵结构的改变 改变矩阵结构的函数表
2.2.6 稀疏矩阵 2.查看稀疏矩阵 3.稀疏矩阵的运算规则 1.稀疏矩阵的创建 2.2.6 稀疏矩阵 在MATLAB中,可以用满矩阵存储方式和稀疏矩阵存储方式来存储矩阵。 若一个矩阵只有少数的元素非零,称为稀疏矩阵。稀疏矩阵用非零元素及其对应的下标来表示。 用户可以创建双精度、复数和逻辑等类型的稀疏矩阵。 1.稀疏矩阵的创建 2.查看稀疏矩阵 3.稀疏矩阵的运算规则
1.稀疏矩阵的创建 函数sparse()实现满矩阵到稀疏矩阵的转换: 函数full()实现稀疏矩阵到满矩阵的转换; S = sparse(i,j,s,m,n),其中,i和j分别是稀疏矩阵非零元素的行和列下标,s为相应的非零元素的值,m和n分别是矩阵的行数和列数。
MATLAB提供一些函数用于创建特殊稀疏矩阵
2.查看稀疏矩阵 一些函数用于查看稀疏矩阵的信息
3.稀疏矩阵的运算规则 在MATLAB中的各种命令和函数都可以用于稀疏矩阵 的运算,并且遵循如下的一些约定。 (1)把矩阵变为标量或者定长向量的函数总是给出满矩阵; (2)对于标量或者定长向量变换到矩阵的函数,如函数 zeros()、ones()、eye()、rand()等总是给出满矩阵; (3)从矩阵到矩阵的变换函数将以原矩阵的形式出现; (4)在参与矩阵扩展的子矩阵(如[ A B;C D])中,只要有一个是稀疏矩阵,那么所得的结果也是稀疏矩阵; (5)在矩阵引用中,将仍以原矩阵形式给出结果。
2.3.1 算数运算符 2.3.2 关系运算符 2.3.3 逻辑运算符 2.3.4 运算优先级 2.3 运算符和特殊符号 在MATLAB中提供了丰富的运算符,包括算数、关系和逻辑等3种运算符。 2.3.1 算数运算符 2.3.2 关系运算符 2.3.3 逻辑运算符 2.3.4 运算优先级
2.3.1 算数运算符
续表
补充说明A^B的用法如下: 当A和B都为矩阵时,此运算无定义; 当A和B都是标量时,表示标量A的B次幂; 当A是标量且B为矩阵时,表示标量A的B中各元素次幂; 当A为方阵且B为正整数时,表示矩阵A的B次乘积; 当A为方阵且B为负整数时,表示矩阵A逆的负B次乘积; 当A为可对角化的方阵且B为非整数时,有如下表达式:
2.3.2 关系运算符 值得注意的是,关系运算符只针对两个相同长度的矩阵,或其中之一是标量的情况进行运算。 2.3.2 关系运算符 值得注意的是,关系运算符只针对两个相同长度的矩阵,或其中之一是标量的情况进行运算。 对于前者,是指两个矩阵的对应元素进行比较,返回具有相同长度的矩阵; 对于后者,是指这个标量与另一个矩阵的每元素进行运算。 关系运算C=f(A,B)的运算结果只有0和1两种情况,其中,函数f()表示关系运算符,0表示不满足条件,1表示满足条件。
2.3.3 逻辑运算符 元素方式逻辑运算符& '、 ' | '和 ' ~ '与函数and()、or()和not()是等价的。
比特方式逻辑运算符只接受逻辑和非负整数类型的输入变量,它 是针对输入变量的二进制进行逻辑运算。 比特方式逻辑运算符的用法和功能如下表所示,表中例子采用A = 28和B = 200,其对应的二进制分别为11100和11001000。
2.3.4 运算优先级 由表中可以看到,括号的优先级别最高,因此可以用 括号来改变默认的优先等级。
2.4 字符串处理函数 2.4.1 字符串的构造 2.4.2 字符串的比较 2.4.3 字符串的查找和替换 2.4.4 字符串与数值间的转换 2.4 字符串处理函数 MATLAB提供了丰富的字符串操作,包括字符串的创建、合并、比较、查找以及与数值之间的转换。 2.4.1 字符串的构造 2.4.2 字符串的比较 2.4.3 字符串的查找和替换 2.4.4 字符串与数值间的转换
2.4.1 字符串的构造 可以用一对 单引号来表 示字符串。
2.4.2 字符串的比较 1.字符串比较函数
2.用关系运算符比较字符串 在MATLAB中,可以对字符串运用关系运算符,但要求两个字符 串具有相同的长度,或者其中一个是标量。
2.4.3 字符串的查找和替换 MATLAB提供的一些字符串查找和替换函数如下表所示:
2.4.4 字符串与数值间的转换
MATLAB提供的一些字符串转换为数值函数如下表所示:
习 题 1.计算复数3+4i与5−6i的乘积。 2.构建结构体Students,属性包含Name、Age 和Email, 数据包括{'Zhang',18,[‘zhang@163.com’, ‘zhang@263.com’]}、 {‘Wang’,21, []}和{‘Li’,[], []},构建 后读取所有Name属性值,并且修改‘Zhang’的Age属性值 为19。 3.用满矩阵和稀疏矩阵存储方式分别构造下述矩阵: 4.采用向量构造符得到向量[1,5,9,…,41]。 5.按水平和竖直方向分别合并下述两个矩阵:
6. 分别删除第5题两个结果的第2行。 7. 分别将第5题两个结果的第2行最后3列的数值 改为 [11 12 13]。 8. 分别查看第5题两个结果的各方向长度。 9. 分别判断pi是否为字符串和浮点数。 10.分别将第5题两个结果均转换为29的矩阵。 11.计算第5题矩阵A的转秩。 12.分别计算第5题矩阵A和B的A+B、A.* B和A\B。 13.判断第5题矩阵A和B中哪些元素值不小于4。
14.分别用函数strcat()和矩阵合并符合并如下字符串:' The picture is '和' very good '。 15.创建字符串数组,其中元素分别为‘Picture ’和'Pitch'。 16.在第14题结果中查找字符串'e'。 17.在第15题结果中匹配字符串'Pi'。 18.将字符串'very good'转换为等值的整数。 19.将十进制的50转换为二进制的字符串。 20.将十六进制的字符串‘50’转换为三进制的整数。
第三章 数学运算 3.2 矩阵元素运算 习 题 3.1 矩 阵 运 算 在MATLAB中一切数据均能以矩阵的形式表示: 针对矩阵整体的数学运算,称之为矩阵运算; 针对矩阵元素的数学运算,称之为矩阵元素运算。 3.1 矩 阵 运 算 3.2 矩阵元素运算 习 题
3.1 矩 阵 运 算 矩阵运算是线性代数中极其重要的部分,MATLAB具有强大的矩阵运算能力。 3.1.1 矩阵分析 3.1.2 线性方程组 3.1.3 矩阵分解 3.1.4 矩阵的特征值和特征向量 3.1.5 矩阵相似变换 3.1.6 非线性运算
3.1.1 矩阵分析 1.向量间的距离 2.矩阵的秩 3.矩阵的行列式 4.矩阵的迹 5.矩阵的化零矩阵 6.矩阵的正交空间 3.1.1 矩阵分析 1.向量间的距离 2.矩阵的秩 3.矩阵的行列式 4.矩阵的迹 5.矩阵的化零矩阵 6.矩阵的正交空间 7.矩阵的简化梯形形式 8.矩阵空间之间的角度
1.向量间的距离
2.矩阵的秩 矩阵A中线性无关的列向量个数称为列秩,线性无关 的行向量个数称为行秩。可以证明列秩与行秩是相等的。
3.矩阵的行列式
4.矩阵的迹 矩阵的迹定义为矩阵对角元素之和。在MATLAB中用 函数trace()来计算矩阵的迹。
5.矩阵的化零矩阵 对于非满秩矩阵A,若存在矩阵Z使得AZ = 0且 ZTZ = I,则称矩阵Z为矩阵A的化零矩阵。在MATLAB中 用函数null()来计算矩阵的化零矩阵。 6.矩阵的正交空间 矩阵A的正交空间Q满足QTQ = I,且矩阵Q与A具有相同的列基底。
7.矩阵的简化梯形形式 矩阵A的简化梯形形式为 ,其中Ir为r阶单位矩阵。
8.矩阵空间之间的角度 矩阵空间之间的角度代表具有相同行数的两个矩阵线 性相关程度,夹角越小代表线性相关度越高。
3.1.2 线性方程组 线性方程组求解 问题,可以表述 为给定两个矩阵 A和B,求解X使 得AX=B或XA=B。 XA=B可以表示 为A’Y=B’,且 X=Y’。下面仅讨 论AX=B的情况。
3.1.3 矩阵分解 1.Cholesky分解 2.LU分解 5.Schur分解 3.QR分解 4.奇异值分解 3.1.3 矩阵分解 矩阵分解是把一个矩阵分解成比较简单或者对它性质比较熟悉的若干矩阵的乘积的形式。 1.Cholesky分解 2.LU分解 5.Schur分解 3.QR分解 4.奇异值分解
1.Cholesky分解 Cholesky分解是把对称正定矩阵A表示为上三角矩阵 R的转置与其本身的乘积,即A = RTR。
对于稀疏矩阵,MATLAB中用函数cholinc()计算不完 全Cholesky分解,具体用法如下: R = full(cholinc(sparse (X),DROPTOL)),其中 DROPTOL为不完全Cholesky分解的丢失容限; R = full(cholinc(sparse (X),‘0’)),完全Cholesky分解。
2.LU分解 高斯消去法又称LU分解, 将任意一个方阵A分解为一个交换下三角矩阵L和一个上 三角矩阵U的乘积,即A=LU。 交换下三角矩阵为下三角矩阵经行变换的结果。 函数lu() 实现,具体用法如下: [L,U] = lu(X),X为一个方阵,L为交换下三角矩阵,U为上三角矩阵,满足关系X=L*U; [L,U,P] = lu(X),X为一个方阵,L为下三角矩阵,U为上三角矩阵,P为置换矩阵,满足关系P*X = L*U或X =P-1 *L*U。
考虑线性方程组AX=B和矩阵A的LU分解,线性方程组 可改写成L. U 考虑线性方程组AX=B和矩阵A的LU分解,线性方程组 可改写成L*U*X=B,由于左除算符'\'可以快速处理三角矩阵, 因此: X=U\(L\B) 矩阵的行列式和逆也可以利用LU分解来计算,如 det(A)=det(L)*det(U) inv(A)=inv(U)*inv(L)
对于稀疏矩阵,在MATLAB中提供了函数luinc()来做 不完全LU分解,其具体用法如下: [L U]= luinc(X,DROPTOL),其中X、L和U的含义与函 数lu()中的变量相同,DROPTOL为不完全LU分解的丢失 容限。当DROPTOL设为0时,退化为完全LU分解。 [L,U] = luinc(X,‘0’),0级不完全LU分解。 [L,U,P] = luinc(X,'0'),0级不完全LU分解。
3.QR分解 QR分解就是将m×n的矩阵A分解为m×n的矩阵Q和 n×n的上三角矩阵R的乘积,且Q‘*Q=I,即A=Q*R。 在MATLAB中QR分解是由函数qr()来实现,其具体用法如下: [Q,R] = qr(A) 满足A=Q*R。 R = qr(A), 返回上三角矩阵R。
4.奇异值分解 奇异值分解就是将mn的矩阵A分解为A=U*S*V’,其 中U为mm的酉矩阵,V为nn的酉矩阵,S为mn的矩阵, 并可如下表示: 其中 在MATLAB中奇异值分解是由函数svd()来实现,其具体用法如下:
5.Schur分解 Schur分解就是将复方阵A分解为A=U*L*U’,其中U 为酉矩阵,L为上(下)三角矩阵,其对角线元素为A的 特征值。 在MATLAB中Schur分解是由函数schur()来实现,其具体用法如下: [U,L] = schur(A),满足A=U*L*U’,其中L为上三角矩阵。 L = schur(A),返回上三角矩阵L。
3.1.4 矩阵的特征值和特征向量 方阵A的特征值λ和其对应的特征向量ν满足下式: A*ν=λ*ν 3.1.4 矩阵的特征值和特征向量 方阵A的特征值λ和其对应的特征向量ν满足下式: A*ν=λ*ν 在MATLAB中用函数eig()来计算特征值和其对应的特征向量,其具体用法如下: d = eig(A),返回矩阵A的所有特征值。 [V,D] = eig(A),返回矩阵A的特征值和特征向量。
3.1.5 矩阵相似变换 矩阵相似变换是指,对于方阵A和非奇异矩阵B可得到相似矩阵X=B-1*A*B。 1.对角阵变换 2.Jordan变换
1.对角阵变换 对于方阵A,若[V D]=eig(A)得到的矩阵V非奇异,则 A可经过相似变换得到对角阵,即D=V-1*A*V,也称矩 阵A可对角化。
2.Jordan变换 对于方阵A,若[V D]=eig(A)得到的矩阵V奇异,则A经过 相似变换将不能得到对角阵,只能得到其对应的Jordan标准 型。
函数jordan()来实现Jordan变换,其具体用法如下: [V,D] = jordan(A),满足D=V-1*A*V。 D = jordan(A),返回矩阵A对应的 Jordan标准型。
3.1.6 非线性运算 1.矩阵指数运算 2.矩阵对数运算 3.矩阵开平方运算 4.通用矩阵运算
1.矩阵指数运算
2.矩阵对数运算 矩阵对数运算是矩阵指数运算的逆运算,在MATLAB中用函 数logm()来计算矩阵对数,其具体用法如下: L = logm(A),返回矩阵A的对数。
3.矩阵开平方运算 对于方阵A,可以计算它的开平方得到矩阵X,即满足 X*X=A。如果矩阵A是奇异的,它有可能不存在平方根X。 在MATLAB中,有两种计算矩阵A平方根的方法,即 A^0.5和sqrtm(A)。函数sqrtm()比A^0.5的运算精度更 高,其具体用法如下: X = sqrtm(A),返回矩阵A的平方根X。
4.通用矩阵运算 通用矩阵运算的函数funm(),其具体用法如下: F = funm(A,fun),将指定函数fun作用在方阵A上。
3.2 矩阵元素运算 3.2.1 三角函数 3.2.2 指数和对数函数 3.2.3 复数函数 3.2.4 截断和求余函数 3.2.5 特殊函数
3.2.1 三角函数 MATLAB提供一些三角函数,其功能如下表所示:
续表
3.2.2 指数和对数函数 MATLAB提供一些指数和对数函数。
3.2.3 复数函数
3.2.4 截断和求余函数
3.2.5 特殊函数 1.工程函数 2.数论函数 3.坐标变换函数
1.工程函数
2.数论函数
3.坐标变换函数
习 题 1.计算矩阵A的范数、行列式、秩、化零空间和正 交空间。 2.求解线性方程组AX=B,其中A如第1题所示, B=[1 1 1 1 1]T。 3.对矩阵A进行LU分解和Schur分解,其中A如第1题。 4.对矩阵A的前4行进行QR分解和奇异值分解,其中A如第1题。 5.计算矩阵A的特征根及对应的特征向量,判断矩阵A是否可对角化,其中A如第1题。
6.计算矩阵A的指数、开平方和余弦值,其中A如第1题。 7.计算矩阵A每个元素的指数、开平方和余弦值(元素单 位为度),其中A如第1题。 8. 计算复数矩阵C每个元素的模、相角和共轭。 9. 分别使用函数fix()、floor()、ceil()和round(),计算第8题中的相角结果。 10.将2-i的模结果近似为有理数,并以数值形式显示。 11.计算,其中m = 4!和n是42与35的最大公因数。 12.将球坐标系中的点(1,1,1)分别转换到笛卡尔坐标系和极坐标系。
第四章 基本编程 4.1 M文件基础 4.2 变量和语句 4.3 程 序 调 试 4.4 函数设计和实现 MATLAB提供丰富的函数库,并可以进行程序设计,编写扩展名为.m的M文件,实现各种程序设计功能。 MATLAB提供大量的函数,包括内建函数和自带函数。用户也可以利用M文件来创建函数、函数库和脚本。 4.1 M文件基础 4.2 变量和语句 4.3 程 序 调 试 4.4 函数设计和实现
当需要创建一个M文件时,可以通过【File】|【New】|【M-File】菜单进入文本编辑器界面。 当需要打开一个M文件时,可以通过【File】|【Open】菜单进入文件选择的目录界面。
4.1 M文件基础 4.1.1 函数 4.1.2 脚本 4.1.3 子函数与私有函数 4.1.4 伪代码 M文件有函数(Functions)和脚本(Scripts)两种格式。M文件可以在任意的文本编辑器中进行创建和编辑,但推荐和默认使用MATLAB自带的文本编辑器和Notebook。 4.1.1 函数 4.1.2 脚本 4.1.3 子函数与私有函数 4.1.4 伪代码
4.1.1 函数 MATLAB中许多常用的 函数都是函数式M文件。 函数被调用时,通过获 取外部参数进行运算, 并向外部返回运算结果。 函数内部的变量都是隐 含的,存放在函数本身 的工作空间内。
4.1.2 脚本 脚本也是扩展名为.m的文件,可包含MATLAB的各种 命令。在命令窗口中直接键入此文件的文件名,MATLAB 可逐一执行文件内的所有命令。 将脚本所在目录设置为当前工作目录,并在文本编辑器中打开脚本后,可通过如下方法运行脚本: 单击【Debug】菜单下的【Run】; 单击快捷键F5;单击工具条上的图标 。 脚本运行过程所产生的变量都是全局变量,都驻留在MATLAB工作空间内。
结合上例,对函数和脚本进行总结如下。 (1)函数名必须与文件名相同。 (2)脚本没有输入参数和返回值。 (3)函数可以包括零个或多个输入参数和返回值,如函数 nargin和nargout包含输入参数和返回值的个数。 (4)函数被调用时,MATLAB会为它开辟一函数工作空间(Function workspace),用来存放中间变量,当执行完函数文件的最后一条命令或者遇到return命令时就结束该函数的运行,返回函数的输出,同时将临时工作空间清空。 (5)在M文件中,从开头到第一个非注释行之间的第一个注释行组(之间无空行)是帮助文本。 (6)函数中的变量(除特殊声明外)都是局部变量,而脚本中的变量都是全局变量,关于变量的有关内容详见第4.2节。 (7)在函数中调用脚本文件,等价于在函数中将脚本文件的内容粘贴在调用的位置。
4.1.3 子函数与私有函数 一个M文件可以包含多个函数,其中,一个是主函数,其他 是子函数。主函数必须出现在最上方,其后可有若干子函数,子 函数的次序可随意调整。主函数和各子函数的工作空间都是彼此 独立的。 私有函数是主函数的一种,它只能够在一个特定的限定函数 群中可见。 当M文件中需要调用某一个函数时,MATLAB是按照以下顺序来搜寻的: 检查此函数是否是子函数; 检查此函数是否为私有目录的函数; 从所设定的搜寻路径搜索此函数。 搜索过程中,只要找到与第一个文件名相符的函数就会立即取用而停止搜索。
4.1.4 伪代码 一个M文件首次被调用时,MATLAB将对该M文件进 行语法分析,并把生成的相应伪代码(P码)存放在内存 中。此后当再次调用该M文件时,将直接运行该文件在内 存中的伪代码。伪代码文件和原码文件具有相同的文件名, 但其扩展名为.p。 伪代码文件不是只有当M文件被调用时才产生,也可 使用pcode命令预先生成。
4.2 变量和语句 MATLAB的主要功能虽然是数值运算,但是它也是一个完整的程序语言,包括各种语句格式和语法规则。但与C语言不同的是,MATLAB中的变量是不需要事先定义的,如前3章的例子。 4.2.1 变量类型 4.2.2 程序控制结构
4.2.1 变量类型 (1)变量名不能与已有函数名相同,否则在内存中有该变量时将不能调用同名函数; 4.2.1 变量类型 变量名必须以字母开头,之后可以是任意字母、数字或下划线,但之 间不能有空格;区分大小写;第63个字符之后的部分将被忽略。 (1)变量名不能与已有函数名相同,否则在内存中有该变量时将不能调用同名函数; (2)变量名不能与MATLAB预留的关键字和特殊变量名相同,否则系统会显示错误信息。
变量按照作用范围分为局部变量和全局变量。在 MATLAB中使用命令global声明全局变量,如下所示: 需要使用指定全局变量的M文件,都必须在各自的代 码中声明此全局变量。只要存在声明某全局变量的M文件, 则全局变量存在。 ! ! 在使用全局变量中需要注意以下几个方面 在使用之前必须首先定义,建议将定义放在函数体的首行位置。 虽然对全局变量的名称并没有特别的限制,但是为了提高程序的可读性,建议采用大写字符命名全局变量。 全局变量会损坏函数的独立性,使程序的书写和维护变得困难,尤其是在大型程序中,不利于模块化,不推荐使用。
4.2.2 程序控制结构 1.顺序结构 2.循环结构 3.选择结构 4.其他控制结构
1.顺序结构 顺序结构就是由前至后依次执行程序的各条代码, 直至最后一条代码。脚本文件就是典型的顺序结构。
2.循环结构 (1)for循环
(2)while循环
3.选择结构 (1)if-else-end结构
(2)switch-case-otherwise结构
4.其他控制结构 (2)break (1)continue 其作用是结束本次循环,即跳过循环体中尚未执行的 代码,接着进行下一次是否执行循环的判断。 (2)break 它的作用是终止本次循环,跳出所在层循环。
(3)return 此命令可使正在运行的函数正常退出,并返回调用它 的代码段继续运行,它也可强制结束该函数的执行。如 MATLAB自带函数showopcevents() 。 (4)echo 执行M文件时,通常在命令窗口是看不到执行过程的,但在特殊情况下(比如演示)要求M文件的每条命令都要显示出来。这时可以用echo命令实现这样的功能。
对于脚本,echo命令可以用以下方式来实现:
(5)error (6)try…catch
(7)input 此命令用来提示并接收用户从键盘输入数据、字符串 或表达式的值,语法规则如下:
(8)keyboard 此命令将停止文件的执行并将控制权交给键盘,此时 命令窗口的提示符由“>>”变成“K>>”,当输入return 后,控制权将交回文件。该命令对程序的调试和在程序运 行中修改变量值都很方便。 (9)pause 此命令用于暂时中止程序的运行。该命令对程序的调试和查询中间变量值时很方便。该命令的语法规则如下:
4.3 程 序 调 试 4.3.1 直接调试法 4.3.2 工具调试法
4.3.1 直接调试法 (1)通过分析后,将重点怀疑语句后的分号删掉,将结果 显示出来,然后与预期值进行比较。 (2)单独调试函数时,将函数声明行注释掉,并定义输入 变量的值,然后以脚本方式运行,这样可保存中间变量, 进而进行分析和找出错误。 (3)在程序中的适当位置添加输出变量值的代码。 (4)在程序中的适当位置添加keyboard命令。 复杂的程序,必须采用工具调试法,即借助MATLAB提供的工具调试器(Debugger)进行调试。
4.3.2 工具调试法 设置断点 1.以命令行为主的程序调试 4.3.2 工具调试法 1.以命令行为主的程序调试 以命令行为主的程序调试手段具有通用性,可以适用 于各种平台,它主要是应用MATLAB提供的调试命令。 在命令窗口输入help debug可以看到对于这些命令的 简单描述,下面分别进行介绍。 设置断点 这是最重要的部分,可以利用它来指定程序代码的断点,使得程序在断点前停止执行,并进入调试模式,从而可以检查当前各个变量的值。
程序调试命令
在命令窗口输入dbstop in function8,并打开文件function8 在命令窗口输入dbstop in function8,并打开文件function8.m就可看到如下图所示的界面,它在第一个可执行语句前设置了断点。
单击图中红点,会发现红点被取消,此时回复到初始 状态。然后在命令窗口依次输入dbstop if error和 function8(magic(3)),可得到如下的运行结果和如下图 所示的界面。
2.以图形界面为主的程序调试 MATLAB自带的文本编辑器同时也是程序的编译器, 用户可以在程序编辑后直接进行调试,更加方便和直观。 通过新建M文件打开文本编辑器和编译器,选择主菜单中【Debug】选项,其下拉菜单包括多种调试命令,如下图所示。
下拉菜单中的命令有一部分在工具栏中有图标相对应,其功 能与命令行调试程序是相同的,下面只对各命令做简单介绍。
4.4 函数设计和实现 4.4.1 建立数学模型 4.4.2 编写代码 4.4.3 运行程序 4.4.4 良好的编程习惯
4.4.1 建立数学模型 PID控制的结构图 下面按照图中各模块分别进行数学建模。
1.参考输入 参考输入也称为参考信号,本例中选取单位阶跃函数 作为参考输入,它满足如下所示的条件: 2.PID控制器
3.被控对象
4.4.2 编写代码 1.参数整定
2.被控对象 需要说明的是,上述函数中采用中文注释,这在MATLAB 中 是可以识别的。而对于一些特殊的符号或字符,则需要使用 函数slCharacterEncoding()来设置解码规则,通过命令 help slCharacterEncoding可了解到它支持“Unix, Linux, Mac”,“Hp-UX”,“Windows (USA, Western Europe)”, “Windows (Japan)”和“Windows (Other) ”。
4.4.3 运行程序 当运行出错或运行结果不理想时,首先按照第4.3节 的方法进行调试,然后在确定程序无误的情况下,检查数 学模型和使用的算法是否正确和恰当。 从本例中可以看出,MATLAB提供了十分强大的功能。
4.4.4 良好的编程习惯 (1)数据结构必须事先规划好,如果数据结构设计存在错 误或不妥,那么程序修改的工作量将是巨大的。 (2)尽量避免使用全局变量。 (3)函数尽可能功能简明,使其可以重用,从而程序实现 模块化。 (4)良好的编写风格,使得别人或者自己能够容易读懂之前所写的代码。具体的方法包括:变量和函数名统一按规律命名,并具有较明确的意义;代码层次分明;注释清楚且充分等。 (5)注重程序的充分测试,注意警告信息。 (6)具有建立和求解数学模型的能力,能够简化程序的复杂性。
Matlab编程本身也有其特有的地方,如执行速度慢, 为了解决这个问题可以采用如下的措施。 (1)尽量避免使用循环,一是用向量化的运算来代替循环 操作,二是在多重循环时外循环次数应小于内循环。 (2)大型矩阵的预先确定各方向长度。 (3)优先考虑使用MATLAB的内建函数。 (4)应用MEX技术,这部分内容将在第11章中介绍。
习 题
第五章 数据显示及存取 5.1 二 维 绘 图 5.2 三 维 绘 图 5.3 图 形 处 理 5.4 图 形 窗 口 5.5 MAT文件应 5.1 二 维 绘 图 5.2 三 维 绘 图 5.3 图 形 处 理 5.4 图 形 窗 口 5.5 MAT文件应 5.6 文件I/O 习 题
5.1 二 维 绘 图 5.1.1 函数plot() 1.plot(y) 参数y可以是向量、实数矩阵或复数向量; 5.1 二 维 绘 图 5.1.1 函数plot() 1.plot(y) 参数y可以是向量、实数矩阵或复数向量; 若y为向量,图形以向量索引为横坐标值,以向量元素值 为纵坐标值; 若y为实数矩阵,则分别绘制y的各列向量; 若y为复向量,图形以复向量对应的实部向量为横坐标值, 以虚部向量为纵坐标值。
2.plot(x, y) 参数x和y均可为向量和矩阵,分以下三种情况; 参数x和y均为n维向量; 参数x为n维向量且y为mn或nm的矩 阵; 参数x和y均为mn矩阵。
3.plot(x, y, s) 参数x和y的含义同plot(x, y)中的相同。常见的可用字 符及其意义如下表所示。
5.1.2 函数fplot () 函数fplot()将外部的离散数据转化为图形。 数据点越多绘制的曲线越精确,越能反映数据的规律; 数据点少,则可能无法正确反映数据的规律。 函数fplot()帮助用户构建所需要绘制函数的数据:
其中各项参数的含义如下: function:待绘制的函数。 limits:定义x轴(自变量)的取值范围[xmin xmax], 或x轴和y轴(应变量)的范围 [xmin xmax ymin ymax]。 LineSpec:定义绘图的线型、颜色等。 tol:相对误差容忍度,默认值为2e-3。 n:当n≥1时,至少绘制n+1个点,默认值为1。 axes_handle:坐标轴句柄,函数的图形将绘制在这个坐标系中。 P1,P2…:向函数传递参数值。 X,Y…:采样的自变量和对应的函数值。
5.1.3 函数ezplot() 函数ezplot()用于绘制函数在某一自变量区域内的图形: 当f = f(x)时,各参数的含义如下: ezplot(f):绘制函数在默认区域-2*pi<x<2*pi内的图形。 ezplot(f,[min,max]):绘制函数在区域min<x<max内的图形。
当f=f(x,y)时,各参数的含义如下: ezplot(f):绘制函数在默认区域-2*pi<x<2*pi,-2*pi<y<2*pi内图形。 ezplot(f,[xmin,xmax,ymin,ymax]):绘制函数f(x,y) = 0在区域 xmin<x<xmax,ymin<y<ymax内的图形。 ezplot(f,[min,max]):绘制函数f(x,y) = 0在区域min<x<max、min<y<max内的图形。 ezplot(x,y):绘制参数方程组x=x(t),y=y(t)在默认区域0<t<2*pi内的图形。 ezplot(x,y,[tmin,tmax]):绘制参数方程组x=x(t),y=y(t)在区域tmin<t<tmax内的图形。 ezplot(...,figure_handle):在句柄为figure_handle的窗口中绘制图形。 ezplot(axes_handle,...):在句柄为axes_handle的坐标系上绘制图形。 h = ezplot(...):返回图形的句柄。
5.2 三 维 绘 图 5.2.1 函数plot3() 5.2.2 函数mesh() 5.2.3 函数surf() 5.2.4 改进的三维绘图函 数 最常用的三维绘图: 三维曲线图,对应的MATLAB函数为plot3() 网格图对应的MATLAB函数为mesh() 曲面图对应的MATLAB函数为和surf()
5.2.1 函数plot3() 其中X1、Y1、Z1为向量或矩阵,LineSpec定义曲线线型、 颜色等,PropertyName为线对象的属性名, PropertyValue为相应属性的值,h是用于存放曲线簇中每一 个线对象的句柄变量。 当X1、Y1、Z1为长度相同的向量时,函数plot3()将绘得一条分别以向量X1、Y1、Z1为x,y,z轴坐标值的空间曲线; 当X1、Y1、Z1均为mn的矩阵时,函数plot3()将绘得m条空间曲线,其中,第I条空间曲线分别以X1、Y1、Z1矩阵的第I列分量为x,y,z轴坐标值的空间曲线。
5.2.2 函数mesh() 函数mesh()可以绘出在某一区间内的完整曲面: C用于定义颜色; X和Y必须均为向量 若X和Y的长度分别为m和n,则Z必须为mn的矩阵,在这种情况下,网格线的顶点为(X(j),Y(i),Z(i,j));若参数中没有提供X,Y,则将(i,j)作为Z(i,j)的X,Y轴坐标值。
5.2.3 函数surf() 与函数mesh()不同,函数mesh()绘制得到的是网格 图,而函数surf()绘制得到的是着色的三维曲面,其具体 使用方法如下: 其中,各参数的含义与函数mesh()命令中的相同。
5.2.4 改进的三维绘图函数 1.函数meshc()和meshz() 5.2.4 改进的三维绘图函数 1.函数meshc()和meshz() 函数meshc()在函数mesh()绘制的三维曲面图基础上 再绘出等高线。
2.函数surfc() 函数meshz()的作用是在函数mesh()绘制的三维曲面 图基础上再绘出边界面。 函数surfc()在函数surf()绘制的三维图形基础上再绘出等高线。
5.3 图 形 处 理 MATLAB提供了强大的图形处理功能。下面具体的介绍 5.3.1 图形标注 5.3.2 坐标轴的控制 5.3.3 图形数据取点 5.3.4 子图和图形保持 5.3.5 图形的打印和输出
5.3.1 图形标注 1.标注坐标轴和图形标题 主要有xlabel()、 ylabel()、zlabel()和title()等: 5.3.1 图形标注 1.标注坐标轴和图形标题 主要有xlabel()、 ylabel()、zlabel()和title()等: string是标注所用的文本; fname是一个函数名,该函数的返回值必须是字符串; ‘PropertyName’定义标注文本的属性; PropertyValue为对应的属性值。
在标注过程中经常会遇到特殊符号的输入问题,MATLAB提 供了相应的字符转换。 可以对标注文本进行显示控制,方式如下。 \bf:黑体。 \it:斜体。 \sl:透视。 \rm:标准形式。 \fontname{fontname}:定义标注文字的字体。 \fontsize{fontsize}:定义标注文字的字体大小。
2.文本标注图形 在MATLAB中的文本标注: 函数text(), 函数gtext()
3.标注图例 ‘string1’,‘string2’等分别标注绘图过程中按绘制先后顺序所生成的曲线, 使用函数legend()为曲线填加图例以便区分,能够为图形中的所有曲线进行标 注,并以输入变量作为标注文本,其具体使用方法如下: ‘string1’,‘string2’等分别标注绘图过程中按绘制先后顺序所生成的曲线, ‘Location’定义标注位置属性,用于定义属性值。
图例标注位置属性值表
5.3.2 坐标轴的控制 1.函数axis() 在MATLAB中可以通过设置参数来实现对坐标轴的各种控制,这里仅介绍常用的控制函数。 5.3.2 坐标轴的控制 在MATLAB中可以通过设置参数来实现对坐标轴的各种控制,这里仅介绍常用的控制函数。 1.函数axis() 控制坐标轴的刻度范围及显示形式: [xmin xmax ymin ymax zmin zmax]用于定义坐标轴的范围; string是控制字符串,可用的string。
函数axis()的控制字符串表
2.命令zoom 该命令的作用是控制二维图形的坐标轴缩放: 其中,string为控制字符串。 命令zoom的控制字符串表
3.命令grid 该命令的作用是绘制坐标网格:
4.命令box 该命令的作用是在图形边界显示坐标刻度:
5.3.3 图形数据取点 当希望从已完成的图形中读取若干自变量对应的函数值时, 使用函数ginput()读取二维图形的数据:
5.3.4 子图和图形保持 1.命令hold 2.函数subplot() 在绘图过程中,经常会碰到下面两种情况: 在已绘制的图上填加新曲线; 5.3.4 子图和图形保持 在绘图过程中,经常会碰到下面两种情况: 在已绘制的图上填加新曲线; 将几个子图绘制在一个图形上。 MATLAB提供命令hold和函数subplot()解决上述问题。 1.命令hold 2.函数subplot()
1.命令hold
2.函数subplot() 该函数的作用是将一个图形分隔成若干子区域,在指 定子区域显示指定子图:
5.3.5 图形的打印和输出 MATLAB提供了几种方式输出当前的图形。 5.3.5 图形的打印和输出 MATLAB提供了几种方式输出当前的图形。 通过图形窗口的【Edit】菜单下的【Copy Figure】命 令,拷贝的选项可以通过【Copy Options】进行设置。 使用内置打印引擎或系统的打印服务。
5.4 图 形 窗 口 1.创建与控制 创建图形窗口的函数是figure() : 同时可以通过下面两个函数查阅和设置图形窗口的属性和参数。
2.菜单操作 (1)【File】菜单 【New】选项用于新建一个M-文件(M-File)、图形窗 口(Figure)、Simulink模型(Model)、MATLAB工作 空间的变量(Variable)或用户界面(GUI)。 【Generate M-File】选项用于生成M-函数文件。 【Import Data】选项用于导入数据。 【Save Workspace As】选项用于将图形窗口中的图形数据存储在二进制mat文件中,它们可以供其他的编程语言(如C语言等)调用。 【Preferences】选项用于定义图形窗口的各种设置,包括字体、颜色等。
【Export Setup】选项用于打开【图形输出】话框,可 以把图形以emf、ai、bmp、eps、jpg、pdf等格式保存, 并设置有关图形窗口的显示等方面的参数。 【Page Setup】选项用于打开【页面设置】话框。设置 图形尺寸、纸张大小、线型及文本类型以及坐标轴和图形 设置。 【Print Setup】选项用于打开【打印设置】话框。在这里可以设置图片的题图等。 【Print Preview】选项用于打开【打印预览】对话框。 【Print】选项用于打开【打印】对话框。
(2)【Edit】菜单 【Copy Figure】选项用于复制图形。 【Copy Option】选项用于打开【复制设置】对话框,设 置图形复制的格式、图形背景颜色和图形大小等。该选项 打开的对话框界面与【File】|【Preferences】的界面相 同,只是当前显示的面板不同。 【Figure Properties】选项用于打开图形窗口的属性设置对话框。 【Axes Properties】选项用于打开【设置坐标轴属性】对话框。 【Current Object Properties】选项用于打开设置图形窗口中当前对象(如窗口中的坐标轴、图形等)属性的对话框。
【Colormap】选项用于打开【色图编辑】对话框。 【Clear Figure】、【Clear Command Window】、 【Clear Command History】和【Clear Workspace】 选项分别用于清除图形窗口中的图形、命令窗口、历史命 令和工作空间。 (3)【View】菜单 ① 图形窗口工具条用于对图形进行各种处理。 ② 照相工具条用于设置图形的视角和光照等,可以实现从不同角度来观察所绘三维图形,并且为图形设置不同的光照情况。 ③ 绘图编辑工具条用于向图形中添加文本标注和各种标注图形等。 ④ 绘图浏览器用于浏览当前图形窗口中的所有图形对象。
(4)【Insert】菜单 该菜单用于向当前图形窗口中插入各种标注图形。 (5)【Tools】菜单 该菜单中大部分选项实现的功能,与前面介绍的几个工具条相关图标的功能一致。 (6)【Desktop】菜单 该菜单用于将窗口合并到MATLAB主界面的窗口中。 (7)【Window】菜单和【Help】菜单 这两个菜单与Windows系统中各种应用程序界面的相关菜单很类似。
3.工具栏
续表
5.5 MAT文件应用 下面重点介绍数据的保存和调用。 MAT文件是MATLAB数据存储的默认文件格式,文件 扩展名是.mat。可借助命令save和load实现MATLAB对 数据的读写,使用方法如下:
5.6 文件I/O 5.6.1 打开和关闭文件 1.打开文件 函数fopen()来完成打开文件的功能,其具体使用方法如下: 5.6.1 打开和关闭文件 1.打开文件 函数fopen()来完成打开文件的功能,其具体使用方法如下: filename是要打开的文件名称,permission表示对文件的处理方式,包括如下的设置参数。 'r':只读文件。 ‘w’:只写文件,覆盖文件原有内容(如果文件名不存在,则生成新文件)。 ‘a’:增补文件,在文件尾增加数据(如果文件名不存在,则生成新文件)。
'r+':读写文件(不生成文件)。 ‘w+’:创建一个新文件或者删除已有文件内容,并可进行读 写操作。 ‘a+’:读取和增补文件(如果文件名不存在,则生成新文 件)。
2.关闭文件 上述代码是关闭文件标识为fid的文件,如果要关闭所有打开的文件,则只需执行下面的代码: 所有打开的文件必须关闭,否则会造成系统资源浪费,其 具体使用方法如下: 可通过检查status的值来确认文件是否关闭,如果关闭成 功,则返回0;否则返回−1。 上述代码是关闭文件标识为fid的文件,如果要关闭所有打开的文件,则只需执行下面的代码: 需要说明的是,打开和关闭文件的操作都比较费时,尽量不要将它们置于循环体中。
5.6.2 存取二进制文件 1.读取文件 函数fread()可以从文件中读取二进制数据。它将读出每一个(特殊)字符对应的ASCII码,并以矩阵的形式返回,同时将文件指针放在读取的内容后,使用方法如下: fid是某打开文件对应的文件标识,size控制返回矩阵的大小和形式,它的有效输入如下所示。 n:读取前n个字符,并写入一个列向量中。 inf:读至文件末尾。 [m,n]:读取数据到mn的矩阵中,按列排序。 precision包括两部分:一是数据类型和精度定义,比如int、float等;二是一次读取的位数。
常用的精度如下表所示,并且与C语言中的类似形式进行对比。
还有一些类型是与平台有关的,平台不同可能位数不同,如 下表所示。
2.写入文件 函数fwrite()的作用是将矩阵元素按指定的二进制格式 写入某个打开的文件,并返回成功写入的数据个数,使用 方法如下: 其中: fid是从某打开文件对应的文件标识; a是待写入的矩阵; precision设定了结果的精度。
5.6.3 存取文本文件 1.读取文件 两个函数区别: fgetl会舍弃换行符; 而fgets则保留换行符 5.6.3 存取文本文件 1.读取文件 两个函数区别: fgetl会舍弃换行符; 而fgets则保留换行符 当确定文件的ASCII码格式时,可用函数fscanf()进行更精确的读取,使用方法如下: fid为打开文件对应的文件标识; format为指定的字符串格式; a为返回矩阵; count为可选项,表示成功读取的数据个数;size为可选项,可限制从文件读取的数据数目。 format用于指定读入数据的类型,常用的格式(%s:按字符串进行转换; %d:按十进制数据进行转换; %f:按浮点数进行转换)
2.写入文件 函数fprintf()将数据转换成指定字符串格式,并写入 文本文件中,使用方法如下: fid是要写入已打开文件的标识;format是指定字符串格式; y是要写入的数据;count是成功写入的字节数。 fid值可以代表标准输出的1和代表标准出错的2,如果fid字段省略,则默认值为1,即输出到屏幕上。常用的格式类型说明符如下。 %e:科学计数形式,即数值表示成a10b形式。 %f:固定小数点位置的数据形式。 %g:在上述两种格式中自动选取较短的格式。
5.6.4 文件内的位置控制 读写数据时默认从磁盘文件头开始,并顺序向后,直 至文件末尾。操作系统通过一个文件指针,来指示当前的 读写位置。 5.6.4 文件内的位置控制 读写数据时默认从磁盘文件头开始,并顺序向后,直 至文件末尾。操作系统通过一个文件指针,来指示当前的 读写位置。 控制文件内位置指针的函数表
(1)函数feof() 测试指针是否在文件结束位置: 如果指针位于标识为fid的已打开文件末尾,返回1,否则返回0。 (2)函数fseek() 设定指针位置: fid是已打开文件的标识;offset是偏移量,以字节为单位; origin是基准点;status为0表示操作成功,-1表示操作失败;如果要了解更多信息可以调用函 ferror()。 (3)函数ftell() 返回现在的位置指针, position是距离文件起始位置字节数,如果值为-1则说明操作失败。 (4)函数frewind() 将指针返回到文件开始,
习 题
第六章数值计算 6.1 多项式运算 6.2 插 值 运 算 6.3 数 据 分 析 6.4 功 能 函 数 6.5 微分方程组数值解 习 题 6.1 多项式运算 6.2 插 值 运 算 6.3 数 据 分 析 6.4 功 能 函 数 6.5 微分方程组数值解 习 题 MATLAB提供大量具有强大数值计算功能的函数。本章着重介绍关于数值计算的函数。
6.1 多项式运算 5.多项式的根和由根创建多 6.多项式部分分式展开 7.多项式曲线拟合 8.多曲线拟合图形用户接口 6.1 多项式运算 1.多项式表示法 2.多项式求值 3.多项式乘法和除法 4.多项式的微积分 MATLAB提供了关于多项式的函数: 多项式的值; 多项式的根和微分; 多项式拟合曲线; 部分分式。 5.多项式的根和由根创建多 6.多项式部分分式展开 7.多项式曲线拟合 8.多曲线拟合图形用户接口
多项式函数
1.多项式表示法 MATLAB采用行向量表示多项式系数,多项式系数按降幂排列。 函数poly2str()将多项式系数向量转换为完整形式。
2.多项式求值 函数polyval()计算多项式的值,其具体使用方法如下: y = polyval(p,x),p为多项式系数行向量,x代入多项式的 值; Y = polyvalm(p,X),把矩阵X代入多项式p中进行计算。
3.多项式乘法和除法 函数conv()和deconv()进行多项式乘法和除法,其具体使用 方法如下: w = conv(u,v),实现多项式乘法,返回结果多项式的 系数行向量; [q,r] = deconv(u, v),实现多项式除法。
4.多项式的微积分 (1)多项式的微分 k = polyder(p),返回多项式p微分的系数向量; k = polyder(a,b),返回多项式a b乘积微分的系数向量; [q,d] = polyder(b,a),返回多项式b/a微分的系数向量。
(2)多项式的积分 函数polyint()计算多项式的不定积分,其具体使用方法如下: s=polyint(p,k),返回多项式p不定积分的系数向量。
5.多项式的根和由根创建多项式 (1)多项式的根 函数roots()求多项式的根,其具体使用方法如下: r = roots(c),返回多项式c的所有根r。 (2)由根创建多项式 函数poly()实现由根创建多项式,其具体使用方法如下: p = poly(r),输入r是多项式所有根,返回值为多项式的系数向量; p = poly(A),输入A是方阵,返回值为A的特征多项式的系数向量。
6.多项式部分分式展开 7.多项式曲线拟合 函数residue()将多项式之比按部分分式展开: [r,p,k] = residue(b,a),求多项式b/a的部分分式展开; [b,a] = residue(r,p,k),从部分分式得到多项式向量。 7.多项式曲线拟合 函数polyfit()采用最小二乘法对给定数据进行多项式拟合,其具体使用方法如下: p = polyfit(x,y,n),采用n次多项式p来拟合数据x和y。
8.多曲线拟合图形用户接口 曲线拟合的图形用户接口可通过图形窗口的【Tools】菜单 中【Basic Fitting】选项启动。
6.2 插 值 运 算 6.2.1 一维插值 6.2.2 二维插值 插值函数
6.2.1 一维插值 一维插值就是对函数y=f(x)进行插值,一维插值的原理如下 图所示。 6.2.1 一维插值 一维插值就是对函数y=f(x)进行插值,一维插值的原理如下 图所示。 yi=interp1(x,y,xi),x,y是已知数据集且具有相同长度的向量; yi = interp1(y,xi),默认x为1:n,其中n为向量y的长度; yi = interp1(x,y,xi,method),method用于指定插值的方法。
运行结果如下图所示。
6.2.2 二维插值 二维插值是对两变量的函数z=f(x,y)进行插值,二维插值的 原理如下图所示: 6.2.2 二维插值 二维插值是对两变量的函数z=f(x,y)进行插值,二维插值的 原理如下图所示: zi = interp2(x,y,z,xi,yi),x,y,z为原始数据,返回值zi是插值结果; zi = interp2(z,xi,yi),若z=n×m,则x=1:n,y=1:m; zi = interp2(x,y,z,xi,yi,method),method用于指定插值的方法 。
运行结果:
6.3 数 据 分 析 给出如下约定: 一维数据分析时,数据可以用行向量或者列向量来表示; 二维数据分析时,数据可以用多个向量或者二维矩阵来表示。 6.3.1 基本数据分析函数 6.3.2 协方差和相关系数矩阵 6.3.3 有限差分和梯度 6.3.4 信号滤波和卷积 6.3.5 傅立叶变换
6.3.1 基本数据分析函数 1.最大值、最小值、平均值、中间值、元素求和 2.标准差和方差 3.元素排序
基本数据分析函数
续表
1.最大值、最小值、平均值、中间值、元素求和
运行结果如下,并如下图所示。
2.标准差和方差
3.元素排序 函数sort()实现数值的排序; 函数sortrows()实现对行的排序。
6.3.2 协方差和相关系数矩阵
函数cov()计算随机变量的协方差矩阵,具体使用方法如下: C = cov(X),计算X代表的随机变量的协方差矩阵; C = cov(x,y),x和y必须是具有相同长度的向量; C = cov(X,1),计算X代表的随机变量的协方差矩阵; C = cov(x,y,1),x和y必须是具有相同长度的向量。 函数corrcoef()计算随机变量的相关系数矩阵,使用方法如下: R = corrcoef(X),返回X代表的随机变量的相关系数矩阵; R = corrcoef(x,y),x和y必须是具有相同长度的向量。
6.3.3 有限差分和梯度 函数diff()计算差分,其具体使用方法如下: Y = diff(X) ,X可以是向量或矩阵; 6.3.3 有限差分和梯度 函数diff()计算差分,其具体使用方法如下: Y = diff(X) ,X可以是向量或矩阵; Y = diff(X,n) ,返回n阶差分 ; Y = diff(X,n,dim) ,返回在dim维上的n阶差分 。
运行结果如下图所示。
函数gradient()计算梯度,具体使用方法如下: FX = gradient(F),返回F在x方向上的梯度; [FX,FY] = gradient(F),FX是F在x方向的近似偏导数,FY 是F在y方向的近似偏导数; [Fx,Fy,Fz,...] = gradient(F),返回N个方向的近似偏导数; [...] = gradient(F,h),h用于指定所有方向上自变量的间距; [...] = gradient(F,h1,h2,...),用多个标量来指定各个方向上自变量的间距。
运行结果如图所示
6.3.4 信号滤波和卷积 1.一维数字滤波 2.信号卷积 3.去除信号直流或线性成分 信号滤波和卷积函数
1.一维数字滤波 函数filter()实现一维数字滤波,具体使用方法如下: y = filter(b,a,X),X为用于滤波的数据,Y为数据X通过 滤波器之后的值; [y,zf] = filter(b,a,X),附加返回一个表示数据延迟时间 的量zf; [y,zf] = filter(b,a,X,zi),zi为初始数据延迟,zf等于最终数据延迟; y = filter(b,a,X,zi,dim),在dim维上进行数据滤波。
2.信号卷积 函数conv()计算卷积:
3.去除信号直流或线性成分 detrend()函数实现去除信号中的直流或者线性成分,其具 体使用方法如下: y = detrend(x),如果x是一个向量,从信号x中减去线 性成分;如果x是一个矩阵,去除x所有列中的线性成分; y = detrend(x,‘constant’),如果x是一个向量,减去信号中的直流成分;如果x是一个矩阵,去除所有列中的直流成分; y = detrend(x,'linear',bp),从信号x中减去分段线性函数。
6.3.5 傅立叶变换 傅立叶变换既可以对连续信号进行变换,也可以对离散信号进行变换。本小节只介绍离散傅立叶变换。 傅立叶变换函数 6.3.5 傅立叶变换 傅立叶变换既可以对连续信号进行变换,也可以对离散信号进行变换。本小节只介绍离散傅立叶变换。 1.一维傅立叶变换和逆变换 2.二维傅立叶变换和逆变换 傅立叶变换函数
1.一维傅立叶变换和逆变换 函数fft()实现一维离散傅立叶变换,其具体使用方法如下: Y = fft(X),如果X是向量,返回向量X的傅立叶变换;如果X是矩阵,函数对矩阵X的每一列进行傅立叶变换; Y = fft(X,n),用输入n指定傅立叶变换的长度; Y = fft(X,[],dim),在dim维上进行傅立叶变换; Y = fft(X,n,dim),在dim维上进行傅立叶变换,并指定傅立叶变换的长度。 函数ifft()实现一维离散傅立叶逆变换,其具体使用方法与函数fft()类似,只是添加一个选项。 y = ifft(..., 'symmetric'); y = ifft(..., 'nonsymmetric') 。
2.二维傅立叶变换和逆变换 函数fft2()实现二维傅立叶变换,用函数ifft2来实现二维傅 立叶逆变换。函数fft2()的具体使用方法如下: Y = fft2(X),X是矩阵,对矩阵X进行二维傅立叶变换; Y = fft2(X,m,n),m和n指定傅立叶变换的长度。
6.4 功 能 函 数 1.函数的表示 2.函数画图 3.函数最小值和零点 4.数值积分 5.在功能函数中使用含参函数
1.函数的表示 函数可以通过以 下方式来表示: M文件; 匿名函数; 函数inline()
2.函数画图 fplot(function,limits),function为待画图的函数,limits是横坐标数值范围或横纵坐标数值范围; fplot(function,limits,LineSpec),LineSpec指定画图的线条属性; fplot(function,limits,tol),tol指定画图相对精度; fplot(function,limits,tol,LineSpec),指定画图的线条属性和画图相对精度。
3.函数最小值和零点 (1)求一元函数最小值 函数fminbnd()求一元函数在给定区间内的最小值: x = fminbnd(fun, ,x1,x2),在 [x1 x2]内寻找最小值; x = fminbnd(fun,x1,x2,options),使用options选项来指定的优化器的参数; [x,fval] = fminbnd(...),附加返回函数最小值。
(2)求多元函数的最小值 x = fminsearch(fun,x0),在初始x0附近寻找局部最小 值; x = fminsearch(fun,x0,options),使用options选项 来指定优化器的参数; [x,fval] = fminsearch(...),附加返回函数最小值。
(3)求一元函数的零点 函数fzero()求一元函数的零点,其具体使用方法如下: x = fzero(fun,x0),在x0点附近寻找函数的零点; x = fzero(fun,[x0,x1]),在[x0,x1]区间内寻找函数的零 点; x = fzero(fun,x0,options),用options指定寻找零点的 优化器参数; [x,fval] = fzero(...),附加自变量为x时的函数值。
(4)优化器参数 options= optimset('param1',value1,'param2',value2,...),用参数 名和对应的参数值设定优化器的参数; optimset,显示优化器的所有参数名和有效的参数值; options = optimset,返回一个优化器的结构体; options = optimset(optimfun),返回函数optimfun()对应的优化器参数; options= optimset(oldopts,'param1',value1,...),在原优化器参数oldopts的基础上,改动指定优化器参数; options = optimset(oldopts,newopts),用newopts的所有非空参数覆盖oldopts中的值。
优化器参数 函数optimget()得到目前优化器的参数,使用方法如下: val = optimget(options,'param'),返回优化器参数'param'的值; val= optimget(options,'param',default),返回优化器参数'param'的值。
4.数值积分 (1)一元函数的数值积分 数值积分函数 函数quad()和函数quadl()来计算一元函数的积分。 q = quad(fun,a,b),计算函数fun在[a b]区间内的定积分; q = quad(fun,a,b,tol),以绝对误差容限tol计算函数fun在[a b]区间内的定积分; q = quad(fun,a,b,tol,trace),当trace为非零值时,显示迭代过程的中间值。
(2)矢量数值积分 矢量数值积分等价于多个一元定积分。
(3)二重和三重积分 函数dblquad()计算二重积分,其具体使用方法如下: q = dblquad(fun,xmin,xmax,ymin,ymax),计算二元函 数的二重积分; q= dblquad(fun,xmin,xmax,ymin,ymax,tol),用tol指 定绝对计算精度; q= dblquad(fun,xmin,xmax,ymin,ymax,tol,method), 用method指定计算一维积分时采用的函数。
(1)用嵌套函数提供函数参数 5.在功能函数中使用含参函数 功能函数中的含参函数的两种解决方法: 嵌套函数 匿名函数 编写M文件的函数时: 首先将含参函数的参数作为输入; 其次在其中调用功能函数,形成嵌套; 最后通过调用该函数进行计算。
运行结果如下图所示。
(2)用匿名函数提供函数参数 用匿名函数提供函数参数的具体步骤如下: 创建一个含参函数,并保存为M文件格式; 用含参函数创建匿名函数; 把匿名函数句柄传递给功能函数计算。
6.5 微分方程组数值解 6.5.1 常微分方程组的初值问题 6.5.2 延迟微分方程的问题 6.5.3 常微分方程组的边界问题
6.5.1 常微分方程组的初值问题 1.显式常微分方程组 2.设置解法器参数 3.线性隐式常微分方程组 4.完全隐式常微分方程组
1.显式常微分方程组 常微分方程组解法对比
2.设置解法器参数 函数odeset()设定解法器参数,其具体使用方法如下: options=odeset('name1',value1,'name2', value2,…),用参数名和相应参数值设定解法器的参数; options= odeset(oldopts,‘name1’, value1,…),修改原来的解法器options结构体oldopts; options = odeset(oldopts,newopts),合并两个解法器options结构体oldopts和newopts; odeset,显示所有的参数值和它们的默认值。
常微分方程组解法器参数
3.线性隐式常微分方程组 线性隐式常微分方程组可以利用解法器参数options来求解。
运行结果如下图所示。
4.完全隐式常微分方程组 函数ode15i()求解完全隐式常微分方程组,具体使用方法如下: [t,Y] = ode15i(odefun,tspan,y0,yp0) ; [t,Y]= ode15i(odefun,tspan,y0,yp0,options) 。 函数decic()得到自洽初始值,其具体使用方法如下: [y0mod,yp0mod] = decic(odefun,t0,y0,fixed_y0,yp0,fixed_yp0); = decic(odefun,t0,y0,fixed_y0,yp0,fixed_yp0,options) 。
运行结果如下图所示。
6.5.2 延迟微分方程的问题 sol= dde23(ddefun,lags,history,tspan); 6.5.2 延迟微分方程的问题 sol= dde23(ddefun,lags,history,tspan); sol=dde23(ddefun,lags,history,tspan,option) option结构体用于设置解法器的参数。 函数dde23()的返回值是一个结构体,重要的5个属性如下: sol.x,dde23选择计算的时间点; sol.y,在时间点x上的解y(x); sol.yp,在时间点x上解的一阶导数y’(x); sol.history,方程初始值; sol.solver,解法器的名字‘dde23’; 若需得到tint时刻的解,可以使用函数deval,即yint = deval(sol,tint)。
6.5.3 常微分方程组的边界问题 sol = bvp4c(odefun,bcfun,solinit),odefun代表常微分方程组的函数,bcfun是描述边界条件的函数,solinit是对方程解的猜测解; sol = bvp4c(odefun,bcfun,solinit,options),使用options结构体来设定解法器的参数。
运行结果如下图所示
习 题
第七章 符号计算 符号计算是数字运算的自然扩展,其特点包括: 不受计算误差的困扰; 计算可以给出完全正确的封闭解或任意精度的数值解; 7.1 符号计算入门 7.2 符号对象的创建和使用 7.3 任意精度计算 7.4 符号表达式的化简和替换 7.5 符号矩阵计算 符号计算是数字运算的自然扩展,其特点包括: 不受计算误差的困扰; 计算可以给出完全正确的封闭解或任意精度的数值解; 计算的指令比较简单,所需要的时间较长。 7.6 符号微积分 7.7 符号积分变换 7.8 符号方程求解 7.9 可视化数学分析界面 习 题
7.1 符号计算入门 1.求解代数方程 2.求解微分方程 3.计算导数 4.计算定积分 7.1 符号计算入门 自然科学理论分析中的公式、关系式及其推导是符号计算要解决的问题。MATLAB数值计算的对象是数值,而符号计算的对象则是非数值的符号字符串。 1.求解代数方程 2.求解微分方程 3.计算导数 4.计算定积分
1.求解代数方程
2.求解微分方程
3.计算导数
4.计算定积分
7.2 符号对象的创建和使用 7.2.1 创建符号对象和表达式 7.2.2 符号对象的基本运算 7.2 符号对象的创建和使用 7.2.1 创建符号对象和表达式 7.2.2 符号对象的基本运算 在符号计算中,需定义一种新的数据类型sym类。sym类的实例就是符号对象,符号对象是一种数据结构,用来存储代表符号变量、表达式和矩阵的字符串。
7.2.1 创建符号对象和表达式 1.符号常量 2.符号变量 3.符号表达式 4.符号矩阵
函数sym()和命令syms创建符号常量、变量、函数以及表达 式,函数class()检验符号对象类型。 (1)函数sym() s=sym(A,flag); s=sym(‘A’,flag)。 syms s1,…, sn flag。 (3)函数class() str=class(object)。
1.符号常量 2.符号变量 符号常量是一种符号对象。数值常量如果作为函数命令sym() 的输入参量,就建立了一个符号对象—符号常量。 符号变量通常是由一个或几个特定的字符表示。符号变量的命名规则如下所示: 变量名可以由英文字母、数字和下划线组成; 变量名应以英语字母开头; 组成变量名的字母长度不大于31个; 区分大小写。 在MATLAB中,用函数sym()和命令syms来创建符号变量。
3.符号表达式 4.符号矩阵 符号表达式是由以下部分组成的符号对象: 符号常量; 符号变量; 符号运算符; 专用函数。 元素是符号对象的矩阵叫做符号矩阵。
7.2.2 符号对象的基本运算 1.基本运算符 2.关系运算符 3.三角函数、双曲函数以 及它们的反函数 4.指数、对数函数 5.复数函数 7.2.2 符号对象的基本运算 1.基本运算符 2.关系运算符 3.三角函数、双曲函数以 及它们的反函数 4.指数、对数函数 5.复数函数 6.矩阵函数
1.基本运算符 2.关系运算符 运算符“+”、“-”、“*”、“\”、“/”、“^”分别实 现矩阵的加、减、乘、左除、右除和求幂运算。 运算符“.*”、“./”、“.\”、“.^”分别实现“元素 对元素”的数组乘、左除、右除和求幂运算。 运算符“'”、“.'”分别实现矩阵的共轭转置和非共轭转置。 2.关系运算符 运算符“==”和“~=”分别对运算符两边的对象进行“相等”、“不等”的比较。 当事实为“真”时,返回结果1; 当事实为“假”时,返回结果0。
3.三角函数、双曲函数及其反函数 4.指数、对数函数 5.复数函数 6.矩阵函数 除函数atan2()仅能用于数值计算外,其余的三角函数、双曲函数及它们的 反函数都能用于符号计算。 4.指数、对数函数 函数sqrt()、exp()、expm()、log()、log2()和log10()都能用于符号计算。 5.复数函数 函数conj()、real()、imag()和abs()都能用于符号计算,但相角函数没有提供。 6.矩阵函数 函数diag()、triu()、tril()、inv()、det()、rank()、rref()、null()、colspace()、poly()、expm()和eig()都能用于符号计算。
7.3 任意精度计算 1.digits(d) 2.vpa(A,d) 3.double(A) 7.3 任意精度计算 符号计算的显著特点是计算过程中不会出现舍入误差,从而可以得到任意精度的数值解。 MATLAB提供以下函数实现将符号计算得到的精确值转换成任意精度。 1.digits(d) 2.vpa(A,d) 3.double(A)
1.digits(d) 2.vpa(A,d) 3.double(A) 设定精度为d位有效数字,默认值是32。 对符号计算得到的精确值转换为双精度。
7.4 符号表达式的化简和替换 7.4.1 符号表达式的化简 7.4.2 符号表达式的替换 7.4 符号表达式的化简和替换 MATLAB提供函数实现对符号计算的结果进行化简和替换,如: 因式分解; 同类项合并; 符号表达式展开、化简; 通分、符号替换。 7.4.1 符号表达式的化简 7.4.2 符号表达式的替换
7.4.1 符号表达式的化简 1.函数collect() 2.函数expand() 3.函数horner() 4.函数factor() 5.函数simplify() 6.函数simple()
1.函数collect() 函数collect()将符号表达式中同类项合并,其具体使用方法如下: R=collect(S):将表达式S中的相同次幂的项合并; R=collect(S,v):将表达式S中变量v的相同次幂的项合并。
2.函数expand() 函数expand()将符号表达式进行展开: R = expand(S):将表达式S中的各项进行展开。
3.函数horner() 函数horner()将符号表达式转换成嵌套形式: R = horner(S):将符号多项式矩阵S中的每个多项式转换 成它们的嵌套形式。
4.函数factor() 函数factor()对符号多项式进行因式分解: R=factor(X):如果X是一个多项式或多项式矩阵,该函 数将X表示成低阶多项式相乘的形式;如果X不能分解成 有理多项式乘积的形式,则返回X本身。
5.函数simplify() 6.函数simple() 函数simplify()将符号表达式按一定规则简化: R= simplify(S):该函数可应用于包含和式、方根、分 数的乘方、等符号表达式矩阵S。 6.函数simple() 该函数是将符号表达式表示成最简形式: r = simple(S):用几种不同的算术简化规则对符号表达式进行简化,并显示中间过程; [r,how] = simple(S):不显示中间过程,并附加返回最简形式对应的简化方法 。
7.4.2 符号表达式的替换 1.函数subexpr() 2.函数subs() 7.4.2 符号表达式的替换 在MATLAB中,用函数subexpr()和subs()来实现符号替换,从而简化符号表达式。 1.函数subexpr() 2.函数subs()
1.函数subexpr() 2.函数subs() 函数subexpr()将符号表达式中重复出现的字符串用符号变量代 替,其具体使用方法如下: [Y,SIGMA] = subexpr(S,SIGMA):指定用符号变量SIGMA 来代替符号表达式中重复出现的字符串; [Y,SIGMA] = subexpr(S,‘SIGMA’):这种形式和上一种形 式的不同在于第2个输入参数是字符或字符串。 2.函数subs() 函数subs()用指定符号替换符号表达式中的某一特定符号,其具体使用方法如下: R = subs(S,Old,New):用新符号变量New替代原来符号表达式S中的变量Old。
7.5 符号矩阵计算 1.基本代数运算 2.线性代数运算 3.特征值分解 4.约当标准型 5.奇异值分解
1.基本代数运算 2.线性代数运算 3.特征值分解 4.约当标准型 符号矩阵进行线性代数运算时和数值矩阵的一样。 两符号矩阵进行加减运算时必须满足数值矩阵加减的规则。 2.线性代数运算 符号矩阵进行线性代数运算时和数值矩阵的一样。 3.特征值分解 函数eig()求符号方阵的特征值和特征向量: E = eig(A):求符号方阵A的符号特征值E; [v,E] = eig(A):求符号方阵A的符号特征值E和相应的特征向量v。 4.约当标准型 函数jordan()求矩阵的约当标准形,其具体用法如下: J = jordan(A):计算矩阵A的约当标准型; [V,J] = jordan(A):附加返回相应的变换矩阵V。
5.奇异值分解 函数svd ()求矩阵的奇异值分解,其具体用法如下: S = svd(A):给出符号矩阵的奇异值对角矩阵,其计算 精度由函数digits()来指定; [U,S,V] = svd(A):附加给出U和V两个正交矩阵且满足 A = U*S*V'。
7.6 符号微积分 1.符号表达式的极限 2.符号表达式的微分 3.符号表达式的积分 4.级数求和 5.泰勒级数
1.符号表达式的极限 函数limit()求表达式的极限,其具体用法如下: limit(F,x,a):求当x→a时,符号表达式F的极限; limit(F,a):求符号表达式F的默认自变量趋近于a时的极 限; limit(F):求符号表达式F的默认自变量趋近于0时的极限; limit(F,x,a,'right')或limit(F,x,a,'left'):分别求取符号表 达式F的右极限和左极限。
2.符号表达式的微分 diff(S,‘v’):将符号“v”视作变量,对符号表达式或矩阵S求微分; diff(S,n):将S中的默认变量求n阶微分; diff(S,'v',n):将符号“v”视作变量,对符号表达式或矩阵S求n阶微分。
3.符号表达式的积分 函数int()求表达式的积分,其具体用法如下: R = int(S):用默认变量求符号表达式S的不定积分; R = int(S,v):用符号标量v作为变量求符号表达式S的不定积分值; R = int(S,a,b):符号表达式采用默认变量; R = int(S,v,a,b):符号表达式采用符号标量v作为标量,求当v从a到b时,符号表达式S的定积分值。
4.级数求和 5.泰勒级数 函数symsum()来对符号表达式进行求和,其具体用法如下: r = symsum(s,a,b):求符号表达式s中默认变量从a到b 的有限和; r = symsum(s,v,a,b):求符号表达式s中变量v从a到b 的有限和。 5.泰勒级数 函数taylor()对符号表达式进行泰勒级数展开: r = taylor(f):返回f在变量等于0处的5阶泰勒展开式; r = taylor(f,n,v):符号表达式f以符号标量v作为自变量,返回f的n-1阶泰勒展开式。 r = taylor(f,n,v,a):返回符号表达式f在v = a处的n-1阶泰勒展开式。
7.7 符号积分变换 1.Fourier变换 2.Laplace变换 3.Z变换 7.7 符号积分变换 在数学中经常采用变换的方法,将复杂的运算转化为简单的运算,如数量的乘除可以通过对数变换成加减。积分变换就是通过积分运算实现变换。 1.Fourier变换 2.Laplace变换 3.Z变换
1.Fourier变换 Fw = fourier(ft,t,w):求时域函数ft的Fourier变换Fw; ft = ifourier(Fw,w,t):求频域函数Fw的Fourier反变换。
2.Laplace变换 函数laplace()和ilaplace()实现f(t)到F(s)和F(s)到f(t)的变换,其具体用法如下: Fs = laplace(ft,t,s):求时域函数ft的Laplace变换Fs; ft = ilaplace(Fs,s,t):求频域函数Fs的Laplace反变换ft。
3.Z变换 函数ztrans()和iztrans()来实现f(n)到F(z)和F(z)到f(n)的变换,其具体用法如下: FZ = ztrans(fn,n,z):求采样点fn的Z变换FZ; fn = iztrans(FZ,z,n):求FZ的Z反变换fn。
7.8 符号方程求解 1.代数方程 2.微分方程 符号方程可以分为代数方程和微分方程。 代数方程可以细分为线性方程和非线性方程两类; 7.8 符号方程求解 符号方程可以分为代数方程和微分方程。 代数方程可以细分为线性方程和非线性方程两类; 微分方程可以细分为常微分方程和偏微分方程。 1.代数方程 2.微分方程
1.代数方程 函数solve()求解代数方程,其具体用法如下: g = solve(eq):其中eq可以是符号表达式或不带符号的 字符串,该函数求解方程eq=0; g = solve(eq,var):求解方程eq=0,其自变量由参数 var指定; g = solve(eq1,eq2,…,eqn):求解由符号表达式或不带 符号的字符串eq1,eq2,…,eqn组成的方程组; g = solve(eq1,eq2,…,eqn,var1,var2,…,varn):求解 由符号表达式或不带等号的字符串eq1,eq2,…,eqn 组成的方程组。
2.微分方程 函数dsolve()求解微分方程: r=dsolve(‘eq1,eq2,…’,‘cond1,cond2,…’,‘v’):求由 eq1,eq2……指定的常微分方程组的符号解; r = dsolve('eq1','eq2',…,'cond1','cond2',…,'v'):求由 eq1,eq2……指定的常微分方程组的符号解。
7.9 可视化数学分析界面 1.图示化符号函数计算器 2.泰勒级数逼近分析器 7.9 可视化数学分析界面 1.图示化符号函数计算器 2.泰勒级数逼近分析器 在MATLAB中,为符号函数可视化提供图示化符号函数计算器(由命令funtool启动)和泰勒级数逼近分析器(由命令taylortool启动)。
1.图示化符号函数计算器 运行命令funtool后,可看到如下图所示的图示化符号函数 计算器界面。 两个图形窗口只有一个能处于激活状态,函数运算控制窗口 上的任何操作都只能对被激活的图形窗口起作用。
(1)第1排按键只对函数f起作用,如计算导数、积分、简化、提取分子和分母、1/f以及反函数。 (2)第2排按键处理函数f和常数a之间的加、减、乘、除等运算。 (3)第3排前4个按键对函数f和g进行算术运算。第5个按键求复合函数,第6个按键把f函数传递给g,最后一个按键实现f和g互换。 (4)第4排按键对计算器自身进行操作,该计算器包含一个函数列表fxlist,这7个按键的功能依次如下。 Insert:把当前激活窗的函数写入列表; Cycle:依次循环显示fxlist中的函数; Delete:从fxlist列表中删除激活窗的函数; Reset:使计算器恢复到初始调用状态; Help:获得关于界面的在线提示说明; Demo:自动演示。
2.泰勒级数逼近分析器 运行命令taylortool后,可看到如下图所示的泰勒级数逼近 分析器界面。 该界面用于观察函数f(x)在给定区间上被N阶泰勒多项式TN(x)逼近的情况; 函数f(x)在界面的f(x)栏中直接键入并回车即可; 界面中N被缺省为7,可以用右侧的按键增减阶数,也可以直接写入阶数; 界面上的a是级数的展开点,缺省为0; 函数的观察区可被设置,缺省为(−2,2)。
习 题
第八章 图形用户界面(GUI) 8.1 GUI设计向导 8.2 编程设计GUI 8.3 图形用户界面设计实例 习 题 本章将介绍: 图形用户界面的设计原则; 图形用户界面的操作步骤。 8.1 GUI设计向导 8.2 编程设计GUI 8.3 图形用户界面设计实例 习 题
8.1 GUI设计向导 8.1.1 GUI概述 8.1.2 启动GUIDE 8.1.3 GUIDE提供的控件 本节介绍:
8.1.1 GUI概述 GUI创建包括界面设计和控件编程两部分,主要步骤如下: 通过设置GUIDE应用程序的选项来运行GUIDE; GUI是一种包含多种对象的图形窗口,并为GUI开发提供一个方便 高效的集成开发环境GUIDE。GUIDE主要是一个界面设计工具集, MATLAB将所有GUI支持的控件都集成在这个环境中。GUIDE将设计 好的GUI保存在一个FIG文件中,同时生成M文件框架。 FIG文件:该文件包括GUI图形窗口及其所有FIG文件包含序列 化的图形窗口对象; M文件:该文件包括GUI设计、控制函数以及定义为子函数的用 户控件回调函数。 GUI创建包括界面设计和控件编程两部分,主要步骤如下: 通过设置GUIDE应用程序的选项来运行GUIDE; 使用界面设计编辑器进行界面设计; 编写控件行为响应控制(即回调函数)代码。
8.1.2 启动GUIDE 在MATLAB中,可以通过如下两种方法来访问模板: 直接输入命令GUIDE,打开如下图所示的界面; 在MATLAB中,GUIDE提供多个模板来定制GUI。这些模板均已包括 相关的回调函数,可以通过修改对应的M文件函数,实现指定功能。 在MATLAB中,可以通过如下两种方法来访问模板: 直接输入命令GUIDE,打开如下图所示的界面; 通过【File】菜单下的【New】选项也可以打开如下图所示的界面。
在模板设计界面中,可以选择创建新的GUI或者打开原有的 GUI。在创建新的GUI时MATLAB提供以下4种模板: 空白模板; 带有控制按钮模板; 带有坐标轴和菜单模板; 问答式对话框模板。 其中的空白模板如上图所示:
8.1.3 GUIDE提供的控件 在空白模板中,GUIDE提供界面控件以及设 计工具集来实现界面设计,控件如图所示。 按钮(Push Button):通过鼠标单击按钮可以实现某种行为,并调用相应的回调函数。 滚动条(Slider):能够通过移动滚动条来改变指定范围内的数值输入,滚动条的位置代表输入数值。 单选按钮(Radio Button):单选按钮通常以组为单位,一组单选按钮之间是一种互相排斥的关系。
复选框(Check Box):复选框与单选按钮类似,只是多个复选框可 以同时有效。 编辑框(Edit Text):编辑框可编辑或修改字符串的文本域。 静态文本(Static Text):静态文本通常作为其他控件的标签使用。 弹出式菜单(Pop-up menu):弹出式菜单将打开并显示选项列表。 列表框(Listbox):列表框显示列表项,并能够选择其中的一项或 多项。 拴牢按钮(Toggle Button):拴牢能够产生一个二进制状态的行动。 组合框(Panel):组合框是图形窗口中的一个封闭区域,它把相关 联的控件组合在一起。 按钮组(Button Group):按钮组类似于组合框,但是它可以响应单 选按钮以及拴牢按钮的高级属性。 坐标轴(Axes):坐标轴可以设置关于外观和行为的参数。
8.1.4 界面设计工具集 1.界面设计编辑器 2.属性检查器 3.对象浏览器 4.菜单编辑器 GUIDE提供的界面设计工具集包括如下内容: 8.1.4 界面设计工具集 1.界面设计编辑器 2.属性检查器 3.对象浏览器 4.菜单编辑器 GUIDE提供的界面设计工具集包括如下内容: 界面设计编辑器:添加并排列图形窗口中的控件对象。 属性检查器:检查并设置控件的属性值。 对象浏览器:观察此次MATLAB运行过程中图形对象的句柄集成关系表。 菜单编辑器:创建窗口菜单和上下文菜单。
1.界面设计编辑器 界面设计编辑器由以下4个部分组成:控件面板;工具栏; 菜单栏;界面区域。 (2)上下文菜单 (1)控件面板 在GUI界面中放置控件: 单击控件面板中需要放置控件的按钮; 在光标变为十字形后,使用十字形 光标的中心点来确定控件左上角的位置; 可以通过拖动鼠标来确定控件的大小。 (2)上下文菜单 使用界面设计编辑器进行界面设计时: 选择一个对象; 单击鼠标右键来显示其对应的上下 文菜单。 上图描述了一个与按钮相联系的上下文菜单,同时所有已定义的回调函数都可列出。
(3)排列工具 可以在界面区域内通过选择并拖动任意控件(群)对其进行 控件排列,当选择【Tools】菜单下的【Align Objects】选 项时即可打开下图所示的排列工具栏。
(4)网线和标线 界面区域内可以使用网格和标线辅助设计,当选择【Tools】 菜单下的【Grid and Rulers】选项时即可打开下图所示的网 格和标线对话框。
2.属性检查器 属性检查器提供所选择对象的可设置属性列表及当前属性值, 并可以进行手动设置,当选择【View】菜单下的【Property Inspector】选项时即可打开类似下图所示的属性检查器。
3.对象浏览器 4.菜单编辑器 对象浏览器可以显示图形窗口中所有对象的继承关系。 GUIDE能够创建菜单栏和上下文菜单。 当选择【Tools】菜单下的【Menu Editor】选项时即可打开下图所示的菜单编辑器。
使用【New Menu】工具栏创建一个菜单; 指定其隶属关系; 指定其属性。 (1)菜单栏菜单 使用【New Menu】工具栏创建一个菜单; 指定其隶属关系; 指定其属性。 (2)上下文菜单 上下文菜单设计好后,当单击 鼠标右键时它随之出现。 使用【New Context Menu】 工具栏创建一个菜单; 指定其隶属关系; 指定其属性。
8.1.5 GUI组态 1.窗口重画行为 2.命令行访问 3.生成FIG文件和M文件
在添加控件前,应使用GUIDE应用程序选项对话框对GUI组 态进行设置。选择界面设计编辑器的【Tools】菜单下的 【Application Options】选项打开如下图所示选项对话框。
该对话框能够设置的选项如下: 窗口重画行为(Resize behavior); 命令行访问(Command-line accessibility); 生成FIG文件和M文件(Generate FIG-file and M- file); 生成回调函数原型(Generate callback function prototypes); 同一时刻仅允许运行一个应用程序实例(GUI allows only one instance to run (singleton) ); 使用系统背景颜色设置(Using the system background colors); 仅生成FIG文件(Generate FIG-file Only)。
8.1.6 GUI界面设计 GUI界面设计是通过使用界面 设计编辑器进行的,控件的布 置前面已经介绍,但在布置后 往往需要定义控件的属性。 用鼠标双击该控件,即可看到其对应的属性检查器。 当第一次将按钮布置在界面后,双击该按钮即可看到如下图所示的属性检查器,其中包含属性Tag和Callback。
8.2 编程设计GUI 1.M文件及数据管理 2.回调函数的使用方法 3.图形窗口的行为控制 GUI的编程方法:
1.M文件及数据管理 (1)M文件 GUI的一个重要任务就是通过控件响应指定行为。 GUIDE给添加到应用程序M文件中的回调函数自动命名,并 使控件被激活时该函数能够被调用。 (2)数据管理 GUIDE使用应用程序M文件来定义和实现数据的存储和读取,文件中包含所有GUI控件对象句柄的结构体handles。
2.回调函数的使用方法 (1)回调函数类型 ① 图形对象的回调函数 ButtonDownFcn:当用户将鼠标放置在某个对象时,单击 鼠标左键,MATLAB将调用回调函数。 CreatFcn:MATLAB将在创建对象时,调用回调函数。 DeleteFcn:MATLAB在删除对象之前调用回调函数。 ② 图形窗口的回调函数 CloseRequestFcn:当请求关闭图形窗口时,调用回调函数。 KeyPressFcn:当用户在图形窗口内按下鼠标键时,调用回调函数。 ResizeFcn:当用户重画图形窗口时,调用回调函数。
WindowButtonDownFcn:当用户在图形窗口内无控件 的地方按下鼠标键时,调用回调函数。 WindowButtonMotionFcn:当用户在图形窗口中移动 鼠标时,调用回调函数。 WindowButtonUpFcn:当用户在图形窗口中释放鼠标 键时,调用回调函数。
(2)回调函数执行中断 默认情况下MATLAB允许回调函数执行中断,且可以随时终 止操作,则终止操作对应的回调函数将会中断装载数据操作 对应的回调函数。 ① 可执行中断设置 图形对象都包含属性Interruptible,该属性的默认值为on,表示回调函数可以执行中断。 同时图形对象都包含属性BusyAction,它有如下两种可能的取值: queue:将事件保存在事件序列中并等待不可中断回调函数执行完毕后处理。 cancel:放弃该事件并将事件从序列中删除。
② 执行中断的规则 遇到命令drawnow、figure、getframe、pause或waitfor, MATLAB将该回调函数挂起并开始处理事件序列。 事件序列的顶端事件要求重画图形窗口,MATLAB将执行重 画并继续处理事件序列中的下一个事件。 事件序列的顶端事件将会导致一个回调函数的执行, MATLAB将判断回调函数被挂起的对象是否可中断。 当所有事件都被处理后,MATLAB恢复被中断函数的执行
3.图形窗口的行为控制 在设计GUI时,需要考虑GUI图形窗口的行为控制,主要包 括如下3种情况: 询问用户并阻止MATLAB运行直至用户作出回答,此时 图形窗口仅可以被观察。 警告用户其指定的操作将会破坏文件的对话框,该对话 框能够执行用户所需的操作前强迫用户作出回答。 下面3种技术能够有效地解决上述3种情况: 允许单个或多个GUI实例同时运行。 在显示GUI时阻止MATLAB的运行。 使用模态图形窗口使用户只能与当前执行的GUI进行交互。
8.3 图形用户界面设计实例
编写函数,这些函数都包含在随图形用户界面设计时产生的 M文件中。 1.图形用户界面打开时自动运行的函数 simple_gui_OpeningFcn(),其具体代码序列如下:
2.3个按钮的回调函数(Callback),具体代码序列如下:
3.下拉菜单的回调函数(Callback),具体代码序列如下:
4.菜单项Close的回调函数(Callback),其具体代码序 列如下: 最后激活的图形用户界面如图所示:
当选择【File】菜单下的【Close】选项,图形用户界面将关闭。 当在下拉菜单中选择【sinc】且单击【Mesh】按钮,可得到如下 图所示的结果。 当选择【File】菜单下的【Close】选项,图形用户界面将关闭。 关闭guide后,在命令窗口直接输入如下代码序列也可以运行图形用户界面。 clear simple_gui
由上面的例子,可以总结出图形用户界面设计的基本流程: 首先新建一个模板,并设置GUI应用程序选项,保存文件; 其次布置界面,并设置模板和控件的属性; 再次设置初始/结束函数和回调函数; 最后激活/运行图形用户界面。
习 题 1.利用图形用户界面,实现记事本【File】菜单下的【新 建】、【打开】、【保存】、【另存为】和【退出】菜单 项功能。 2.利用图形用户界面,设计能够完成增、删、改通讯簿记 录的程序。
第九章Simulink仿真
本章主要讲解: Simulink的概念及其应用; Simulink搭建系统模型的方法及特点; Simulink环境中的仿真及调试。
目录 9.1 Simulink概述 9.2 模型的创建 9.3 子系统及其封装 9.4 过 零 检 测 9.5 代 数 环
9.6 回 调 函 数 9.7 运 行 仿 真 9.8 仿真结果分析 9.9 模型的调试 9.10 S 函 数 9.11 实 例 习 题
9.1 Simulink概述 9.1.1 Simulink的概念 9.1.2 Simulink的工作环境 9.1.3 Simulink的工作原理
9.1.4 Simulink模型的特点 9.1.5 Simulink里的数据类型 9.1.6 Simulink里的模块和模块库
9.1.1 Simulink的概念 Simulink是MATLAB提供的实现动态系统建模 和仿真的软件包,是MATLAB相对独立的重要的组 成部分。 Simulink的突出特点是支持图形用户界面 (GUI),模型由模块组成的框图来表示。
启动Simulink(6.0版)有如下3种方式: 在MATLAB的命令窗口直接键入命令Simulink; 用鼠标左键单击MATLAB工具条上的按钮; 在MATLAB菜单上选择【File】|【New】|【Model】 选项。
运行后会弹出如下图所示的Simulink模块库浏 览器窗口 。
使用第3种方式打开时还会弹出如下图所示的 新建模型窗口。
9.1.2 Simulink的工作环境 1.【File】菜单 2.【Edit】菜单 3.【View】菜单
4.【Simulation】菜单 5.【Format】菜单 6.【Tools】菜单 7.【Help】菜单
Simulink模块库浏览器各部分的用途,如下图 所示。
1.【File】菜单 【File】菜单中各选项的名称与功能如下表所 示。
【File】菜单
2.【Edit】菜单 【Edit】菜单中各选项的名称与功能如下表所 示。
【Edit】菜单
3.【View】菜单 【View】菜单中部分主要选项的名称与功能如 下表所示。 【View】菜单
4.【Simulation】菜单 【Simulation】菜单如下图所示。
【Simulation】菜单各选项的功能如下 : 【Start】:开始运行仿真; 【Stop】:停止仿真; 【Configuration Parameters】:设置仿真参数 和选择解法器; 【Normal】、【Accelerator】、【External】 分别表示正常工作模式、加速仿真和外部工作模式。
5.【Format】菜单 【Format】菜单用于设置字体、屏幕颜色、模 块名的显示、模块显示颜色、信号和端口类型和宽 度等。 该菜单部分主要选项的名称与功能如下表所示。
【Format】菜单
6.【Tools】菜单 【Tools】菜单中部分主要选项的名称与功能 如下表所示。
【Tools】菜单
7.【Help】菜单 【Help】菜单中部分主要选项的名称与功能如 下表所示。
【Help】菜单
9.1.3 Simulink的工作原理 1.图形化模型与数学模型间的关系 2.图形化模型的仿真过程
1.图形化模型与数学模型间的关系 现实中每个系统都有输入、输出和状态3个基 本要素,以及它们之间随时间变化的数学函数关系, 即数学模型。
图形化模型也体现了输入、输出和状态间随时 间变化的某种关系,如下图所示。 只要这两种关系在数学上是等价的,那么就可 以图形化模型代替数学模型。
2.图形化模型的仿真过程 Simulink的仿真过程包括如下几个阶段: 模型编译阶段; 连接阶段; 仿真环阶段。
(1)模型编译阶段 Simulink引擎调用模型编译器,将模型编译成 可执行文件。 编译器完成以下任务: 计算模块参数的表达式以确定它们的值; 确定信号属性(如名字、数据类型等); 传递信号属性以确定未定义信号的属性。
优化模块; 展开模型的继承关系(如子系统); 确定模块运行的优先级; 确定模块的采样时间。
(2)连接阶段 Simulink引擎按执行次序创建运行列表,初始 化每个模块的运行信息。
(3)仿真环阶段 Simulink引擎从仿真的开始到结束,在每一个 采样点按运行列表计算各模块的状态和输出。
仿真环阶段又分成以下两个子阶段: 初始化阶段:该阶段只运行一次,用于初始化系 统的状态和输出; 迭代阶段:该阶段在定义的时间段内按采样点间 的步长重复运行。
9.1.4 Simulink模型的特点 Simulink建立的模型具有以下3个特点: 仿真结果的可视化; 模型的层次性; 可封装子系统。
9.1.5 Simulink里的数据类型 1.Simulink支持的数据类型 2.数据类型的传播 3.使用复数信号
Simulink在仿真开始之前和运行过程中会自动 确认模型的类型安全性,以保证该模型产生的代码 不会出现上溢或下溢。
1.Simulink支持的数据类型 Simulink支持所有的MATLAB内置数据类型, 除此之外Simulink还支持布尔类型。 打开Simulink模型窗口中的菜单Help下的选项 Block Support Table,打开如下图所示的帮助窗 口,总结了所有Simulink库中的模块所支持的数据 类型。
打开Simulink模型窗口的【Format】| 【Port/Signal Displays】|【Port Data Types】, 查看信号的数据类型和模块输入/输出端口的数据 类型,如下图所示。
2.数据类型的传播 相连模块的输出/输入信号所支持的数据类型如 果是不相同的,在仿真中就会弹出错误提示对话框, 告知出现冲突的信号和端口。 此时可以尝试在冲突的模块间插入 DataTypeConversion模块来解决类型冲突。
3.使用复数信号 Simulink默认的信号值都是实数,但在实际问 题中有时需要处理复数信号。 在Simulink中通常用下面两种方法来建立处理 复数信号的模型,如下图所示。
在模型中加入Constant模块,并将其参数设为复 数。 分别生成复数的虚部和实部,再用Real-Image to Complex模块把它们联合成一个复数。 分别生成复数的幅值和幅角,再用Magnitue- Angle to Complex模块把它们联合成一个复数。
9.1.6 Simulink里的模块和模块库 模块库提供各种基本模块,它按应用领域以及 功能组成若干子库,并按树状结构进行显示。 模块是Simulink建模的基本元素。 下表详细介绍了Simulink中常用子库中常用模 块的功能 。
Commonly Used Blocks子库
Continuous子库
Discontinuities子库
Discrete子库
Logic and Bit Operations子库
续表
Math Operations子库
续表
Ports & Subsystems子库
续表
Sinks子库
Sources子库
User-Defined Functions子库
9.2 模型的创建 1.模块的基本操作 2.创建模型的基本步骤 3.模型文件格式
1.模块的基本操作 下表汇总了Simulink对模块进行操作的部分方 法。 对模块进行操作
续表
下表汇总了Simulink对直线进行操作的部分方 法。
双击模块将会弹出【参数设置】对话框,如下 图所示的增益模块,进而设置参数值。
鼠标右键单击模块并在弹出的上下文菜单中选 择【Block Properties】,会弹出属性设置对话框, 如下图所示,其中包括如下三项内容。 【General】页; 【Block Annotation】页; 【Callbacks】页。
(1)【General】页 Description:用于对该模块在模型中的用法进行 注释; Priority:定义该模块在模型中执行的优先顺序; Tag:为模块添加文本格式的标记。
(2)【Block Annotation】页 用于指定在图标下显示模块的参数、取值及格 式。
(3)【Callbacks】页 用于定义该模块发生某种指定行为时所要执行 的回调函数。 对信号进行标注以及对模型进行注释,方法如 下表所示。
在连线上反映信息
对注释进行处理
2.创建模型的基本步骤 利用Simulink进行系统建模和仿真的一般步骤 如下。 绘制系统流图; 将所需模块放入空白模型窗口中,按系统流图的 布局连接各模块,并封装子系统;
设置各模块的参数以及与仿真有关的各种参数; 保存模型,模型文件的后缀名为.mdl; 运行并调试模型。
3.模型文件格式 Simulink还提供了通过命令行建立模型和设置 模型参数的方法。 Simulink将每一个模型(包括库)都保存在一 个以.mdl为后缀的文件里,称为模型文件。 一个模型文件就是一个结构化的ASCII文件,它 包括关键字和各种参数的值。
9.3 子系统及其封装 9.3.1 创建子系统 9.3.2 封装子系统 9.3.3 自定义模块库
9.3.1 创建子系统 1.子系统的作用 2.子系统的创建方法 3.子系统创建示例
1.子系统的作用 通过子系统可以把复杂的模型分割成若干个简单 的模型,具有以下优点: 减少模型窗口中模块的个数,使得模型窗口整洁。 把一些功能相关的模块集成在一起,可以复用。 通过子系统可以实现模型图表的层次化。
2.子系统的创建方法 Simulink有如下两种创建子系统的方法。 通过子系统模块来创建子系统:先向模型中添加 Subsystem模块,然后打开该模块并向其中添加模 块; 组合已存在的模块集。
3.子系统创建示例 例 通过Subsystem模块创建子系统。具体步骤如下。 从Ports&Subsystems中复制Subsystem模块到模 型中,如下图所示; 用鼠标左键双击Subsystem模块图标打开如下图所 示Subsystem模块编辑窗口;
在新的空白窗口创建子系统,然后保存; 运行仿真并保存。
例 通过组合已存在的模块创建子系统。具体步骤如 下。 创建如下图所示的系统; 选中要创建成子系统的模块,如下图所示;
选择【Edit】|【Create Subsystem】菜单,结 果如下图所示; 运行仿真并保存。
9.3.2 封装子系统 1.封装的作用 2.封装的过程 3.封装示例
封装后的子系统与Simulink提供 的模块一样拥有图标,并且用鼠标左 键双击图标时会出现一个用户自定义 的【参数设置】对话框,实现在对话 框中设置子系统中的参数。
1.封装的作用 子系统中各个模块的参数通过参数对话框就可以 进行设置。 为子系统创建可以反映子系统功能的图标。 可以避免用户在无意中修改子系统中模块的参数。
2.封装的过程 选择需要封装的子系统,并选择【Edit】|【Mask Subsystem】菜单进行封装。 选择【Edit】|【Edit mask】菜单,这时会弹出 如下图所示的封装编辑器,通过它进行各种设置。 单击【Apply】或【OK】按钮保存设置。
3.封装示例 例 简介封装的过程。具体步骤如下: (1)建立如下图所示的含有子系统的模型,并设置 子系统中Gain模块的Gain参数为一变量m。
(2)选中模型中的Subsystem子系统,选择【Edit】 |【Mask Subsystem】菜单进行封装,进而选择 【Edit】|【Edit mask】菜单(或用鼠标右键单击 子系统弹出上下文菜单,选择【Edit mask】菜单) 打开封装编辑器,如下图所示。
(3)按照如下图所示设置【Icon页】。 ① Icon options面板:定义图标的边框是否可见等。 ② Drawing commands文本框:定义绘制模型图标 的方式。 ③ Examples of drawing commands面板:说明各 种绘制图标的命令,每种命令都对应一个示例。
(4)按照如下图所示设置【Parameters】页。
定义封装子系统参数设置对话框的可设置参数, 其中各项设置的含义如下图所示。
(5)按照如下图所示设置 【Initialization】 页。定义封装子系统的初始化命令,包括MATLAB 表达式、函数、运算符和在【Parameters】页定 义的变量。
(6)按照如下图所示设置【Documentation】页
定义封装子系统的封装类型、模块描述和模块 帮助信息,其中各项设置的含义如下图所示。
(7)设置参数后运行仿真,用鼠标左键双击模型中 的Scope模块,看到如下图所示的结果。
9.3.3 自定义模块库 大量封装子系统模块按照功能需要分门别类地 来存储,以方便查找,每一类即为一模块库。 通过自定义模块库,可以将为某个领域服务的 所有模块集中存放。
通过选择Simulink界面的【File】|【New】| 【Library】菜单来创建模块库。 选中该菜单后将弹出一个空白的库窗口; 然后将需要存放在同一模块库中的模块复制到模 块库窗口中即可,如下图所示。
9.4 过 零 检 测 过零检测通过Simulink为模块注册 若干过零函数,当变化趋势剧烈时, 过零函数发生符号变化。
每个采样点仿真结束时Simulink 检测是否有过零函数符号变化,如果 检测到过零点,Simulink将在前一个 采样点和目前采样点间内插值。
下表列出了Simulink中支持过零检测的模块。 支持过零点检测的模块
9.5 代 数 环 如果Simulink模块的输入是依赖于该模块的输 出,就会产生一个代数环,如下图所示。 这意味着无法进行仿真,因为没有输入就得不 到输出,没有输出也得不到输入。
解决代数环的办法包括以下几种: 尽量不形成代数环的结构,采用替代结构; 为可以设置初始值的模块设置初值; 对于离散系统,在模块的输出一侧增加unit delay 模块; 对于连续系统,在模块的输出一侧增加memory 模块。
9.6 回 调 函 数 为模型或模块设置回调函数的方 法有下面两种: 通过模型或模块的属性对话框来设置; 通过MATLAB相关的命令来设置。
模型属性设置见下图。
模块属性设置见下图。
模型属性设置对话框中的Callbacks页给出了回 调函数列表,如下表所示。 模型的回调参数
模块的回调参数
续表
9.7 运 行 仿 真 1.使用窗口运行仿真 2.仿真参数设置 3.仿真诊断对话框 4.使用命令运行仿真 5.改善仿真性能及精度
1.使用窗口运行仿真 建立好模型后,可以直接在模型窗口通过菜单 项或工具栏进行仿真,如下图所示。
2.仿真参数设置 可以通过模型窗口的【Simulation】| 【Configuration Parameters】菜单项打开设置仿 真参数的对话框,如下图所示。
3.仿真诊断对话框 如果模型在运行过程中遇到错误,将停止仿真, 并弹出仿真诊断对话框。通过该对话框,可以了解 模型出错的位置和原因,如下图所示。
4.使用命令运行仿真 MATLAB允许通过命令窗口运行仿真。 MATLAB提供函数sim()运行仿真,其具体使用方法 如下: [t,x,y] = sim(filename, timespan, options, ut); [t,x,y1, y2, ..., yn] = sim(filename,timespan,options,ut)。
只有参量filename是必需的,各参量的含义如 下表所示。 函数sim()参量
5.改善仿真性能及精度 Simulink的仿真性能和精度受许多因素的影响, 包括模型的设计、仿真参数的设置等。 但是对于某些问题,适当的调整仿真参数可以 得到更好的结果,如: 加速仿真 提高精度
9.8 仿真结果分析 1.观看输出结果 2.线性化分析 3.平衡点分析
1.观看输出结果 在Simulink中有如下3种方法绘制模型的仿真 结果。 在模型中将信号输入到Scope模块; 将输出写入To Workspace 模块,然后使用 MATLAB绘图功能。 将输出写入To File 模块,然后使用MATLAB文件 读取和绘图功能。
2.线性化分析 Matlab中用函数linmod()和dlinmod()来分别 实现连续模型和离散系统、混杂系统的线性化,其 具体使用方法如下: [A,B,C,D] = linmod(filename); [A,B,C,D] = dlinmod(filename, Ts)。
3.平衡点分析 Simulink通过函数trim()来计算动态系统的平 衡点。并不是所有时候都有解,如果无解,函数 trim()将返回离期望状态最近的解。
9.9 模型的调试 1.Simulink调试器 2.命令行调试 3.设置断点 4.显示仿真的信息 5.显示模型的信息
Simulink提供了调试器,以方便 查找和诊断模型中的错误,它允许通 过单步运行仿真显示模块的即时状态、 输入和输出。
1.Simulink调试器 下表对该对话框工具栏各按钮的功能进行了详 细介绍 。
调试器工具栏
2.命令行调试 许多Simulink命令和消息是通过Method ID和 Block ID来引用方法和模块的。 Block ID是在编译阶段分配的,形式为sid:bid。
3.设置断点 断点就是使仿真运行到该位置时停止,同时可 以使用命令continue使仿真继续运行。调试器允许 定义无条件断点和有条件断点。
(1)设置无条件断点 设置无条件断点有如下3种方式: 通过调试器工具栏; 通过调试器Simulation Loop页; 通过在MATLAB命令窗口运行相关命令。
(2)设置有条件断点 设置有条件断点可以通过在调试器【Break on conditions】页中设置相应的断点条件来实现。
4.显示仿真的信息 Simulink调试器工具条中的按钮用于显示模块 的输入/输出信息。 首先在模型窗口选中模块; 然后用鼠标左键单击该按钮,被选中的模块在当 前采样点的输入、输出和状态信息将显示在调试器 窗口的【Outputs】页中。
5.显示模型的信息 调试器除了可以显示仿真的相关信息外,还可 以显示模型的相关信息。 在MATLAB命令窗口中,可以用命令slist显示 系统中各模块的索引,模块的索引就是它们的执行 顺序,它与调试器窗口中【Sorted List】页显示的 内容是一样。
9.10 S 函 数 9.10.1 概念 9.10.2 功能 9.10.3 工作流程 9.10.4 书写规范 9.10.5 应用示例
9.10.1 概念 S函数是一种描述动态系统的计算机语言,可以 用MATLAB、C、C++、Ada或 Fortran语言书写。 S函数采用一种特殊的调用语法使得S函数可以 和Simulink解法器进行交互。S函数可以用来描述 连续、离散和混杂系统。
9.10.2 功能 S函数可以实现以下操作。 可以通过它用多种语言来创建新的通用性的 Simulink模块。 9.10.2 功能 S函数可以实现以下操作。 可以通过它用多种语言来创建新的通用性的 Simulink模块。 编写好的S函数,可以在User-Defined Functions模块库的S-function模块中通过名称来 调用,并可以进行封装。
可以通过S函数将一个系统描述成一个数学方程。 便于图形化仿真。 可以创建代表硬件驱动的模块。
9.10.3 工作流程 1.模块输入、状态和输出间的数学关 系 2.Simulink仿真流程 3.S函数的回调函数
1.模块输入、状态和输出间的数学关系 描述一个Simulink模块需要3个基本元素: 输入向量(u); 状态向量(x); 输出向量(y)。
输出是输入向量、状态向量和采样时间的函数。 在计算中,往往需要利用如下所示的3种关系。
Simulink在仿真时把上面的关系对应为不同的 函数,它们分别实现计算模块的输出、更新模块的 离散状态和计算连续状态的微分。
2.Simulink仿真流程 Simulink仿真按照如下图所示的流程进行。 初始化阶段,Simulink将库中的模块并入到自建 模型中; 然后进入仿真循环; 如此循环直至仿真结束。
3.S函数的回调函数 一个S函数是由一系列回调函数组成,在仿真循 环中的每个仿真阶段都由Simulink调用回调函数来 执行相应的任务。
S函数的回调函数可以完成以下任务。 初始化; 计算下一个采样点; 计算当前仿真步的输出; 更新当前仿真步的离散状态; 积分。
9.10.4 书写规范 每一个M文件S函数具有如下的形式: [sys,x0,str,ts]=f(t,x,u,flag,p1,p2,...) 9.10.4 书写规范 每一个M文件S函数具有如下的形式: [sys,x0,str,ts]=f(t,x,u,flag,p1,p2,...) 下表列出了上面各参数的含义。
函数各参数的含义
续表
书写M文件S函数时只需用MATLAB语言来编写 每个flag值对应的子函数即可。 下表列出了在各个仿真阶段对应要执行的回调 函数以及相应的flag参数值。
各个仿真阶段对应要执行的S函数方法
9.10.5 应用示例 利用“User-Defined Functions”库中的S- Function模块创建由MATLAB语言书写的M文件S 函数。
运行Simulink模型可得到如下图所示的仿真结 果。上下两个模块的输出结果一样,证明了S函数 的功能是正确的。
9.11 实 例 例 针对平面直角坐标系,实现坐标在几种常 用坐标系间的变换,具体步骤如下。 首先列出常用的坐标系。 9.11 实 例 例 针对平面直角坐标系,实现坐标在几种常 用坐标系间的变换,具体步骤如下。 首先列出常用的坐标系。 (1)直角坐标系 (oxy) 原点o位于任意位置,轴ox指向任意方向,轴 oy垂直于轴ox。
(2)极坐标系(ox) 极点o与直角坐标系的原点o重合,极轴ox与直 角坐标系的轴ox重合,矢径与极轴ox的夹角为极 角。 (3)平移直角坐标系(o1x1y1) 原点o1在原直角坐标系的坐标为(g,h),轴 o1x1和o1y1分别平行于原直角坐标系的轴ox和oy。
(4)旋转直角坐标系(ox2y2) 原点o与原直角坐标系的原点o重合,轴ox2和 oy2分别逆时针旋转角度。 其次写出坐标在不同坐标系间的转换关系。
再次构造Simulink框图。 (1)由极坐标系转换到直角坐标系的框图如下图所 示。
按下“Ctrl+A”键选中所有模块和连线,并创建 子系统。 双击该子系统,修改模块In1的标注为“极坐 标”,模块Out1的标注为“直角坐标”。得到如 下图所示的结果。
然后封装该子系统并设置参数,同保存该子系 统为.mdl文件。 (2)由平移直角坐标系转换到直角坐标系的框图。 类似于上面的步骤,创建的子系统如下图所示。
其中,利用到模块Constant、Demux、Mux 和Fcn。 封装该子系统并设置参数,双击如下图所示的 子系统。
可看到如下图所示的结果。
(3)由旋转直角坐标系转换到直角坐标系的框图。 建立如下图所示的子系统,
并进行如下图所示的封装设置。
最后构成并保存自建模型库,如下图所示。
习 题
第十一章 外部接口 11.1 与Word/Excel的混合使用 11.2 编 译 器 11.3 应用程序接口 习 题
11.1.1 Notebook的使用 11.1.2 Excel link的使用 11.1与Word/Excel的混合使用 在Word环境中可以使用MATLAB的资源。同时MATLAB也可以与Excel混合使用。 11.1.1 Notebook的使用 11.1.2 Excel link的使用
11.1.1 Notebook的使用 1.在Word中执行代码的基本过程 2.Notebook使用中应该注意的问题
安装Notebook(又称M-book)时,计算机中 必须已经安装Word和MATLAB,其具体步骤如下。
1.在Word中执行代码的基本过程 Notebook采用输入细胞(Input Cell)来定 义MATLAB的代码,具体操作步骤如下。 采用文本格式输入代码,末尾不要加回车 和空格。
通过Notebook菜单中的【Define Input Cell】选项定义输入细胞,其中输入细胞 都显示为黑方括号包括绿色字符的形式。 通过Notebook菜单中的【Evaluate Cell】选项或者按Ctrl+Enter键,运行 输入细胞内的代码,并得到黑方括号包 括蓝色字符形式的输出细胞。
2.Notebook使用中应该注意的问题。 M-book文档中的MATLAB代码必须在英 文状态下输入。 带鼠标操作交互的代码最好不在M-book 文档中运行。
在运行M-book文档时,最好不运行其他 序的正确执行。 采用以下方法解决代码执行中出现的异常 情况:代码以命令clear开始;重新启动 计算机后,再执行M-book文档中的程 序;将M-book文档的代码拷贝到M文 件,再到MATLAB的命令窗口执行。
M-book文档的代码运行速度要比在 MATLAB命令窗口中执行慢很多。 当编辑科技论文或其他文档时,最后可将 细胞转换为普通文本。
可使用Notebook菜单中的【Bring MATLAB to Font】选项或者按组合键Alt +M把MATLAB的命令窗口调到前台。 可使用Notebook菜单中的【Toogle Graph Output for Cell】 选项控制是否 显示输入细胞或输出细胞的输出图形。
11.1.2 Excel link的使用 1.Excel link的安装 2.Excel link的启动 3.Excel link的终止 要注意的几个问题
Excel link是在Microsoft Windows环境 下实现Microsoft Excel和MATLAB进行 交互的插件。 使用Excel link时,不必脱离Excel环 境。 Excel link提供11条功能函数来实现数据 的链接和操作。
1.Excel link的安装 系统需要在Windows环境下先安装 Excel,然后再安装MATLAB和Excel link。 Excel link随安装MATLAB时安装的,即 在MATLAB安装组件中选中Excel link。
需要在Excel中设置,具体步骤如下。 启动Microsoft Excel,单击工具菜单 (Tools),执行【加载宏】命令,得到 如下图所示的结果。
在打开的【加载宏】对话框中单击【浏览】按 钮,选择MATLAB安装目录下的 \toolbox\exlink子目录里的excllink.xla文件, 然后单击【确定】按钮,如下图所示。
返回【加载宏】窗口,此时已经选中了 【Excel link】选项,如下图所示。单击 【确定】按钮后,Excel link插件即可加 载MATLAB,并可以看到其运行窗口。
2.Excel link的启动 按照上面的设置,每次启动Excel时Excel link 和MATLAB将自动运行。
如果不希望Excel link和MATLAB自动运行,可 以通过在Excel数据表单元中输入 “=MLAutoStart(”no“)”即可改变设置,如下图所 示。
同时可以从Excel环境中手动启动Excel link和 MATLAB。首先,在Tools菜单中选择【宏】选项, 如下图所示;
在如下图所示的对话框中输入“MATLABinit”, 单击【执行】按钮后即可启动Excel link,并同时 启动MATLAB。
3.Excel link的终止 当终止Excel的时候,Excel link和MATLAB会 被同时终止。
如果需要在Excel环境中终止MATLAB和 Excel link的运行,则在工作表单元中输 入“=MLClose()”即可,如下图所示。当 需要重新启动Excel link和MATLAB时, 可以使用MATLABinit命令。
4.Excel link使用时需要注意的几个问题 分,而MATLAB函数名是区分大小写的。 Excel工作表等式通常以“+”或“=”作为起 始标记。 在大多数Excel link函数中有两种定义变 量的方式,即直接定义和间接定义。
Excel link函数执行过程中其所在数据单 元将一直显示其函数内容,函数执行完毕 后,数据单元将被赋值为0。 建议设置Excel【工具】工具菜单里【选 项】的【编辑】页中【按Enter键后移 动】选项为【向下】,以保证输入完毕且 经确认后再改变当前工作单元。
11.2 编 译 器 11.2.1 编译器概述 11.2.2 编译器的安装和配置 11.2.3 编译器的使用
MATLAB编译器是指将M文件作为 其输入,同时生成独立的可执行文件 或相关软件组件的程序,它可以由命 令mcc调出。
11.2.1 编译器概述 MATLAB编译器4.0版本采用了MATLAB Component Runtime(MCR)技术。 11.2.1 编译器概述 MATLAB编译器4.0版本采用了MATLAB Component Runtime(MCR)技术。 MCR提供了对MATLAB语言的完全支 持。 MATLAB编译器采用了Component Technology File(CTF)存档来组织配 置文件包。
所有的M文件均采用了高级加密标准 (AES)进行了密钥为1 024位的加密, 保存为CTF格式。 每一个由MATLAB编译器生成的应用程序 或者共享库均有一个与之相对应的CTF存 档。
MATLAB编译器自动生成独立文件或软件组件。 为了生成独立运行的MATLAB应用程序,只需要用 来构成应用程序的M文件,然后编译器将会自动执 行以下操作。 依赖性分析; 代码生成; 存档生成; 编译; 链接。
11.2.2 编译器的安装和配置 1.安装ANSI C/C++编译器 2.安装MATLAB编译器 3.配置编译器 4.安装MCR
1.安装ANSI C/C++编译器
2.安装MATLAB编译器 MATLAB编译器的安装过程包含在安装 MATLAB之中,当选择Typical的安装模式时, MATLAB Compiler会被自动选为MATLAB的安装 组件。
当选择Custom安装模式时,在默认情况下, MATLAB Compiler选项是被选中的,如下图所示。
3.配置编译器 下面将介绍如何配置C或C++编译器,使其可 以与MATLAB编译器一起进行工作。
4.安装MCR 将MATLAB安装路径中的 \toolbox\compiler\deploy\win32子目 录下的文件MCRInstaller.exe拷贝到其 他路径; 双击进行安装,直到提示安装结束。
11.2.3 编译器的使用 1.编译指令mcc 2.创建独立执行程序
1.编译指令mcc 不管是生成独立执行程序,还是C共享库以及 软件组件,只要源码是M文件都可以借助编译命令 mcc实现。
2.创建独立执行程序 下面以3个例子说明不同类型的编译过程。
打开DOS窗口,将路径变更为exm2.exe所在 目录,并运行exm2.exe,运行结果如下图所示。
11.3 应用程序接口 11.3.1 创建C语言MEX文件 11.3.2 Java接口 11.3.3 DDE技术 11.3 应用程序接口 11.3.1 创建C语言MEX文件 11.3.2 Java接口 11.3.3 DDE技术 11.3.4 ActiveX技术
MATLAB提供应用程序接口 (Application Program Interface, API)来实现与其他外部程序的沟通。
11.3.1 创建C语言MEX文件 1.MEX文件简介 2.编写MEX文件源程序
1.MEX文件简介 MEX是MATLAB和Executable两个单词的缩写。 MEX文件一般使用C或者Fortran语言编写,通过编译生 成的目标文件能够被MATLAB调用执行。 MEX文件主要应用于已存在较大规模的C或者Fortran程序。 矩阵是MATLAB唯一能处理的对象,在C语言中矩阵用结构体mxArray来定义。
2.编写MEX文件源程序 编写MEX文件源程序时,要用到两类API库函数: mx-库函数,用于在C语言中创建、访问、操作和删除 结构体mxArray; mex-库函数,用于与MATLAB环境进行交互。
11.3.2 Java接口 Java语言是一种面向对象的高级编程语言。在MATLAB中可 以直接调用Java的应用程序。 调用Java API类和包; 调用第三方Java类; 在MATLAB环境下创建Java对象; 通过Java语法或者MATLAB语法使用Java对象的方法; 在Java对象和MATLAB之间交互数据。
在MATLAB中创建Java对象有两种方法: 用函数javaObject()创建。
11.3.3 DDE技术 1.DDE的一般性说明 2.DDE中的MATLAB服务器 3.DDE中的MATLAB客户 动态数据交换(Dynamic Data Exchange,DDE)允许各Windows应用程序间交换数据的通信机制。 Windows平台上的MATLAB作为一个应用程序,具有借助DDE与其他应用程序通信的功能。
1.DDE的一般性说明 应用程序可以借助DDE通话实现彼此间的通信。 请求建立对话的应用程序称为客户(Client) 响应对话请求的应用程序被称为服务器(Server)。 当客户应用程序创建DDE对话时,必须识别被呼叫服务器的两个DDE参数: 服务名(Service name),即被请求对话的应用程序名; 话题(Topic),即对话主题。 由这两个参数构成了区分不同对话的惟一标识。
2.DDE中的MATLAB服务器 客户可以采用不同方法访问作为服务器的MATLAB。 假如客户应用程序是自行编制的,则可利用MATLAB引擎 库或直接利用DDE。 MATLAB用作服务器时的工作原理如下图所示。
当MATLAB作为DDE服务器使用时,所能选用的具体名称和 它们间的层次关系如下图所示。
3.DDE中的MATLAB客户 当MATLAB以客户身份建立DDE通信时,工作原理如图所示。
在Excel开启的前提下,运行结果如两图所示。
11.3.4 ActiveX技术 1.ActiveX技术的一般性说明 2.自动化客户 3.自动化服务器
1.ActiveX技术的一般性说明 ActiveX是一种基于Microsoft Windows操作系统的组 件集成协议,是各种面向对象技术的集合。 每个ActiveX都支持一个或多个赋名的界面,而界面是 一组逻辑相关方法、属性和事件的组合。 MATLAB支持两种ActiveX技术,即ActiveX控件和ActiveX自动化。 MATLAB自动化客户的功能仅是MATLAB ActiveX控件功能的子集。
2.自动化客户 若需要MATLAB通过ActiveX自动化客户支持调用其他 ActiveX组件,则须先查阅该ActiveX组建的相关文件,从中 得到该组件的名字、该组件所采用的接口名、方法、属性和 事件等。 指令actcontrol用于创建ActiveX自动化客户支持。 该指令运行后将引出指定组件名的对象默认界面。 通过该对象属性的获取和设置、方法的激活,可以改变该对象的界面和行为。
在第21行代码执行前产生如下图所示的Excel 界面。
3.自动化服务器 通过MATLAB ActiveX自动化服务器,可以在指定应用程序 中执行MATLAB命令,并可以与MATLAB的工作空间交换数 据。
习 题