kl800.com省心范文网

MATLAB及其在电子信息课程中的应用 西电第三版 第一到第五章课件


MATLAB及其应用
fums@wxc.edu.cn
2013-8-10 1

第一篇
? ? ?

语言篇

?

第1章 第2章 第3章 第4章

MATLAB 语言概述 基本语法 MATLAB 的开发环境和工具 MATLAB 的其他函数库

2013-8-10 2013年8月10日

2

第二篇
? ? ?

应用篇

?
? ?

第5章 MATLAB在电路中的应用 第6章 MATLAB在信号与系统中的应用 第7章 MATLAB在数字信号处理中应用 第8章 MATLAB在自动控制原理中应用 第9章 MATLAB工具箱简介 附录A、B、C、D

2013-8-10 2013年8月10日

3

第1章 MATLAB语言概述
? ? ?

? ?

1.1 MATLAB语言的发展 1.2 MATLAB语言的特点 1.3 MATLAB的工作环境 1.3.1 命令窗 1.3.2 图形窗 1.3.3 文本编辑窗 1.4 演示程序 1.5 网络资源

2013-8-10 2013年8月10日

4

1.1 MATLAB语言的发展
?

1.1.1 MATLAB 概述
MATLAB是集数值计算、符号运算及图形处理 等强大功能于一体的科学计算语言,是一种交互式的 以矩阵为基础的系统计算平台,它用于科学和工程的 计算与可视化。它的优点在于快速开发计算方法,而 不在于计算速度。 MATLAB已成为一门高校必修的课程,也是最 为普遍的计算工具之一。

2013-8-10 2013年8月10日

5

1.1 MATLAB语言的发展(续)
?
?

1.1.2

Matlab的发展

MATLAB名字由MATrix和 LABoratory 两词的前三个字母组合而成。 那是20世纪七十年代,时任美国新墨西哥大学计算机科学系主任 的Cleve Moler出于减轻学生编程负担的动机,为学生设计了一组 调用LINPACK和EISPACK矩阵软件工具包库程序的的“通俗易用” 的接口,此即用FORTRAN编写的萌芽状态的MATLAB。 1984年由Little、Moler、Steve Bangert合作成立MathWorks公司, 并把MATLAB正式推向市场。从这时起,MATLAB的内核采用C语言编 写,而且除原有的数值计算能力外,还新增了数据图视功能。

?

2013-8-10 2013年8月10日

6

?

1997年春,MATLAB5.0版问世,紧接着是5.1、5.2,以及和1999年 春的5.3版。现今的MATLAB拥有更丰富的数据类型和结构、更友善 的面向对象、更加快速精良的图形可视、更广博的数学和数据分 析资源、更多的应用开发工具。 2000年末又推出6.0版本。无论在界面的设计上还是在内容上较以 前版本都有很大的进展。 2004年又推出了7.0版本,

?

?

2013-8-10 2013年8月10日

7

1.1 MATLAB语言的发展(续)
?
1. 2. 3. 4. 5. 6. 7.

1.1.3

Matlab的版本演化

8.
9.

Matlab 1.0 Pc matlab->matlab 386 Matlab3.5+simulink Matlab 4.0:simlink内嵌(1992) Matlab 5.0 :全面的面向对象 Matlab 5.1~5.3 (1999) Matlab 6.0 (2000) Matlab 6.5:购并了MATRIXx Matlab 7.0: (2004)

2013-8-10 2013年8月10日

8

1.2 MATLAB语言的特点
? ? ?

?
? ? ?

友好的工作平台和编程环境 简单易用的程序语言 强大的科学计算及数据处理能力 出色的图形处理功能 应用广泛的模块集和工具箱 实用的程序接口和发布平台 模块化的设计和系统级的仿真

2013-8-10 2013年8月10日

9

1.3 MATLAB的工作环境
1.3.1 命令窗(Command Window) 单行命令执行方式 执行结果直接显示 1.3.2 图形窗(Figure Window) 用图形方式表示计算结果 1.3.3 文本编辑窗(File Editor) 多行命令组成语言组,可以文件方式存盘

2013-8-10 2013年8月10日

10

MATLAB 的主界面
主菜单栏 工具栏

当前路 径窗口

当前目录 路径

工作区 窗口

命令窗口

文件详 细信息

历史命 令窗口

快速启动 窗口按钮

2013-8-10 2013年8月10日

11 第11页

MATLAB 的工具栏
Guide:快速启动 Guide,Guide Profiler:快速启动 User 全称为 Graphical Profiler 工具,Profiler Interface development Current Directory: 工具能够分析出程序运行时 environment,用于辅助设计图 设置当前目录 间消耗情况,用于帮助分析、 形用户接口,使用该工具可以简 改进化 GUI 编程。 M 文件 新建 打开 粘贴 恢复 剪切 复制 撤 销

Simulink:打开 Simulink,Simulink 是 Help:打开 一个用来对动态系统进行建模、仿真和分 MATLAB 帮助; 析的软件包,它支持连续、离散及两者混 合的线性和非线性系统,也支持具有多种 采样频率的系统。

2013-8-10 2013年8月10日

12 第12页

MATLAB 的窗口——命令窗口
MATLAB 命令窗口。打 开 MATLAB 时,命令窗 口自动显示于 MATLAB 界面中。

运算提示符,表示 MATLAB 处 于准备状态,用户可以输入命 令,按下回车键执行,并在命 令窗口中显示运行结果

2013-8-10 2013年8月10日

13 第13页

MATLAB 的窗口——历史命令窗口
?

?

默认情况下历史命令窗口位于左下角,显示用户曾经输入 过的命令,并显示输入的时间,方便用户查询。 对于历史命令窗口中的命令,用户可以点击右键进行相应 的操作。 用户可以双击再次执行命令窗口中的命令。
命令历史窗口

?

2013-8-10 2013年8月10日

14 第14页

MATLAB 的窗口——工作区窗口
?

工作区窗口与当前路径窗口共享一块空间,可以通过标签显示 或隐藏。工作区窗口中显示当前工作区中的所有变量及其大小 和类型等。通过工作区可以对这些变量进行管理。其中包含了 工作区窗口 工作区工具栏和显示窗口。通过工具栏可以新建或删除变量、 导入导出数据、绘制变量的图形等。另外右键单击变量名可以 对该变量进行操作。

2013-8-10 2013年8月10日

15 第15页

MATLAB 的窗口——当前路径窗口
?

当前路径窗口显示当前 路径下的所有文件和文 件夹及其相关信息,并 且可以通过当前路径工 具栏或右键菜单对这些 文件进行操作 。

当前路径窗口

2013-8-10 2013年8月10日

16 第16页

1.4 演示程序
?

在MATLAB的命令窗中键入 demo或demos

2013-8-10 2013年8月10日

17

%pend.m plot([-0.2,0.2],[0;0],'color','y','linestyle','-','linewidth',10); g=0.98;l=1; theta0=pi/6;x0=l*sin(theta0); y0=-l*cos(theta0); axis([-0.75,0.75,-1.25,0]); axis('off'); head=line(x0,y0,'color','r','linestyle','.','erasemode','xor','markersize ',40); body=line([0;x0],[0,y0],'color','b','linestyle','-','erasemode','xor'); t=0;dt=0.01; while t<=50 t=t+dt; theta=theta0*cos(sqrt(g/l)*t); x=l*sin(theta);y=-l*cos(theta); set(head,'xdata',x,'ydata',y); set(body,'xdata',[0;x],'ydata',[0;y]); drawnow; 2013-8-10 18

部分命令的演示
例1.求 的算术运算结果。 [12 ? 2 ? (7 ? 4)] ? 32 (12+2*(7-4))/3^2 ans = 2 3? ?1 2 的输入步骤。 例2.简单矩阵 A ? ?4 5 6? ? ? A = [1,2,3; 4,5,6; 7,8,9]
A =
?7 8 9 ? ? ?

1 4 7

2 5 8

3 6 9

2013-8-10

19

例3. 矩阵的分行输入。 A=[1,2,3 4,5,6 7,8,9] A = 1 2 3 4 5 6 7 8 9 例4. 指令的续行输入 S=1–1/2+1/3–1/4+1/5–1/6+1/7 … -1/8 S = 0.6345
2013-8-10 20

?

例5. 复数 z1 ? 3 ? 4i, z 2 ? 1 ? 2i, z3 ? 2e 算 z ? z1 z 2 。
z3

6

i

表达,及计

(1)z1= 3 + 4i z1 = 3.0000 + 4.0000i (2)z2 = 1 + 2 * i z3=2*exp(i*pi/6) z=z1*z2/z3 z2 = 1.0000 + 2.0000i z3 = 1.7321 + 1.0000i z = 0.3349 + 5.5801i

2013-8-10

21

例6. 复数矩阵的生成及运算 ? A=[1,3;2,4]-[5,8;6,9]*i ? B=[1+5i,2+6i;3+8*i,4+9*i] ? C=A*B
? ? ? ? ? ? ?

?
?

A =1.0000 - 5.0000i 2.0000 - 6.0000i B = 1.0000 + 5.0000i 3.0000 + 8.0000i C = 1.0e+002 * 0.9900 1.1600 + 0.0900i

3.0000 - 8.0000i 4.0000 - 9.0000i

2.0000 + 6.0000i 4.0000 + 9.0000i

1.1600 - 0.0900i 1.3700

2013-8-10

22

例7 . 求上例复数矩阵C的实部、虚部、模和相角。 ? C_real=real(C) ? C_imag=imag(C) ? C_magnitude=abs(C) ? C_phase=angle(C)*180/pi ? C_real = 99 116 ? 116 137 ? C_imag = 0 -9 ? 9 0 ? C_magnitude = 99.0000 116.3486 ? 116.3486 137.0000 ? C_phase = 0 -4.4365 ? 4.4365 0
2013-8-10 23

? ? ? ? ? ? ? ?

例8:图形表示 t=0:pi/20:2*pi;x=R*sin(t);y=R*cos(t); plot(x,y,'b:'),grid hold on plot(rrr(1),'.','MarkerSize',30,'Color','r') plot(rrr([2,3]),'o','MarkerSize',15,'Color','b') axis([-3,3,-3,3]),axis square hold off
3 2

1

0

-1

-2

-3 -3

-2

-1

0

1

2

3

2013-8-10

24

例9. 画出衰减振荡曲线 y ? e sin 3t及其它 的包络线 y ? e 。t的取值范围是 [0,4? ]
? t 3

?

t 3

0

t=0:pi/50:4*pi; y0=exp(-t/3); y=exp(-t/3).*sin(3*t);

plot(t,y,'-r',t,y0,':b',t,-y0,':b')
1 0.8 0.6

0.4

0.2

0

-0.2

-0.4

-0.6

-0.8

-1

0

2

4

6

8

10

12

14

2013-8-10

25

? ?
? ?

例10.画出 z ? 所表示的三维曲面。 x, y 2 2 x ?y 的取值范围是[-8,8].
clear; x=-8:0.5:8; y=x'; X=ones(size(y))*x; Y=y*ones(size(x)); R=sqrt(X.^2+Y.^2)+eps; Z=sin(R)./R; mesh(X,Y,Z); colormap(hot)

sin( x 2 ? y 2 )

?
? ? ? ?

xlabel('x'),ylabel('y'),zlabel('z')

2013-8-10

26

1.5 网络资源
1.
? ? ?

2.
?
?

USENET新闻组 MATLAB的新闻组是comp.soft-sys.MATLAB。浏览器指 向 http://www.dejanews.com http://www.google.com 网络上的工具箱 http://www.mathtools.com/
http://www.mathworks.com/matlabcentral/fileexchange/loadCategory. do

2013-8-10

27

1.5 网络资源(续)
3.
? ?
?

BBS
哈尔滨工业大学bbs: telnet://bbs.hit.edu.cn 上海交通大学bbs: telnet://bbs.sjtu.edu.cn 清华大学bbs mathtools

4.
? ? ? ?

www服务
http://www.mathworks.com http://matlab.turbo.hit.edu.cn Matlab 大观园: http://www.matlab-world.com

2013-8-10

28

第2章 基本语法
? ? ? ? ?

?

2.1 2.2 2.3 2.4 2.5 2.6

变量及其赋值 矩阵的初等运算 元素群运算 逻辑判断及流程控制 基本绘图方法 M文件及程序调试

2013-8-10

29

2.1
?

变量及其赋值

2.1.1 标识符与数 标识符是标识变量名、常量名、函数名、文件 名的字符串的总称。 1、表示符第1个字符必须是字母。 2、长度不超过31个。 3、区分大小写。 4、变量中不能含有标点符号。 5、变量可直接参与计算。 6、变量一般无需事先定义
30

2013-8-10

2.1.1 标识符与数(续)
7、特殊变量
特殊变量 ans pi eps flops inf nan i j nargin nargout realmin
2013-8-10

取值 用于结果的缺省变量名 圆周率 计算机的最小数 浮点运算书 无穷大 如 1/0 不等量 i=j=
?1

如 0/0

函数的输入变量数目 函数的输出变量数目 最小的可用正实数 最大的可用正实数
31

realmax

2.1.1 标识符与数(续)
8、数值显示格式 ? MATLAB中所有的量为双字长浮点数,显示按下面显示规则: 1. 在缺省情况下,当结果为整数,作为整数显示;当结果 为实数,以小数后4位的精度近似显示。 2. 如果结果中的有效数字超出了这一范围,以科学计数 法显示结果。 3. format命令改变显示格式,常用的的格式有 ? long (16位) bank(2个十进制位) hex(十六进制) ? short(缺省) short e(5位加指数) +(符号) ? long e(16位加指数) rat(有理数近似)

2013-8-10

32

2.1.2 矩阵及其元素的赋值
矩阵获取格式:变量=表达式(或数) 1、直接输入:A=[1 2 3;4 5 6;7,8,9] *矩阵用中括号括起。 *元素间用空格隔开,或用逗号隔开。 *每行用分号;号表示回车。 2、行向量 B=[1 2 3 4 5] 3、列向量 C=[1;2;3;4;5]; 每行命令后面的分号;表示结果不显示。
?

2013-8-10

33

2.1.2 矩阵及其元素的赋值(续)
4、元素可用表达式表示 D=[-1.3 sqrt(3) (1+2+3)/5+1] 5、用语句生成 行向量 E=from:step:to 即E=开始数:步长:结束数 E=1:2:10 得E=[1 3 5 7 9] 6、矩阵连接 B=[a b] V=[a;b]

2013-8-10

34

2.1.2 矩阵及其元素的赋值(续)
7、用函数创建 如: zeros(m,n) ones(m,n) eye(m,n) zeros(3); zeros(3,3); zeros(2,3); zeros(3,2); ? ones(3); ones(3,3); ones(2,3); ones(3,2); ? eye(3); eye(3,3); eye(3,4); eye(4,3);

2013-8-10

35

2.1.2 矩阵及其元素的赋值(续)
8、rand(m,n) %产生均匀分布随机数(0,1) 9、rand(‘state’,0) %把均匀分布伪随机发生器置为0状态 10、randn(m,n) %产生正态分布随机数 11、magic(m) %产生魔方数组(对高维不适用) %即每行、每列及对角元素之和为(n^3+n)/2 12、linspace(a,b,n) %在a和b之间均匀产生n个点的值 如:f=linspace(0,1,5) 则 f=0 0.25 0.5 0.75 1.0 13、logspace(a,b,n) %在a和b之间对数分布产生n个点的值 如:f=logspace(0,1,5) 则 f=1.0000 1.7783 3.1623 5.6234 10.0000

2013-8-10

36

2.1.2 矩阵及其元素的赋值(续)
矩阵中的元素(用圆括号中数字来注明) 1. A( i, j ) 表示第i 行,第j列元素。 2. A( i ) 表示第i个元素。
?

矩阵中元素的排序如右所示

1 5

9

13 17

2 6 10 14 18 3 7 11 15 19 4 8 12 16 20

3. A( i, j)=常量,表示给A中元素赋值。
当下标超出原矩阵的尺寸,则自动扩展行列并补零。

2013-8-10

37

2.1.2 矩阵及其元素的赋值(续)
4. A( : , j ) 表示A阵中第j 列所有元素。 5. A( i , : ) 表示A阵中第i 行所有元素。 6. A(2:3,4:6) 表示第2行到第3行,第4列到第6列的子 矩阵。 7. A(3:7) 指A阵中第3个到第7个元素(列优先)矩阵 的序号编址:按列计数。 8. A(2)=[ ] 表示去除矩阵中元素。此时矩阵变为行矩 阵。 9. A( : ) 指A阵中所有元素组成列向量。

2013-8-10

38

2.1.4 变量的查询,存储,提取
1、变量的查询 who 或 whos 2、变量的存储 save 文件名[.mat] 变量列表
如:save sar a b c 变量中间用空格隔开,不能加逗 号。 3、变量的提取 load 文件名 4、变量的清除 clear 变量列表 5、清除所有变量 clear all

2013-8-10

39

2.1.5 基本赋值矩阵
?

?

为了方便给大量元素赋值,MATLAB提供了 一些基本矩阵。见书中表2.1 如:A=zeros(m,n) 全0矩阵

B=ones(m,n) 全1矩阵 C=eye(m,n) 单位矩阵 D= rand(m,n) 0—1之间随机数均匀分布 randn(‘state’,0’); %把随机数发生器置0 E=randn(m,n) 均值为0的,单位方差正态分布随机 矩阵 F= magic(m) 魔方矩阵
2013-8-10 40

G= linspace(a,b,n) 个数 H= logspace(a,b,n) K=diag(A);

线性分隔,a,b之间均匀产生n

对数分隔, a,b之间产生n个数 取A中对角线元素得到列向量。

P=diag(diag(A)) 产生对角阵 a=[1 2 3 4]; b=diag(a) 产生对角阵 ?1 0 0 0? ?0 2 0 0? 如 A=[1 2 3;4 5 6;7 8 9] ? b?? B=diag(A) 则: B=[1;5;9]; ?0 0 3 0?
? ? ?0 0 0 4?
41 2013-8-10

2.2 矩阵的初等运算
2.2.1 矩阵的加减乘除 1、+,-,*,/, \ 2、点乘:.* 右除:./ 左除:.\ 1、C=A+B; C=A-B C=A*B 注意:矩阵 必须相匹配 2、X=A\B 表示AX=B X=A-1B 即 X=inv(A)*B 3、 X=A/B 表示XB=A X=AB-1 即 X=A*inv(B) 4、[m,n]=size(A) 计算矩阵A的行列大小 5、K=length(A) 计算矩阵A的行列大小中最大的数
2013-8-10 42

2.2.1 矩阵的加减乘除
点乘、点除 6、C=A.*B 对应元素间相乘。

?2 3? ?1 2? ? 2 6 ? ?4 5?. * ?3 4? ? ?12 20? ? ? ? ? ? ?
2013-8-10 43

7、C=A./B 8、C=A.\B

对应元素间相除。

?12 30? ?1 2? ?12 15? ?24 20?. / ?3 4? ? ? 8 5 ? ? ? ? ? ? ? ?4 2? ?1 2? ?0.25 1 ? ?4 5?. \ ?3 4? ? ?0.75 0.8? ? ? ? ? ? ?
2013-8-10 44

2.2.2 矩阵除法及线性方程组的解
1、方阵的行列式 B=det(A) 即B=|A| 2、方阵的求逆 B=inv(A) 即B= A-1 条件|A|≠0 3、方阵的伪逆矩阵 B=pinv(A) 条件|A|=0 4、方阵的伴随矩阵 B=inv(A)*det(A) 即B= A-1 |A|

2013-8-10

45

2.2.3 矩阵的乘方和幂次函数
1、^矩阵乘方 2、.^元素对元素的乘方 C=A^n 表示A阵自乘n次。 C=A^(-n) 表示A阵的逆矩阵自乘n次。 C=A.^n 表示A阵中每个元素自乘n次。 C=A.^(-n) 表示A阵中每个元素自乘n次后的逆 阵,即每个元素为1/(A^n)。

? ? ? ?

2013-8-10

46

?

如 A ? ?1 2? ?3 4?
?

?

C=A^2 C=A .^2

? 7 10? C?? 15 22? ? ? ?1 4 ? C?? 9 16? ? ? ? 5.5 ? 2.5? C?? ? 3.75 1.75 ? ? ?

?

?

?

C=A ^(-2)====inv(A)^2

?

C=A .^(-2)

0.25 ? ? 1 C?? ? 0.111 0.0625 ? ?
47

2013-8-10

2.2.4 矩阵结构形式的提取与变换
? ? ?

?
?

?

?

B=fliplr(A) %将A矩阵左右翻转 B=flipud(A) %将A矩阵上下翻转 B=reshape(A,m,n) %将A阵重组为mxn矩 阵 B=rot90(A) %将A矩阵逆时针翻转90度 B=diag(A) %提取A矩阵的对角组成列向 量 B=tril(A) %提取A矩阵的左下三角部 分 B=triu(A) %提取A矩阵的右上三角部 分
2013-8-10

48

?

如:

?1 A ? ?4 ? ?7 ?

2 5 8

3? 6? ? 9? ?

?

B=fliplr(A) B=flipud(A) B=rot90(A)

?3 2 B ? ?6 5 ? ?9 8 ?

1? 4? ? 7? ?

?

?

?

B=tril(A)

?3 B ? ?2 ? ?1 ?

6 5 4

?7 B ? ?4 ? ?1 ? 9? 8? ? 7? ? ?1 B ? ?4 ? ?7 ?

8

9? 5 6? ? 2 3? ?

0? 5 0? ? 8 9? ? 0
49

2013-8-10

2.3
?

元素群运算

2.3.1 数组及其赋值 1、t=[初值:步长:终值]; 如t=0:0.1:1 tt=[10:-1:1] 2、t=linspace(初值,终值,点数) 如:tr=linspace(0, 2*pi, 9) 3、t=logspace(初值,终值,点数) 如:tp=logspace(0, 1, 11)
2013-8-10 50

2.3.2 元素群的四则运算
表示对矩阵中每个元素进行运算 如 X=[1 2 3]; Y=[4 5 6] ? Z=X.*Y Z=[4 10 18] ? Z=X.\Y Z=[4 2.5 2] ? Z=X.^Y Z=[1 32 729] ? Z=X.^N N=2 Z=[1 4 9] ? Z=2.^[X Y] Z=[2 4 8 16 32 64]
?

2013-8-10

51

2.3.3 元素群的函数
?

?

等命令可以直接MATLAB中 exp、sprt、sin、cos使 用在矩阵上,这种运算只 是定义在矩阵的单个元素 上,即分别对矩阵的每个 元素进行运算。MATLAB中 也提供了基本的三角函数。 注意其中的取整

函数名
abs sqrt real imag conj round fix floor ceil

含义
绝对值或者复数模 平方根 实部 虚部 复数共轭 4舍5入到整数
舍入到最接近0的整数

舍入到最接近-∞的整数

舍入到最接近∞的整数
52

2013-8-10

2.3.3 元素群的函数
函数名 含义 函数名 sinh 含义 双曲正弦

cosh sign
rem sin

双曲余弦
双曲正切 自然指数

符号函数
留数 正弦

tanh exp

cos
tan asin

余弦
正切 反正弦

log
log10 bessel

自然对数
以10为底的对数 贝赛尔函数

acos
atan atan2
2013-8-10

反余弦
反正切 第四象限反正切

gamma
rat

伽吗函数
有理逼近
53

2.4

逻辑判断及流程控制

2.4.1 关系操作符 ? MATLAB常用的关系操作符有:<(小于)、<=(小于或等于)、 >(大于)、>=(大于或等于)、 = =(等于)、 ~=(不等于)。 ? MATLAB的关系操作符可以用来比较两个大小相同的数组,或 者比较一个数组和一个标量。在与标量比较时,结果和数组 大小一样。 ? ?a=1:9; ? b=a>4 ? b = 0 0 0 0 1 1 1 1 1 ? ?c=a(a>4) ? c = 5 6 7 8 9
2013-8-10 54

2.4.1
? ?

关系操作符

? ? ? ? ?

矩阵查找和排序 子矩阵的查找使用find命令完成,它返回关系表达式为真的 下标。例如: ?a=10:20; ?find(a>15); ans = 7 8 9 10 11 矩阵的排序使用sort函数,它将矩阵按照升序排列。

2013-8-10

55

2.4.2
?

逻辑运算

? ? ?

?

逻辑操作符定义了一种与或非的关系表达式。 MATLAB的逻辑操作符有&(与)、|(或)、~(非)、 xor(异或)。例如: ?c=~(a>4) c =1 1 1 1 0 0 0 0 0 ?c=(a>4)&(a<7) c =0 0 0 0 1 1 0 0 0

2013-8-10

56

2.4.3 其他关系与逻辑函数
?

?

?

xor(x,y) 异或运算。x或y非零(真)返回1,x和y都是零(假)或都是非 零(真)返回0。 any(x) 如果在一个向量x中,任何元素是非零,返回1;矩阵x中的 每一列有非零元素,返回1。 all(x) 如果在一个向量x中,所有元素非零,返回1;矩阵x中的 每一列所有元素非零,返回1。

2013-8-10

57

%逻辑函数的运用示例。
randn('state',1), R=randn(3,6) L=abs(R)<0.5|abs(R)>1.5 %创建正态随机阵
%不等式条件运算,结果给出逻辑数组

R(L)=0
s=(find(R==0))' R(s)=111 disp(ii'),disp(jj')

%"逻辑1"对应的元素赋0值。
%利用find获得符合关系等式条件的元素"单下标"

%利用"单下标"定位赋值

[ii,jj]=find(R==111); %利用find获得符合关系等式条件的元素"双下标"

2013-8-10

58

2013-8-10

59

【例】关系运算运用之一:求近似极限, 修补图形缺口。
t=-2*pi:pi/10:2*pi; y=sin(t)./t; subplot(1,2,1),plot(t,y),axis([-7,7,-0.5,1.2]), xlabel('t'),ylabel('y'),title('残缺图形') tt=t+(t==0)*eps; yy=sin(tt)./tt; subplot(1,2,2),plot(tt,yy),axis([-7,7,-0.5,1.2]) xlabel('t'),ylabel('yy'),title('正确图形')

2013-8-10

60

2013-8-10

61

【例】逻辑操作应用之一:逐段解析函数的计算 和表现。本例演示削顶整流正弦半波的计算和图 形绘制。
? ? ? ? ? ? ? ?

t=linspace(0,3*pi,500);y=sin(t); z1=((t<pi)|(t>2*pi)).*y; w=(t>pi/3&t<2*pi/3)+(t>7*pi/3&t<8*pi/3); w_n=~w; z2=w*sin(pi/3)+w_n.*z1; subplot(1,3,1),plot(t,y,':r'),ylabel('y') subplot(1,3,2),plot(t,z1,':r'),axis([0 10 -1 1]) subplot(1,3,3),plot(t,z2,'-b'),axis([0 10 -1 1])

2013-8-10

62

1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 0 5 10

1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 0 5 10

1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 0 5 10

y

2013-8-10

63

【例】写出生成下图所示波形的MATLAB脚本文件M文件。 ? 2? 7? 8? [ , ], [ , ] 图中虚线为正弦波,要求它的负半波被置零,且在 3 3 3 3 处被削顶。

2013-8-10

64

t=linspace(0,3*pi,500);
y=sin(t); z1=((t<pi)|(t>2*pi)).*y;

w=(t>pi/3&t<2*pi/3)+(t>7*pi/3&t<8*pi/3);
w_n=~w; z2=w*sin(pi/3)+w_n.*z1;

plot(t,y,'r-.',t,z2,'k-')
xlabel('x'); ylabel('z=f(t)'); title('逐段解析函数'); legend('y=sin(t)','z=f(t)');
2013-8-10 65

2.4.4 流程控制语句
?
?

脚本
对于简单问题,使用直接输入命令简单有效;对稍复杂和多次重复 的应用,直接输入命令比较麻烦。MATLAB提供了逻辑解决方案, 它允许用户把多个命令放在一个简单的文本文件中,如同在 MATLAB中键入命令一般,这种文件称为脚本文件,由于脚本文件 以m为扩展名,它常称为M文件。脚本文件为文本形式的,对跨平 台处理十分有利。 使用脚本文件,可以把命令保存在磁盘上,便于以后的访问;同时 对使用大的数组也带来的方便;增加注释可以为脚本中的命令作文 挡以免以后忘记。

?

2013-8-10

66

2.4.4
?

流程控制语句

为了便于应用,MATLAB提供了一些流程控制的命令。这些命令对脚本编 写带来了一些方便,但是需要注意的是,尽量不要使用这些流程控制命令, 尤其是循环控制命令。

?
?

If 语句
很多情况下,命令的序列必须根据关系的检验有条件的执行,它由if-elseend结构提供。它的结构如下:
? ? ? ? ?

?
? ? ?

if expression1 commands1 elseif expression2 commands2 elseif … … else commands end

2013-8-10

67

2.4.4 流程控制语句
?

在执行过程中,MATLAB依次检查各个表达 式,只执行第一个表达式为真的命令串,接下 来的关系表达式不检验,跳过其余的if-elseend结构,而且,最后的else命令可有可无。

2013-8-10

68



? x^2 ? 3 ? y ? ? x ^3 ? 4 x ? x ? x ^5 ?
x=input('x='); if x>=10 y=x^2+3; elseif x>=0 y=x^3+4*x; else y=x^5+x; end y

x ? 10 0 ? x ? 10 x?0
x=input('x='); if x>=10 y=x^2+3; else if x>=0 y=x^3+4*x; else y=x^5+x; end end y
69

2013-8-10

2.4.4 流程控制语句
for循环 ? for循环允许一组命令以固定的次数重复,它的一般 形式是 ? for x=array ? command ? end ? for 和end之间的命令串按数组array的每一列执行一 次,直到n次后终止。 ? 如:for j=1:2:10 y=j+j.^2; end
2013-8-10 70

2.4.4 流程控制语句
1. 2. 3. 4.

1.

for循环不能使用内部重新赋值循环变量而终止; for循环内部接受任何有效的MATLAB数组; for循环可以嵌套; 只要有矩阵形式可以解决的问题,不要使用for 循环。 Tic/toc 循环可以使用break跳出,但只跳出所在的循环, 不跳出整个嵌套结构。

2013-8-10

71

2.4.4 流程控制语句
?
?

?

while循环 与for循环以固定的次数求一组指令相反,while循 环以不定的次数求一组语句的值。While循环的一 般形式为: ? while expression ? commonds ? end 只要表达式expression里的所有元素为真,就执行 命令串commands。通常表达式求值给一个标量值, 单数组值也同样有效。
2013-8-10 72


y=0; for x=1:100 y=y+x; end y

y ??x
x ?1

100

1 yy ? ?? j ?1 i ?1 i ? j
N=input('N='); y=0; i=1; while i<=N j=1; while j<=N y=y+1/(i+j); j=j+1; end i=i+1; end y

N

N

N=input('N='); y=0; for i=1:N for j=1:N y=y+1/(i+j); end end y

2013-8-10

73

【例】Fibonacci数组的元素满足Fibonacci 规则: ak ?2 ? ak ? ak ?1 (k;1,2,?) a1 ? a2 ? 1 ? , 且 现要求该数组中第一个大于10000的元素
? ?



?
? ? ? ? ? ? ?

a(1)=1; a(2)=1; i=2; while a(i)<=10000 a(i+1)=a(i-1)+a(i); i=i+1; end; i a(i) i = 21

ans = 10946

2013-8-10

74

用for循环指令来寻求Fibonacc数组中第一个大 于10000的元素。
n=100;a=ones(1,n); for i=3:n a(i)=a(i-1)+a(i-2); if a(i)>=10000 a(i) break; end; End i

结果: ans =

10946 i= 21

2013-8-10

75

2.4.4 流程控制语句
Switch 语句 是一种均衡实现的多分支语句。 ? Switch expression ? Case 值1 ? commands1 ? Case 值2 ? commands2 ? … ? Otherwise ? commandsN ? end

2013-8-10

76

学生的成绩管理,用来演示switch结构的应用。
clear; for i=1:10 a{i}=89+i;b{i}=79+i;c{i}=69+i;d{i}=59+i; end; c=[d,c]; Name={' Jack','Marry','Peter',' Rose',' Tom'}; Mark={72,83,56,94,100}; Rank=cell(1,5); S=struct('Name',Name,'Marks',Mark,'Rank',Rank);

2013-8-10

77

for i=1:5 结果: switch S(i).Marks case 100 学生姓名 得分 等级 S(i).Rank='满分'; case a Jack 72 及格 S(i).Rank=' 优秀'; case b Marry 83 良好 S(i).Rank=' 良好'; Peter 56 不及格 case c S(i).Rank=' 及格'; Rose 94 优秀 otherwise Tom 100 满分 S(i).Rank='不及格'; end end disp([‘学生姓名 ’,‘ 得分 ’,‘ 等级’]); disp(' ') for i=1:5; disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]); end;

2013-8-10

78

2.5

基本绘图方法

2.5.1 直角坐标中的两维曲线 ? plot(y) 以y的下标作为x坐标,以y值作为y坐标。 ? plot(x,y) 数组x和y的长度应匹配。 ? 每次绘制将清除以前的图形。

2013-8-10

79

2.5.1 直角坐标中的两维曲线
图形的标注和图例 1、title(‘text’) %给图形加上标题 2、xlabel(‘text’) %给X轴加上说明 3、ylabel(‘text’) %给Y轴加上说明 4、zlabel(‘text’) %给Z轴加上说明 5、text(x,y,’string’) %在图形指定位置加上说明 6、gtext(‘string’) %利用鼠标在图形加上说明 7、legend(‘string1’,’string2’,..) %给图形加图 例 8、legend off %关闭图例
?
2013-8-10 80

如:作y=sin(t)的二维图形 ? t=linspace(0,3*pi,200); ? y=sin(t); ? plot(t,y); ? title('y=sin(t)'); ? xlabel('t/s'); ? ylabel('y=sin(t)'); ? text(3,0.4,'y=sin(t)'); ? legend('y=sin(t)'); ? gtext('y=sin(t)')
2013-8-10 81

2.5.2 线型、点型和颜色
?

plot(x,y,’r:’)
标识符 y m c r g b w k 颜色 黄 品红 青 红 绿 蓝 白 黑 标识符 . o x + * : -. - -

后面是颜色和线型
线型 点 圆圈 X号 +号 实线 星号 虚号 点划线 虚线 标识符 S D ^ V > < P H none 线型 正方形标记 菱形标记 朝上三角形 朝下三角形 朝右三角形 朝左三角形 五角星 六角星 无符号标记

2013-8-10

82

2.5.3

多条曲线的绘制

1、plot(x1,y1,x2,y2); 2、plot(x1,y1,’r’,x2,y2); 3、plot(x1,y1) hold :切换 hold on %图形保持 plot(x2,y2,’r’) hold off %解除保持 4、plot(t,[y1,y2,y3]) %自动给颜色和线型。 5、plotyy(x1,y1,x2,y2) %可画2个不同纵坐标 的图
2013-8-10 83

? ? ?

?
? ?

?
? ? ?

t=0:0.1:3*pi; y1=sin(t); y2=cos(t); plot(t,y1,'r-.',t,y2,'k'); xlabel('t/s'); ylabel('y1=sin(t), y2=cos(t)'); title('y1=sin(t), y2=cos(t)'); text(3,0.4,'y1=sin(t)'); text(2,0,'y2=cos(t)'); legend('y1=sin(t)','y2=cos(t)');

2013-8-10

84

2.5.4 屏幕控制与其他2维绘图
1. 2. 3. 4. 5. figure %打开图形窗口 figure(n) %打开指定图形窗口 close %关闭当前图形窗口 close all %关闭所有图形窗口 close(n) %关闭指定图形窗口

2013-8-10

85

2.5.4 屏幕控制与其他2维绘图(续)
8.

9. 10. 11. 12. 13. 14.

subplot(m,n,p) %图形分为m x n个子图,并 指定第p个。排号从左到右,从上到下。 stem(t,y) %绘脉冲图 stairs(t,y) %绘阶梯图 bar(t,y) %绘条形图 errorbar(t,y) %绘误差条形图 hist(y) %绘直方图 fill(t,y,’r’) %绘填充图

2013-8-10

86

?

如y=exp(-0.1t)*sin(t) t=0:0.3:4*pi; y=exp(-0.1*t).*sin(t); figure(3) plot(t,y,'k*'); figure(4)

? ? ?

?
?

? ? ?

?

subplot(2,2,1);stem(t,y,'k.');title('stem(t,y)'); subplot(2,2,2);stairs(t,y,'b');title('stairs(t,y)'); subplot(2,2,3);bar(t,y,'g');title('bar(t,y)'); subplot(2,2,4);fill(t,y,'r');title('fill(t,y,''r'')');

2013-8-10

87

?

hist(y)

? ? ? ?

t=0:0.1:4*pi; y=exp(-0.1*t).*sin(t); y1=5.*y.*sin(t); plotyy(t,y,t,y1);

2013-8-10

88

2.5.4 屏幕控制与其他2维绘图(续)
15. 16. 17. 18. 19. 20.

21.
22.

pause %暂停 grid on %增加网格 grid off %取消网格 grid %乒乓增加和取消网格 loglog %双对数坐标log10 similogx %半对数坐标,x轴半对数 similogy %半对数坐标,y轴半对数 polar(theta,rho) %极坐标图
89

2013-8-10

2.5.4 屏幕控制与其他2维绘图(续)
23、虚数的绘图--------- Z为虚数 plot(Z) %实部为x坐标,虚部为y轴 plot(t,Z) %虚部丢失 24. axis([xmin,xmax,ymin,ymax]) %定义坐标 25. axis square %两轴坐标长度相等 26. axis equal %两轴坐标刻度相同 27. axis tight %坐标区域和图形吻合 28. set(gca,’xtick’,[-1,3,7,11]) %在x轴指定处标记刻度

2013-8-10

90

clear,clf

t=0:2*pi/99:2*pi;
x=1.15*cos(t);y=3.25*sin(t); title('Normal and Grid on') %y为长轴,x为短轴 subplot(2,3,1);plot(x,y),axis normal,grid on,

subplot(2,3,2);plot(x,y),axis equal,grid on,title('Equal')

subplot(2,3,3);plot(x,y),axis square,grid on,title('Square')
subplot(2,3,4);plot(x,y),axis image,box off,title('Image and Box off') subplot(2,3,5);plot(x,y),axis image fill,box off title('Image and Fill')
2013-8-10 91

subplot(2,3,6);plot(x,y),axis tight,box off,title('Tight')

2013-8-10

92

2.5.5
1.

三维曲线和曲面
%画三维曲线

plot3(x,y,z,’r’);

Plot3(x1,y1,z1,’r’,x2,y2,z2,’b’) t=0:0.02*pi:2*pi; x=sin(t); y=cos(t); z=cos(2*t); plot3(x,y,z,'b-',x,y,z,'bd'); view([-82,58]); box on legend('链','宝石');

2013-8-10

93

2.5.5

三维曲线和曲面(续)

2. mesh(z) %画三维网格曲线,z为x,y的函数 mesh(x,y,z) %常用画三维网格曲线 mesh(x,y,z,’r’) %带颜色的三维图 x=-8:0.5:8; y=x’; X=ones(size(y))*x; Y=y*ones(size(x)); R=sqrt(X.*X+Y.*Y); Z=sin(R )./R; mesh(Z);

2013-8-10

94

2.5.5

三维曲线和曲面(续)

3. surf(Z) %由多个小面组成表面视图 surf(x,y,z) surf(x,y,z,’r’) x=-8:0.5:8; y=x'; X=ones(size(y))*x; Y=y*ones(size(x)); R=abs(X)+abs(Y)+eps; Z=sin(R )./R; surf(Z);

2013-8-10

95

2.5.5

三维曲线和曲面(续)

4. Meshgrid(x,y) %生成网格点坐标函数 x=-4:4; y=x; [X,Y]=meshgrid(x,y); Z=X.^2+Y.^2; surf(X,Y,Z); colormap(hot) hold on stem3(X,Y,Z,'bo');

2013-8-10

96

2.5.5

三维曲线和曲面(续)

5. view(方位角,俯仰角) %改变视角 6. shading flat %把曲面上的小格平滑掉 shading interp %更平滑 7. rotate3d %旋转 8. contour3(Z) %画等高线 9. meshc, surfc %带等高线的三维作图 10.colormap(hot) %hot,cool,gray,copper,pink,jet,prism 11. colorbar %画彩色条 12. hidden off %透视被叠压的图形 hidden on %消隐被叠压的图形

2013-8-10

97

2.5.5

三维曲线和曲面(续)

clear,clf [X0,Y0,Z0]=sphere(30); %产生单位球面的三维坐标 X=2*X0;Y=2*Y0;Z=2*Z0; %产生半径为2的球面的三维坐标 surf(X0,Y0,Z0); %画单位球面 shading interp %采用插补明暗处理 hold on; mesh(X,Y,Z); colormap(hot); hold off %采用hot色图 hidden off %产生透视效果 axis equal,axis off %不显示坐标轴

2013-8-10

98

2.5.5

三维曲线和曲面(续)

13. Moviein , getframe, movie %动画 axis equal M=moviein(16); for j=1:16 plot(fft(eye(j+16))); M(:,j)=getframe; end movie(M,30); 14. alpha(v) %透明度控制 v∈[0,1]

2013-8-10

99

?

?
? ? ?

?
? ? ? ? ? ? ? ? ?

clear; clf; shg, x=3*pi*(-1:0.05:1); y=x; [X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2)+eps; Z=sin(R)./R; h=surf(X,Y,Z); colormap(jet); axis off n=12; mmm=moviein(n); %预设画面矩阵。 for i=1:n rotate(h,[0 0 1],25); %使图形绕z轴旋转25度/每次 mmm(:,i)=getframe; %捕获画面。 end movie(mmm,5,10) %以每秒10帧速度,重复播放5次。

2013-8-10

100

2.6 M文件及程序调试
?

? ? ?

?

M文件可以分为两种:一种是主程序,一种是 子程序即函数文件。一个较复杂的程序往往是 由这两种程序混合组成。 2.6.1 主程序文件 主程序一般用clear,close all开头 程序主体 程序存盘的文件名

2013-8-10

101

2.6.2
? ? ?

函数文件

把一个比较大的任务分解为多个比较小的任务,它们之间通过调 用实现参数传递,小任务可以是函数。 格式: function [out1,out2,…]=函数名(in1,in2,…) 常见的函数调用形式为:
?

1、函数调用
?

[out1,out2,…]=function(in1,in2,…)

?

?

一个函数可以嵌套,也可以调用其它的函数,甚至调用自己(也 就是递归调用)。 函数文件,函数名称和文件名一般相同。

2013-8-10

102

2.6.2
? ? ? ?

函数文件

与脚本文件不同 ,函数文件犹如一个“黑箱”,把 一些数据送进并经加工处理,再把结果送出来。 MATLAB提供的函数指令大部分都是由函数文件定义的。 M函数文件的特点是: 从形式上看 ,与脚本文件不同 ,函数文件的笫一 行总是以 “function”引导的“函数申明行”。

2013-8-10

103

2.6.2
?

函数文件

从运行上看 ,与脚本文件运行不同 ,每当函数文件 运行, MATLAB就会专门为它开辟一个临时工作空间, 称为函数工作空间( Function workspace) 。当执 行文件最后一条指令时 ,就结束该函数文件的运行, 同时该临时函数空间及其所有的中间变量就立即被清 除。 MATLAB允许使用比 “标称数目 ”较少的输入输出变 量,实现对函数的调用 。

?

2013-8-10

104

2.6.2
? ? ?

函数文件

由于从结构上看 ,脚本文件只是比函数文件少一个 “函数申明行”,所以只须描述清楚函数文件的结构 。 典型 M函数文件的结构如下 :
函数申明行:位于函数文件的首行,以关键字 function 开头,函数名以及函数的输入输出变量都在 这一行被定义。 笫一注释行:紧随函数申明行之后以%开头笫一注释行。 该行供lookfor关键词查询和 help在线帮助使用 。

?

2013-8-10

105

2.6.2 函数文件
?

在线帮助文本区 :笫一注释行及其之后的连续以 %开头的所有注释行构成整个在线帮助文本。
编写和修改记录:与在线帮助文本区相隔一个 “空”行,也以%开头,标志编写及修改该M文件 的作者和日期等 。 函数体:为清晰起见,它与前面的注释以“空” 行相隔。

?

?

2013-8-10

106

2.6.2
?

函数文件

?

?

需要注意函数文件的放置位置,一般自己的函数 文件放在当前目录;如果对一个专题有了足够多 的函数,可以生成一个工具箱,放在一个固定的 目录下,并在MATLAB中加入这个目录路径即可。 使用函数可以加快计算速度。MATLAB首次执行一 个函数时,它将打开的文件编译为存储器内部形 式,加速了执行速度。普通的m文件不被编译,在 每次编译时,文件将逐行解释执行。 函数的前一部分注释为帮助行,在使用help命令 是看到的为这些注释行。

2013-8-10

107

2.6.2

函数文件

2、参数传递 ? MATLAB函数的输入输出数目都可以变化,通过这个特性,可 以实现一些自定义的功能。函数的输入输出参数数目可以通 过变量nargin和nargout获得。函数调用中可以使用少于规 定的输入输出参数数目,但是不能更多。 ? 在MATLAB中,参数具有自己的专有工作空间。函数中的参数 和命令行参数不在一个空间中,它们的唯一联系为函数的输 入输出变量。输入参数在函数中是可读的,但任何改动不会 传递回上一级空间。 ? 使用global命令可以将变量说明为全局的,则在函数、命令 行等都可以共享这些变量。在实际应用中,应当尽量避免使 用全局变量。

2013-8-10

108

2.6.2

函数文件

3、注意 ? 函数可以按少于函数M 文件中所规定的输入和输出变量进行调用,但 不能用多于函数M 文件中所规定的输入和输出变量数目。如果输入和 输出变量数目多于函数M 文件中function 语句一开始所规定的数目, 则调用时自动返回一个错误。 ? 当调用一个函数时,所用的输入和输出的参量的数目,在函数内是规 定好的。函数工作空间变量nargin 包含输入参量个数;函数工作空间 变量nargout 包含输出参量个数。事实上,这些变量常用来设置缺省 输入变量,并决定用户所希望的输出变量。在M 文件函数里,变量 nargout 可用来检验输出参量的个数,并按要求修正输出变量的创建。

2013-8-10

109

2.6.2
?

函数文件

函数有它们自己的专用工作空间,它与MATLAB 的工 作空间分开。函数内变量与MATLAB 工作空间之间唯 一的联系是函数的输入和输出变量。如果函数任一输 入变量值发生变化,其变化仅在函数内出现,不影响 MATLAB 工作空间的变量。函数内所创建的变量只驻 留在函数的工作空间,而且只在函数执行期间临时存 在,以后就消失。因此,从一个调用到下一个调用, 在函数工作空间变量存储信息是不可能的。

2013-8-10

110

2.6.2
?

函数文件

?

当调用一个函数时,输入变量不会拷贝到函数的工作 空间,但使它们的值在函数内可读。然而,改变输入 变量内的任何值,那么数组就拷贝到函数工作空间。 如果输出变量与输入变量相同,例如,函数x=fun(x, y, z) 中的x ,那么就将它拷贝到函数的工作空间。 因此,为了节约存储和增加速度,最好是从大数组中 抽取元素,然后对它们作修正,而不是使整个数组拷 贝到函数的工作空间。

2013-8-10

111

2.6.2
?

函数文件

?

如果变量说明是全局的,函数可以与其它函数、 MATLAB 工作空间和递归调用本身共享变量。为了在 函数内或MATLAB 工作空间中访问全局变量,在每一 个所希望的工作空间,变量必须说明是全局的。 实际编程中,无论什么时候应尽量避免使用全局变量。 要是用了全局变量,建议全局变量名要长,它包含所 有的大写字母,并有选择地以首次出现的M 文件的名 字开头。如果遵循建议,则在全局变量之间不必要的 互作用减至最小。

2013-8-10

112

2.6.2
?

函数文件

MATLAB 以搜寻脚本文件的同样方式搜寻函数M 文件。 例如,输入?cow ,MATLAB 首先认为cow 是一个变量。如果它不是, 那么MATLAB 认为它是一个内置函数。如果还不是,MATLAB 检查当前cow.m 的目录或文件夹。如果它不存在,MATLAB 就检 查cow.m 在MATLAB 搜寻路径上的所有目录或文件夹。 ? 从函数M 文件内可以调用脚本文件。在这种情况下,脚本文件查 看函数工作空间,不查看MATLAB 工作空间。从函数M 文件内调 用的脚本文件不必用调用函数编译到内存。函数每调用一次,它 们就被打开和解释。因此,从函数M 文件内调用脚本文件减慢了 函数的执行。

2013-8-10

113

2.6.2
?

函数文件

当MATLAB 运行时,它缓存了存储在Toolbox 子目录和 Toolbox 目录内的所有子目录中所有的M 文件的名字和位置。 这使MATLAB 很快地找到和执行函数M 文件。被缓存的M 文 件函数当作是只读的。如果执行这些函数,以后又发生变化, MATLAB 将只执行以前编译到内存的函数,不管已改变的M 文件。而且,在MATLAB 执行后,如果M 文件被加到Toolbox 目录中,那么它们将不出现在缓存里,因此不可利用。所以, 在M 文件函数的使用中,最好把它们存储在Toolbox 目录外, 或许最好存储在MATLAB 目录下,直至它们被认为是完备的。 当它们是完备时,就将它们移到一个只读的Toolbox 目录或文 件夹的子目录内。最后,要确保MATLAB 搜索路径改变,以确 认它们的存在。

2013-8-10

114

2.6.2
?

函数文件

?

MATLAB 函数error 在命令窗口显示一个字符串,放弃函数执 行,把控制权返回给键盘。这个函数对提示函数使用不当很有 用,如在以下文件片段中: ? if length(val)>1 ? error(' VAL must be a scalar. ') ? end 这里,如果变量val 不是一个标量,error 显示消息字符串, 把控制权返回给命令窗口和键盘。

2013-8-10

115

M函数文件示例。 [circle.m] function sa = circle(r,s) %CIRCLE plot a circle of radii r in the line specified by s. %r 指定半径的数值 %s 指定线色的字符串 % sa 圆面积 % % circle(r) 利用蓝实线画半径为 r 的圆周线. % circle(r,s) 利用串 s 指定的线色画半径为 r 的圆周线. % sa=circle(r) 计算圆面积,并画半径为 r 的蓝色圆面. % sa=circle(r,s) 计算圆面积,并画半径为 r 的 s 色圆面.

2013-8-10

116

if nargin>2 error(‘输入变量太多。'); end; if nargin==1 s='b'; end; clf; t=0:pi/100:2*pi; x=r*exp(i*t); if nargout==0 plot(x,s); else sa=pi*r*r; fill(real(x),imag(x),s) end axis('square') 2013-8-10

117

第3章 MATLAB的其他函数库
? ? ? ? ? ? ? ?

3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8

数据分析函数库datafun 矩阵的分解与变换matfun 多项式函数库polyfun 函数功能和数值积分函数库funfun 字符串函数库strfun 稀疏矩阵函数库sparfun 图形界面函数库guitools 数据类型函数库datatypes

2013-8-10

118

3.1 数据分析函数库datafun
? ? ?

? ? ? ? ? ? ?

?

corrcoef(x)求相关系数 cov(x)协方差矩阵 cplxpair(x)把向量分类为复 共轭对 cross(x, y)向量的向量积 cumprod(x)列累计积 cumsum(x)列累计和 del2(A)五点离散拉氏算子 diff(x) 计算元素之间差 dot(x, y)向量的点积 gradient(Z, dx, dy)近似梯 度 histogram(x)直方图和棒图

?

? ? ?

? ? ? ? ? ?

?

max(x), max(x, y)最大分 量 mean(x)均值或列的平均值 median(x)列的中值 min(x), min(x, y)最小分 量 prod(x)列元素的积 rand(x)均匀分布随机数 randn(x)正态分布随机数 sort(x)按升序排列 std(x)列的标准偏差 subspace(A, B)两个子空间 之间的夹角 sum(x)各列的元素和
119

2013-8-10

3.1 数据分析函数库datafun
3.1.1 基本的数据分析 1. max %求各列最大值 2. min %求各列最小值 3. mean %求各列平均值 4. std %求各列标准差 5. median %求各列中间元素 6. sum %求各列和 7. trapz %梯形法求积分 8. diff %求差分 9. sort %排序
?

2013-8-10

120

max(A)==[0.9501 0.8214 0.9218 0.9355] min(A)==[0.2311 0.0185 0.1763 0.4057] mean(A)=[0.6331 0.5006 0.6487 0.7124] std(A)==[0.2963 0.3197 0.2861 0.2783] median(A)==[0.6068 0.4565 0.7382 0.8936] ?0.9501 ?0.2311 sum(A)=[3.1654 2.5032 3.2437 3.5620] ? trapz(A)==[2.2447 1.8998 2.8478 2.9123] A ? ?0.6068 ? diff(A)==[-0.7190 -0.3056 0.1765 0.5298 ?0.4860 ?0.8913 0.3757 -0.4380 0.1299 -0.0186 ? -0.1209 0.8029 -0.1836 -0.5066 0.4053 -0.3767 -0.5619 0.4834] sort(A)==[0.2311 0.0185 0.1763 0.4057 0.4860 0.4447 0.6154 0.4103 0.6068 0.4565 0.7382 0.8936 0.8913 0.7621 0.7919 0.9169 0.9501 0.8214 0.9218 0.9355]

0.7621 0.6154 0.4057? ? 0.4565 0.7919 0.9355 ? ? 0.0185 0.9218 0.9169 ? 0.8214 0.7382 0.4103 ? ? 0.4447 0.1763 0.8936 ?

2013-8-10

121

3.1 数据分析函数库datafun
3.1.2 用于场论的数据分析函数 1、gradient %求梯度 2、del2 %拉普拉斯算子 3、cross %求矢量积 4、dot %求数量积
?

2013-8-10

122

3.1 数据分析函数库datafun
3.1.3 用于随机数据分析的函数 1、rand(m,n) 2、randn(m,n) 3、hist(x) %画直方图 4、hist(x,N) %N等份画直方图
?

2013-8-10

123

x=rand(1,1000); plot(x) hist(x)

2013-8-10

124

x=randn(1,1000); plot(x) hist(x); hist(x,50);

2013-8-10

125

3.1 数据分析函数库datafun
3.1.4 用于相关和傅立叶分析的函数 1、corrcoef(x,y) %相关系数 2、cov(x,y) %协方差 3、conv(x,y) %卷积和多项式相乘 4、deconv(x,y) %卷积和多项式相除 5、filter(b,a,x) %一维数据滤波 6、X=fft(x,N) %快速傅立叶变换 7、X=ifft(X) %逆傅立叶变换 8、sound(u,s) %向量变为声音 9、filter2, conv2,deconv, fft2,ifft2等
?

2013-8-10

126

x=rand(1,1000); ? y=randn(1,1000); ? R=corrcoef(x,y) %对角线是自相关系数 ? Z=cov(x,y)
? ?

R= 1.0000 0.0094 0.0094 1.0000

Z = 0.0835 0.0026 0.0026 0.8928

%对角线是x和y的均方差 ? P=conv(x,y); %卷积 P长度为Mx+Ny-1 如 x=[1 3 2 1]; y=[1 2 2]; ? [Q ,R]=deconv(x,y) 则:Q = 1 1 ? R= 0 0 -2 -1

2013-8-10

127

%构造受噪声污染的信号 clear; randn('state',0); t=linspace(0,10,512); y=3*sin(5*t)-6*cos(9*t)+… 5*randn(size(t)); plot(t,y) %绘制幅频曲线 Y=fft(y); Ts=t(2)-t(1) %时间信号的采样周期 Ws=2*pi/Ts; %时间信号的采样频率 Wn=Ws/2 %Nyquest频率 w=linspace(0,Wn,length(t)/2); %半采样频率中相应的刻度 Ya=abs(Y(1:length(t)/2)); plot(w,Ya) %绘制局部放大的幅频曲线 ii=find(w<=20); plot(w(ii),Ya(ii)) grid,xlabel('Frequency Rad/s')
2013-8-10 128

%信号滤波
clear,randn('state',1) ws=1000; %采样频率 t=0:1/ws:0.4;
x=sin(2*pi*10*t)+cos(2*pi*100*t) … +0.2*randn(size(t));
%生成带噪声的多频率信号

wn=w %Nyquest频率 [B,A]=butter(10,30/wn);
%截止频率为30/wn的10阶ButterWorth低通滤波器

y=filter(B,A,x); %进行(初值为0的)滤波处理 plot(t,x,'b-',t,y,'r.','MarkerSize',10) legend('Input','Output',0)

2013-8-10

129

3.2 矩阵的分解与变换matfun
主要考虑以下函数 det %求行列式 rank %求矩阵的秩 inv %求逆矩阵 trace %求矩阵的迹 cond %求条件数 [l,u]=lu(a) %三角分解 a=准下三角l*上三角u [q,r]=qr(a) %正交分解 a=正交方阵q*上三角阵r [u,s v]=svd(a) %奇异值分解 a=正交方阵u*对角阵s*正交方阵v [e,r]=eig(a); %特征值分解; e为特征向量,r为特征值

2013-8-10

130

A=magic(3);
B=det(A) C=inv(A) ========= B=-360 =====
C= 0.1472 -0.1444 0.0639 -0.0611 0.0222 0.1056 -0.0194 0.1889 -0.1028

R=rank(A)

===== R=3

T=trace(A) ====== T=15 CD=cond(A) ====== CD=4.3301 [l,u]=lu(A)

[q,r]=qr(A)
[u,s,v]=svd(A) [e,r]=eig(A)
2013-8-10 131

[l,u]=lu(A)准下三角必须交换二行才成为真下三角
l = 1.0000 0.3750 0.5000
8.0000

0 0.5441 1.0000

0 1.0000 0

u =

1.0000 6.0000 0 8.5000 -1.0000 0 0

5.2941
2013-8-10 132

[q,r]=qr(A)
q= -0.8480 -0.3180 -0.4240 r= -9.4340 0 0 0.5223 0.0901 -0.3655 -0.8748 -0.7705 0.4760 -6.2540 -8.1620 -8.2394 -0.9655 0 -4.6314

2013-8-10

133

[u,s,v]=svd(A)
u = -0.5774 -0.5774 -0.5774 s = 15.0000 0 0 v = -0.5774 -0.5774 -0.5774 0.7071 0.0000 -0.7071 0 6.9282 0 0.4082 -0.8165 0.4082

其中|u|=1,|v|=-1
0.4082 -0.8165 0.4082 0 0 3.4641 0.7071 -0.0000 -0.7071

2013-8-10

134

[e,r]=eig(A)
e= -0.5774 -0.5774 -0.5774 r= 15.0000 0 0 -0.8131 -0.3416 0.4714 -0.4714 0.3416 0.8131 0 0 4.8990 0 0 -4.8990

2013-8-10

135

3.3 多项式函数库polyfun
a( x) ? a1xn ? a2 xn?1 ? a3 xn?2 ? ...? an x ? an?1

1、P=roots(a)和a=poly(P) 根和求多项式 a=[a(1),a(2) ,a(3), …., a(n), a(n+1)] 2、c=conv(a,b) 相当于 c(x)=a(x)*b(x) 3、[q,r]=deconv(a,b) 多项式相除,q为商,r为余 子式 4、e=polyder(a)多项式求导 5、f=polyval(a,xv) 多项式求值 x=xv

2013-8-10

136

6、P=polyfit(x,y,n)多项式拟合 n为阶次 7、yi=interp1(x,y,xi,’method’) 插值函数 有 linear,cubic,spline 8、tc= interp2(x,y,z,wx,dy,’method’) 二维插值 9、[r,p,k]=residue(b,a) 求线性微分方程的解。

2013-8-10

137

1.求方程f(x)=x^3 + 1.1 x^2 + 0.55 x + 0.125=0 的根
A=[1 ,1.1 ,0.55, 0.125]; p=roots(A) p = -0.5000 -0.3000 + 0.4000i -0.3000 - 0.4000i

2013-8-10

138

2.由给定根向量求多项式系数向量。
R=[-0.5,-0.3+0.4*i,-0.3-0.4*i]; P=poly(R) PR=real(P) PPR=poly2str(PR,'x') P = 1.0000 1.1000 0.5500 0.1250 PR = 1.0000 1.1000 0.5500 0.1250 PPR = x^3 + 1.1 x^2 + 0.55 x + 0.125

2013-8-10

139

3.求3阶方阵A的特征多项式
?

A=[11 12 13;14 15 16;17 18 19]; PA=poly(A) PPA=poly2str(PA,'s')
PA = 1.0000 -45.0000 -18.0000 -0.0000 PPA = s^3 - 45 s^2 - 18 s - 2.8387e-015

?

2013-8-10

140

( s 2 ? 2)(s ? 4)(s ? 1) 4.求 s3 ? s ?1 多项式。

的“商”及“余”

p1=conv([1,0,2], conv([1,4],[1,1])); p2=[1 0 1 1]; [q,r]=deconv(p1,p2); cq=‘商多项式为 ’; cr='余多项式为 '; disp([cq,poly2str(q,'s')]),disp([cr,poly2str(r,'s')]) 商多项式为 s + 5 余多项式为 5 s^2 + 4 s + 3
2013-8-10 141

5.求多项式f(x)=x^3 + 4 x^2 + 5 x +6的导数和f '(2)

a=[1 4 5 6]; e=polyder(a) fx=poly2str(e,'x') f=polyval(e,2) e = 3 8 5 fx = 3 x^2 + 8 x + 5 f= 33

2013-8-10

142

% 求频率特性 a=[2,4,6,8],b=[3,6,9];clear j w=linspace(0,10);A=polyval(a,j*w); B=polyval(b,j*w); subplot(2,2,1);h=plot(w,abs(B./A));set(h,'linewidth',2) subplot(2,2,3);h=plot(w,angle(B./A));,set(h,'linewidth',2) w1=logspace(-1,1) F=polyval(b,j*w1)./polyval(a,j*w1); subplot(2,2,2);loglog(w1,abs(F),'linewidth',2) subplot(2,2,4);semilogx(w1,angle(F),'linewidth',2)

2013-8-10

143

6.对于给定数据对x0 , y0 , 求拟合三阶多项式,并图示拟合情况。
10 8 6

?

?
?

? ? ? ?

?

? ?

x0=0:0.1:1; y0= [-.447,1.978,3.11,5.25,5.02, 4.66,4.01,4.58,3.45,5.35,9.22]; n=3; P=polyfit(x0,y0,n) xx=0:0.01:1; yy=polyval(P,xx); plot(xx,yy,'b',x0,y0,'.r','MarkerSize',20),xlabel('x') P = 56.6915 -87.1174 40.0070 -0.9043
4 2 0 -2 0 0.2

0.4 x

0.6

0.8

1

2013-8-10

144

例:曲线拟合 x=0:0.1:1; y=[.447,1.978,3.28,6.16,7.08,7.34,7.66,9.56,9.48,9.30,11.2]; subplot(2,3,1),plot(x,y,'o');title('原始数据点'); a1=polyfit(x,y,1);xi=linspace(0,1);y1=polyval(a1,xi); subplot(2,3,2),plot(x,y,'o',xi,y1,'r'); title('线性拟合'); a2=polyfit(x,y,2);y2=polyval(a2,xi); subplot(2,3,3),plot(x,y,'o',xi,y2,'r');title('二次拟合'); a3=polyfit(x,y,3);y3=polyval(a3,xi); subplot(2,3,4),plot(x,y,'o',xi,y3,'r'); title('三次拟合'); a9=polyfit(x,y,9);y9=polyval(a9,xi); subplot(2,3,5),plot(x,y,'o',xi,y9,'r'); title('九次拟合'); a10=polyfit(x,y,10);y10=polyval(a10,xi); subplot(2,3,6),plot(x,y,'o',xi,y10,'r') ;title('十次拟合');

2013-8-10

145

2013-8-10

146

7.以上例所给数据,研究一维插值,并观察插值与拟合的 区别。
? ?

? ?

?

x0=0:0.1:1; y0=[.447,1.978,3.11,5.25,5.02,4.66,4.01,4.58,3.45,5.35,9.22 ]; xi=0:0.02:1; yi=interp1(x0,y0,xi,'cubic'); plot(xi,yi,'-b',x0,y0,'.r','MarkerSize',20),xlabel('x')
10

8

6

4

2

0

2013-8-10

-2

0

0.2

0.4 x

0.6

0.8

1

147

9.部分分式展开
a=[1,3,4,2,7,2]; b=[3,2,5,4,6]; [r,s,k]=residue(b,a) ? r = 1.1274 + 1.1513i ; ? -0.0232 - 0.0722i; 0.0722i; ? 0.7916 ? s = -1.7680 + 1.2673i; ? 0.4176 + 1.1130i; 1.1130i; ? -0.2991 ? k = []

1.1274 - 1.1513i; -0.0232 + -1.7680 - 1.2673i; 0.4176 -

2013-8-10

148

y ''' ? 5 y '' ? 4 y ' ? 7 y ? 3u '' ? 0.5u ' ? 4u 求线性微分方程

在输入u(t)为单位脉冲及单位阶跃信号时的响应
a=[1,5,4,7];b=[3,0.5,4];[r,p,k]=residue(b,a) t=0:0.2:10; yi=r(1)*exp(p(1)*t)+r(2)*exp(p(2)*t)+r(3)*exp(p(3)*t); subplot(1,2,1),h=plot(t,yi);set(h,'linewidth',2) a=[1,5,4,7,0];b=[3,0.5,4];[r,p,k]=residue(b,a); ys=0; for i=1:length(r) ys=ys+r(i)*exp(p(i)*t); end subplot(1,2,2), plot(t,ys,'linewidth',2)
2013-8-10 149

响应结果图

2013-8-10

150

3.4 函数功能和数值积分函数库funfun
? ? ?

%绘制函数曲线 fplot(‘函数名’,[初值x0,终值xf]) fplot(FUN,LIMS,TOL,N,'LineSpec',P1,P2,...)

function [y]=jszero(t,a,b) y=sin(t).^2.*exp(-a.*t)-b.*abs(t); fplot('jszero',[-10,10],[],[],[],0.1,0.5)

2013-8-10

151

subplot(2,2,1), fplot(@humps,[0 1])
? ?

f = inline('abs(exp(-j*x*(0:9))*ones(10,1))'); subplot(2,2,2), fplot(f,[0 2*pi])

subplot(2,2,3), fplot('[tan(x),sin(x),cos(x)]',2*pi*[-1 1 -1 1])
?

subplot(2,2,4), fplot('sin(1 ./ x)', [0.01 0.1],1e-3)

2013-8-10

152

2013-8-10

153

%求函数极值 fmin(‘函数名’,初值x0,终值xf) X = fmin('F',x1,x2,OPTIONS,P1,P2,...) 如:m=fmin(‘humps’,[0,1.5]); %求函数零点 fzero(‘函数名’,初猜值x0) X = fzero(@sin,3) X = fzero(inline('sin(3*x)'),2);

2013-8-10

154



f (t ) ? (sin t )e
2

?at

?bt

的零点

P1=0.1;P2=0.5; %用字符串表示被处理函数 yC='sin(x).^2.*exp(-P1*x)-P2*abs(x)'; x=-10:0.01:10; %作图观察函数零点分布 Y=eval(yC); %对字符串表达式进行计算并输出 clf,plot(x,Y,‘r’); hold on plot(x,zeros(size(x)),'k'); xlabel('t');ylabel('y(t)'),hold off
2013-8-10 155

%利用zoom和ginput 指令获得零点的初始近似值 zoom on [tt,yy]=ginput(5);zoom off %计算tt(4)附近的零点 [t4,y4]=fzero(yC,tt(4),[ ],P1,P2); for i=1:length(tt) [xup(i),yup(i)]=fzero(yC,tt(i),[ ],P1,P2) end

2013-8-10

156

或[z,fz,exitflag]=fzero(fun,x0,options,p1,p2,..) Exitflag>0找到零点后退出 Options为优化迭代所采用的参数选项 function [y]=jszero(t,a,b) y=sin(t).^2.*exp(-a.*t)-b.*abs(t); [z,fz]=fzero('jszero',1.6,[],0.1,0.5)

2013-8-10

157

quad() 采用递推自适应Simpson法
quad(‘函数名’,初值x0,终值xf)求定积分 quad(fun,a,b,TOL,TRACE,P1,P2,...) tol 控制绝对误差,trace 取非零 将逐点画。 F = inline('1./(x.^3-2*x-5)'); Q = quad(F,0,2); Q = quad(@myfun,0,2); function y = myfun(x) y = 1./(x.^3-2*x-5);

2013-8-10

158

quadl()采用递推自适应Lobatto法
F = inline('1./(x.^3-2*x-5)'); Q = quadl(F,0,2); Q = quadl(@myfun,0,2); function y = myfun(x) y = 1./(x.^3-2*x-5);

2013-8-10

159

ode45采用4,5阶龙格库塔法求解微分方程
[x,y]=ode45(‘函数名’,自变量初值x0,自变量终值xf,因变量初 值x0);

[t,y]=ode45(@vdp1,[0 20],[2; 0]); plot(t,y(:,1));figure; plot(y(:,1),y(:,2)); function [yp]=vdp1(t,y) r=2; yp(1)=y(2); yp(2)=-r*(y(1).^2-1)*y(2)-y(1); yp=yp'; % yp=[y(2);-r*(y(1).^2-1)*y(2)-y(1)];

2013-8-10

160

&& & ? ( y ? y) y ? ( y ? 1) y ? y ? 0 & ? y& & & & & y &
2

[t,y]=ode45('vdp2',[0, 30],[1;0;0;1 ]) plot(t,y(:,1))
function [yp]=vdp2(t,y) yp(1)=y(2); yp(2)=y(3); yp(3)=y(4);; yp(4)=-y(4)-(y(1)^2+y(1))*y(3)-(y(1)+1)*y(2)-y(1); yp=yp'; %yp=[y(2);y(3);y(4);-y(4)-(y(1)^2+y(1))*y(3)(y(1)+1)*y(2)-y(1)]

2013-8-10

161

d 2x 2 dx ? ? (1 ? x ) ? x ? 0 2 dt dt
? ?

& x(0) ? 1, x(0) ? 0

y(1)=x;y(2)=dx/dt; function ydot=DyDt(t,x) mu=2; ydot=[x(2);mu*(1-x(1)^2)*x(2)-x(1)];

[tt,yy]=ode45(@DyDt,[0,30],[1;0]); plot(tt,yy(:,1));title(‘x(t)’);

2013-8-10

162

3.5 字符串函数库strfun
? ? ? ? ? ? ?

eval(string) 作为一个MATLAB 命令求字符串的值 eval(try,catch) blanks(n) 返回一个n 个零或空格的字符串 deblank 去掉字符串中后拖的空格 feval 求由字符串给定的函数值 findstr 从一个字符串内找出字符串 isletter 字母存在时返回真值

2013-8-10

163

? ? ?

?
? ?

isspace 空格字符存在时返回真值 isstr 输入是一个字符串,返回真值 lasterr 返回上一个所产生MATLAB 错误的字 符串 strcmp 字符串相同,返回真值 strrep 用一个字符串替换另一个字符串 strtok 在一个字符串里找出第一个标记

2013-8-10

164

eval的使用
P1=0.1;P2=0.5; y='sin(x).^2.*exp(-P1*x)-P2*abs(x)'; x=-10:0.01:10; Y=eval(y); plot(x,Y);grid on

2013-8-10

165

3.5
? ? ? ? ? ? ?

字符串函数库strfun

字 符 串 转 换
abs字符串到ASCII转换 dec2hex十进制数到十六进制字符串转换 fprintf把格式化的文本写到文件中或显示屏上 hex2dec十六进制字符串转换成十进制数 hex2num十六进制字符串转换成IEEE浮点数 int2str整数转换成字符串 lower字符串转换成小写

2013-8-10

166

? ? ? ? ? ?

?

num2str数字转换成字符串 setstr ASCII转换成字符串 sprintf用格式控制,数字转换成字符串 sscanf用格式控制,字符串转换成数字 str2mat字符串转换成一个文本矩阵 str2num字符串转换成数字 upper字符串转换成大写

2013-8-10

167

串数组的属性和标识
1、创建字符串数组---用单引号对 A=‘This is an example.’ ? 2、字符串大小---字符个数 [m,n]=size(A) ? 3、串数组的元素标识 A14=A(1:4) %提取子字符串 ra=A(end:-1:1) %字符串倒排
?

2013-8-10

168

4、串数组的ASCII码 ascii_a=double(A); %产生ASCII码 char(ascii_a) %把ASCII码变回字符串 ? 5、对字符串ASCII码数组的操作 W=find(A>=‘a’&A<=‘z’); ascii_a(W)=ascii_a(W)-32; char(ascii_a) %将小写变大写
?

2013-8-10

169

6、中文字符串数组 A=‘这是一个算式’; A_s=size(A); A56=A([5 6]); ASCII_a=double(A); char(ASCII_a);
?

2013-8-10

170

7、创建带单引号的字符串 b=‘Example ’’3.1.2_1’’’; ? 8、由小串构成长串 Ab=[a(1:7),’ ’,b,’.’]; Ab=This is Example ‘3.1.2._1’.
?

2013-8-10

171

复杂串数组的创建
1、多行串数组的直接创建 ? clear ? S=['This string array ' ? 'has multiple rows.'] ? 但长度必须相等

2013-8-10

172

2、由专门函数char , str2mat , strvcat创建多 行串数组 S1=char('This string array','has two rows.') S1 = This string array has two rows.
?

2013-8-10

173

? ? ?

?
? ?

S2=str2mat('这','字符','串数组','由4行组成') S2 = 这 字符 串数组 由4行组成

2013-8-10

174

?

? ?

?
? ? ? ? ? ?

S3=strvcat('这','字符','串数组',' ','由4 行组成') S3 = 这 字符 串数组 由4行组成 size(S3) ans = 5 5
175

2013-8-10

转换函数产生数码字符串
最常用的数组/字符串转换函数int2str , num2str , mat2str A=eye(2,4); A_str1=int2str(A) %非整数四舍五入 rand('state',0) B=rand(2,4); B3=num2str(B,3) %将非整数转换为串
?

2013-8-10

176

? ? ?

?

把数值数组转化成输入形态的串数组 B_str=mat2str(B,4) Expression=['exp(-',B_str,')']; eval(Expression)

2013-8-10

177

在MATLAB计算生成的图形上标出图名和最大值点 坐标。
? ?
y=exp(-2t)*sin(3t) 0.6 0.5 0.4 0.3 maximum t=0.33 y=0.4321

Y=exp(-2t)*sin(3t)

y
0.2 0.1 0 -0.1 0

2

4 t

6

8

10

2013-8-10

178

clear;a=2;w=3; t=0:0.01:10; y=exp(-a*t).*sin(w*t); [ymax,imax]=max(y); ttext=['t=',num2str(t(imax))]; ytext=['y=',num2str(ymax)]; maxtext=char('maximum',ttext,ytext); tit=['y=exp(-',num2str(a),'t)*sin(',num2str(w),'t)']; plot(t,zeros(size(t)),'k') ; hold on plot(t,y,'b') plot(t(imax),ymax,'r.','MarkerSize',20) text(t(imax)+0.3,ymax+0.05,maxtext) title(tit),xlabel('t'),ylabel('y'),hold off
2013-8-10 179

fprintf, sprintf, sscanf的用法示例
?

?
? ?

?
? ? ? ? ?

rand('state',0);a=rand(2,2); s1=num2str(a) s_s=sprintf('%.10e\n',a) fprintf('%.5g\\',a) 0.95013\0.23114\0.60684\0.48598\ s_sscan=sscanf(s_s,'%f',[3,2]) s_sscan = %浮点格式把串转换成3X2数值数组 0.9501 0.4860 0.2311 0 0.6068 0

2013-8-10

180

符号计算
f=sym(arg) % 将arg转化为符号对象。 ? syms arg2 arg3 arg4 如y=sym(‘2*sin(x)*cos(x)’) yy=simple(y); %化为最简形式 如syms x y=2*sin(x)*cos(x) yy=simple(y);
?

2013-8-10

181

合并同类项
z=sym(‘3*x^2*y+2*x*(y-2)+2*x^2-x*(y-2)’) z= 3*x^2*y+2*x*(y-2)+2*x^2-x*(y-2) p=collect(z) p= (3*y+2)*x^2+x*(y-2)

2013-8-10

182

求积分
? ? ?

int(P) 对表达式P进行不定积分。 int(P,v) 以v为积分变量对P进行不定积分。 int(P,v,a,b) 以v为积分变量,以a为下限,b为上 限对P进行定积分。

2013-8-10

183

A?
? ? ?

a1 a 2 a3 a 4

?
? ? ?

syms a1 a2 a3 a4 A=[a1 a2;a3 a4]; DA=det(A);IA=inv(A);EA=eig(A); 求定积分 int(f,x,t1,t2) syms A t tao w yf=int(A*exp(-i*w*t),t,-tao/2,tao/2); yf=simple(yf)

2013-8-10

184

置换操作
? ? ?

?
? ? ?

[RS]=subs(S,old, new); [RS]=subs(S, new); sym a x; f=a*sin(x)+5; f1=subs(f,’sin(x)’,sym(‘y’)); f2=subs(f,{a,x},{2,sym(pi/3)}) f3=int(f,a); f4=int(f,x,0,2);

2013-8-10

185


? ?

?1 ? x ?

2

x2

x2 y

( x 2 ? y 2 ? z 2 )dxdydz xy

?

syms x y z f2=int(int(int(x^2+y^2+z^2,z,sqrt(x*y),x^2*y),y,sqrt(x), x^2),x,1,2) vf2=vpa(f2) %指定精度 vpa(x,n) %指定n位相对精度

?

2013-8-10

186

求导数
diff(S,v) 求表达式S对变量v的一阶导数。 ? diff(S,v,n) 求表达式S对变量v的n阶导数。 如求sin(x)+ex的三阶导数,键入命令 diff('sin(x)+x*exp(x)',3) 得 ans = -cos(x)+3*exp(x)+x*exp(x)
?

2013-8-10

187

dfdvn ? diff ( f , v, n)

d n f (v ) 求 dvn

t ? d ? a ? ? dx ?t cos x ln x ?
3

d dt2

2

? a t ? ? ? ?t cos x ln x?
3

? a t3 ? d ? ? dxdt ?t cos x ln x ?
2
? ?

sym a t x; f=[a,t^3;t*cos(x);log(x)]; df=diff(f); dfdt2=diff(f,t,2); dfdxdt=diff(diff(f,x),t);

2013-8-10

188

求和
? ?

?

?

symsum(S) 对通项S求和,其中k为变量。且从 0变到k-1。 symsum(S,v) 对通项S求和,指定其中v为变量。 且v从0变到v-1。 symsum(S,a,b) 对通项S求和,其中k为变量。 且从a变到b。 symsum(S,v,a,b) 对通项S求和,指定其中v为变 量。且v从a变到b。

2013-8-10

189

例:键入k=sym(‘k’); symsum(k) 得 ? ans = 1/2*k^2-1/2*k 又例如:键入 symsum(k^2,0,10)得 ? ans = 385 又例如:键入 ? symsum('x'^k/sym('k!'),k,0,inf)得 ? ans = exp(x) ? 这最后的一个例子是无穷项求和。

2013-8-10

190

求极限
? ? ? ?

limit(P) 表达式P中自变量趋于零时的极限。 limit(P,a) 表达式P中自变量趋于a时的极限。 limit(P,x,a,'left') 表达式P中自变量x趋于a时的左极限。 limit(P,x,a,'right') 表达式P中自变量x趋于a时的右极限。

2013-8-10

191

例如:键入 P=sym('sin(x)/x'); limit(P) 得 ? ans = 1 键入 P=sym('1/x'); limit(P,x,0,'right') 得 ? ans = inf 键入 P=sym('(sin(x+h)-sin(x))/h');h=sym('h'); ? limit(P,h,0) 得 ans = cos(x) 键入 v=sym('[(1+a/x)^x,exp(-x)]'); ? limit(v,x,inf,'left') 得 ? ans = [ exp(a), 0]

2013-8-10

192

线性方程组的求解
线性方程组的形式为A*X=B;其中A至少行满秩。 ? X=linsolve(A,B) 输出方程的特解X。 ? 例如:键入 ? A=sym('[cos(t),sin(t);sin(t),cos(t)]'); ? B=sym('[1;1]'); ? c=linsolve(A,B) ? c= ? [ 1/(sin(t)+cos(t))] ? [ 1/(sin(t)+cos(t))]

2013-8-10

193

代数方程的求解
?

? ?

solve(P,v) 对方程P中的指定变量v求解。v可 省略。 solve(P1,P2,…,Pn,v1,v2,…,vn) 对 方 程 P1,P2,…Pn 中 的 指 定 变 量 v1, v2…vn求解。

2013-8-10

194

? ? ? ?

?
? ?
?
?

例:可输入 solve('p+sin(x)=r') 得: ans =-asin(p-r) 例输入:P1='x^2+x*y+y=3';P2='x^2-4*x+3=0'; [x,y]=solve(P1,P2) 得: x = [ 1; 3] y = [1; -3/2] 可输入:P1='a+u^2+v^2=0';P2='u-v=1'; [u,v]=solve(P1,P2,'u','v') 得:
u = [ 1/2+1/2*(-1-2*a)^(1/2); 1/2-1/2*(-1-2*a)^(1/2)] v =[ -1/2+1/2*(-1-2*a)^(1/2) ;-1/2-1/2*(-1-2*a)^(1/2)]

2013-8-10

195

对于有些无法求出解析解的非线性方程组,MATLAB 只给出一个数值解。这一点可以 从表示解的数字不被方括号括住而确定。例如:键入: ? [x,y]=solve('sin(x+y)-exp(x)*y=0','x^2-y=2') 得: ? x = -6.0173272500593065641097297117905 ? y = 34.208227234306296508646214438330 ? 由于这两个数字没有被[ ]括住,所以它们是数值解。
?

2013-8-10

196

? ? ? ? ? ? ?

?

另外,可利用solve来解线性方程组的通解。例如:键 入 P1='2*x1+7*x2+3*x3+x4=6'; P2='3*x1+5*x2+2*x3+2*x4=4'; P3='9*x1+4*x2+x3+7*x4=2'; u=solve(P1,P2,P3,'x1','x2','x3','x4') Warning: 3 equations in 4 variables. u = x1: [1x1 sym] x2: [1x1 sym] x3: [1x1 sym] x4: [1x1 sym]

2013-8-10

197

?

? ? ? ? ? ?

可以看到:屏幕提示“有3个方程4个变量”,意为解 不唯一。(有时会提示解不唯一)且输出的是解的结 构形式。为进一步得到解,可输入: u.x1,u.x2,u.x3,u.x4, 得: ans = x1 ans = -5*x1-4*x4 ans = 11*x1+9*x4+2 ans = x4 这样就得到了原方程组的通解。

2013-8-10

198

解符号微分方程
dsolve('eq1','eq2',…) 其中eq表示相互独立的常微分方 程、初始条件或 指定的自变量。默认的自变量为t。 如果输入的初始条件少于方程的个数,则在输出结果中 出现常数c1,c2,等字符。 关于微分方程的表达式有如下的约 定: 字母y表式函数,Dy表示y对t的一阶导数; ? Dny表示y对t的n阶导数。

2013-8-10

199

? ? ?

例如:



的解。可键入: ? [x,y]=dsolve('Dx=y','Dy=-x') 得x = cos(t)*C1+sin(t)*C2 y= -sin(t)*C1+cos(t)*C2

dx ?y dt

dy ? ?x dt

2013-8-10

200

例如求 , f(0)=0 , g(0)=1 的解。

df ? 3 f ? 4g dt

dg ? ?4 f ? 3 g dt

,

可输入指令: P='Df=3*f+4*g,Dg=-4*f+3*g'; v='f(0)=0,g(0)=1'; [f,g]=dsolve(P,v) f = exp(3*t)*sin(4*t) g = exp(3*t)*cos(4*t) ? 注意:微分方程表达式中字母D必须大写

2013-8-10

201

求解微分方程

d3y ? ?y 3 dx
2

dy d y y (0) ? 1, ? 0, 2 ?0 dx x ? 0 dx x ? 0 y=dsolve('D3y=-y','y(0)=1,Dy(0)=0,D2y(0)=0','x')
得: y = (1/3+2/3*exp(1/2*x)*cos(1/2*3^(1/2)*x)*exp(x))/e xp(x)

2013-8-10

202

最后看一个解非线性微分方程的例子: dsolve('(Dy)^2+y^2=1','y(0)=0','x') ans = [ sin(x)] [ -sin(x)]
对于无法求出解析解的非线性微分方程,屏幕将 提示出错信息。

2013-8-10

203

泰勒(taylor)级数的展开
格式1:R=taylor(f) %默认x为变量的n-1阶麦克劳林f的多项式 格式2:R=taylor(f,n,v) %对符号变量为v的n-1阶麦克劳林f的多项式

2013-8-10

204

syms x f=exp(-x); ff=taylor(f) 结果: ff = 1-x+1/2*x^2-1/6*x^3+1/24*x^4-1/120*x^5

2013-8-10

205

syms x f=log(x); ff=taylor(f,6,1) 结果: ff = x-1-1/2*(x-1)^2+1/3*(x-1)^3-1/4*(x-1)^4 +1/5*(x-1)^5

2013-8-10

206

syms x f=sin(x); ff=taylor(f,6,pi/2) 结果: ff = 1-1/2*(x-1/2*pi)^2+1/24*(x-1/2*pi)^4

2013-8-10

207

syms x t f=x^t; ff=taylor(f,3,t) %展开到t的二次方项 结果: ff = 1+log(x)*t+1/2*log(x)^2*t^2

2013-8-10

208

3.6 稀疏矩阵函数库sparfun

2013-8-10

209

3.7 图形界面函数库guitools
G?

例:对于传递函数为 统,制作一个能绘制该系统单位阶跃响应的图 形用户界面。本例演示:(A)图形界面的大 致生成过程;(B)静态文本和编辑框的生成; (C)坐标网格控制键的形成;(D)如何使 用该界面。

1 s 2 ? 2?s ? 1 的归一化二阶系

2013-8-10

210

(1)产生图形窗和轴位框:
clf reset H=axes('unit','normalized','position',[0,0,1,1],'visible','off'); set(gcf,'currentaxes',H); str='\fontname{隶书}归一化二阶系统的阶跃响应曲线'; text(0.12,0.93,str,'fontsize',13); h_fig=get(H,'parent'); set(h_fig,'unit','normalized','position',[0.1,0.2,0.7,0.4]); h_axes=axes('parent',h_fig,... 'unit','normalized','position',[0.1,0.15,0.55,0.7],... 'xlim',[0 15],'ylim',[0 1.8],'fontsize',8);

2013-8-10

211

2013-8-10

212

(2)在坐标框右侧生成作解释用的“静态文本”

和可接收输入的“编辑框”
h_text=uicontrol(h_fig,'style','text','unit','normalized','positio n',[0.67,0.73,0.25,0.14],'horizontal','left','string',{' 输 入 阻尼比系数','zeta ='}); h_edit=uicontrol(h_fig,'style','edit','unit','normalized','positio n',[0.67,0.59,0.25,0.14], 'horizontal','left', 'callback',[ 'z=str2num(get(gcbo,''string'')); 't=0:0.1:15;','for k=1:length(z);','y(:,k)=step(1,[1 2*z(k) 1],t);', 'plot(t,y(:,k));', 'if (length(z)>1) ,hold on,end,', 'end;','hold off,']);

2013-8-10

213

2013-8-10

214

(3)形成坐标网格控制按键
h_push1=uicontrol(h_fig,'style','push',... 'unit','normalized','position',[0.67,0.37,0.12,0.15],... 'string','grid on','callback','grid on'); h_push2=uicontrol(h_fig,'style','push',... 'unit','normalized','position',[0.67,0.15,0.12,0.15],... 'string','grid off','callback','grid off');

2013-8-10

215

2013-8-10

216

2013-8-10

217

利用控制对象面板设计
1在Matlab中选中File----New----GUI 2选中Blank GUI(Default) 3选中Axes作坐标,并存盘 4选Static Text并在图中选择,双击写字符串 5选择Edit编辑文本框,Tag取名fdisp,同时编写 fdisp.m 并在Callback调用fdisp.m 6增加Grid on 和Grid off按钮

2013-8-10

218

%fdisp.m脚本文件
clear all % z=str2num(get(findobj(gcbf,'tag','fdisp'),'string')); z=str2num(get(gcbo,'string')) t=0:0.1:15; for k=1:length(z) y(:,k)=step(1,[1 2*z(k) 1],t); plot(t,y(:,k)); if (length(z)>1) hold on end end hold off

2013-8-10

219

2013-8-10

220

实例分析
1先创建一个图形窗口,键入figure,并保存为 ex01.fig 2在Matlab菜单中选中File----New----GUI建立一 个新的控制对象面板 3从控制面板菜单中选File-New-Open--ex01 4选中Axes作坐标 5添加编辑文本框,Tag取名ex_edit,同时编写 ex_edit.m 并在Callback调用ex_edit.m

2013-8-10

221

6增加Load, Apply, Grid on ,Grid off ,Close按钮, 并增加弹出菜单(Popup Mean);增加两个静 态文本Input data和Color choose 7加入popmenu,string为spring,summer, autumn, winter, callback和tag为ex_color, 8选mean editor—new menu---label和tag输ex_view, 再增加view_2D,view_3D, Callback为view(2),view(3)

2013-8-10

222

ex_edit.m

ex_load.m

%ex_edit.m function ex_edit ct=get(findobj(gcbf,'tag','ex_edit‘),'string'); save mydata ct %ex_load.m function ex_load load mydata set(gcbf,'userdata',ct);

2013-8-10

223

ex_apply
%ex_apply function ex_apply ct=get(gcbf,'userdata'); eval(ct); plot(x,y) %Close close(gcbf)

2013-8-10

224

%ex_color
%ex_color function ex_color popstr={'spring','summer','autumn','winter'}; vpop=get(findobj(gcf,'tag','ex_color'), 'value'); colormap(eval(popstr{vpop}));

2013-8-10

225

2013-8-10

226

3.8 数据类型函数库datatypes
元胞数组 C_str=char('这是','元胞数组创建算例 1'); R=reshape(1:9,3,3); Cn=[1+2i]; S_sym=sym('sin(-3*t)*exp(-t)') A(1,1)={C_str};A(1,2)={R};A(2,1)={Cn};A(2,2)={S_sym}; A={C_str,R,Cn,S_sym} A

2013-8-10

227

结果:A= [2x10 char] [3x3 double] 2.0000i] [1x1 sym] 显示内容: A{1,1} A{1,2} A{1,4}

[1.0000+

2013-8-10

228

元胞数组在存放和操作字符串上的应用
a='MATLAB 5 ';b='introduces new data types:'; c1='◆Multidimensional array';c2='◆User-definable data structure'; c3='◆Cell arrays';c4='◆Character array'; c=char(c1,c2,c3,c4); C={a;b;c}; a disp([C{1:2}]); disp(' ') disp(C{3}) MATLAB 5 introduces new data types: ◆Multidimensional array ◆User-definable data structure ◆Cell arrays ◆Character array

2013-8-10

229

构架数组
本例通过温室数据(包括温室名、容积、温度、湿度等) 演示:单构架的创建和显示。

green_house.name='一号房'; green_house.volume='2000立方米'; green_house.parameter.temperature=[31.2 31.6 28.7 29.7 31.1 30.9 29.6]; green_house.parameter.humidity=[62.1 57.7 61.5 62.0 61.9 59.2 57.5];

30.4 59.5

2013-8-10

230

green_house green_house = name: '一号房' volume: '2000立方米' parameter: [1x1 struct] green_house.parameter ans = temperature: [2x4 double] humidity: [2x4 double]

2013-8-10

231

green_house.parameter.temperature ans = 31.2000 30.4000 31.6000 28.7000 29.7000 31.1000 30.9000 29.6000

2013-8-10

232

利用构造函数创建构架数组
a=cell(2,3); green_house_1=struct('name',a,'volume',a,'parameter',a (1,2)) green_house_1 = 2x3 struct array with fields: name volume parameter

2013-8-10

233

利用构造函数创建构架数组
green_house_2=struct('name',a,'volume',[],'para meter',[]) green_house_2 = 2x3 struct array with fields: name volume parameter

2013-8-10

234

利用构造函数创建构架数组
green_hopuse_3(2,3)=struct('name',[],'volume',[], 'parameter',[]) green_hopuse_3 = 2x3 struct array with fields: name volume parameter

2013-8-10

235

利用构造函数创建构架数组
a1={'六号房'};a2={'3200立方米'}; green_house_4(2,3)=struct('name',a1,'volume',a2,'parameter',[]); T6=[31.2,30.4,31.6,28.7;29.7,31.1,30.9,29.6]; green_house_4(2,3).parameter.temperature=T6; green_house_4 ans = 2x3 struct array with fields: name volume parameter

2013-8-10

236

MATLAB的SIMULINK仿真
? ?

SIMULINK是一个进行动态系统建模、仿真和综合分析的集成软件包。 它可以处理的系统包括:线性、非线性系统;离散、连续及混合系统; 单任务、多任务离散事件系统。 在 SIMULINK 提供的图形用户界面GUI上,只要进行鼠标的简单拖 拉操作就可构造出复杂的仿真模型。它外表以方块图形式呈现,且采 用分层结构。 从建模角度讲,这既适于自上而下(Top-down)的设计流程(概念、 功能、系统、子系统、直至器件),又适于自下而上(Bottum-up) 逆程设计。

?

2013-8-10

237

MATLAB的SIMULINK仿真
?

从分析研究角度讲,这种 SIMULINK 模型不仅能让 用户知道具体环节的动态细节,而且能让用户清晰地 了解各器件、各子系统、各系统间的信息交换,掌握 各部分之间的交互影响。

?

在 SIMULINK 环境中,用户将观察到现实世界中非 线性因素和各种随机因素对系统行为的影响。
在 SIMULINK 环境中,用户可以在仿真进程中改变 感兴趣的参数,实时地观察系统行为的变化。

?

2013-8-10

238

MATLAB的SIMULINK仿真
?

在MATLAB 6.0 版中,可直接在 SIMULINK 环境中运作的工具 包很多,已覆盖通信、控制、信号处理、DSP、电力系统等诸多 领域,所涉内容专业性极强。 本讲由浅入深地讲述 SIMULINK 对各种数学、工程问题的建模、 仿真和分析的基本方法,采用“算例”作为主体,配以适量的归 纳性表述。

?

2013-8-10

239

模型的创建和模型文件
SIMULINK 模型是什么? SIMULINK 模型有以下几层含义: ? 在视觉上表现为直观的方框图; ? 在文件上则是扩展名为 mdl 的ASCII代码; ? 在数学上表现为一组微分方程或差分方程; ? 在行为上则模拟了实际系统的动态特性 。

2013-8-10

240

?

?

SIMULINK 模型通常包含三种 “组件”: 信源( Sources):可以是常数、时钟、白噪声、正弦波、 阶梯波、扫频信号、脉冲生成器、随机数产生器等信号源; 系统( System):即指被研究系统的 SIMULINK 方框图; 信宿( Sink):可以是示波器、图形记录仪等。 对于具体的 SIMULINK 模型而,不一定完全地包含这三大组 件。例如:研究初始条件对系统影响就不必包含信源组件。

?

?
?

2013-8-10

241

SIMULINK 模型的创建
?

?
? ? ? ? ? ? ?

创建模型文件; 选择对象; 模块的操作; 连线的操作; 对模型的注释; 创建子系统; 仿真的配置 ; 保存模型; 仿真和结果分析。

2013-8-10

242

仿真运行
?

使用菜单进行仿真

?
?

设置仿真参数和选择求解器 通过选择菜单 Simulation 下的 Parameters 菜单项,用来设置仿真 参数和选择求解器。其中有三个页面管理这些仿真参数。
在 Solver 页面,设置开始和停止时间,选择求解器和指定求解器 (solver)的参数,另外还可以选择一些输出选项。 在 Solver options 中, SIMULINK 模型的仿真涉及到一组常微分 方程(ODEs)的数值积分。如果模型是连续系统,使用ode45方 法;如果模型不是连续系统,使用discrete方法。

?

?

2013-8-10

243

仿真运行
?

在 Workspace I/O 页面,管理对 MATLAB 工作空间的输入和输 出。 在 Diagnostics 页面,可以选择在仿真期间显示的警告信息的层次。 通过命令行运行仿真

? ? ?

? ?

通过命令行运行仿真与通过菜单运行仿真相比 ,有如下的 一些优 点: 可以不理睬模块中的初始条件(参数 x0 ); 可以定义任何外部输入(用参数 ut );

2013-8-10

244

仿真运行
? ? ?

可以由一个M 文件来启动一个仿真,并且允许模块中的参数 发生改变 。 用来进行仿真的命令有四个: 使用 set_param 命令:开始、停止或者继续仿真或者更新模 块的方框图。 get_param 命令来检查一个仿真的状态。

?
?

使用 sim 命令:启动仿真命令;
使用 simset 命令:用来向 sim 命令产生或者编辑仿真参数 和积分法属性的命令; 使用 simget 命令:可以得到选项结构体属性和参数。

?

2013-8-10

245

SIMULINK模型窗的组成

L

工具条:最左边9个图标实现标准的Windows操作。其余图标含义如下: 打开库浏览器 模型浏览器单双 窗外形切换 展现当前系统的父系统 打开调试器 仿真的启动或继续 暂停(在仿真执行过程中出现) 结束仿真 显示库连接 观察封装子系统

2013-8-10

246

如何调用MATLAB工作空间中的 信号矩阵作为模型输入。本例所 需的输入为

(1)编写一个产生信号矩阵的M函数文件

? t2 ? u (t ) ? ?(2T ? t ) 2 ? 0 ?

0?t ?T T ? t ? 2T else

function TU=source82_1(T0,N0,K) t=linspace(0,K*T0,K*N0+1); N=length(t); u1=t(1:(N0+1)).^2; u2=(t((N0+2):(2*N0+1))-2*T0).^2; u3(1:(N-(2*N0+2)+1))=0; u=[u1,u2,u3]; TU=[t',u'];

2013-8-10

247

(2)构造简单的接收信号用的实验模型

2013-8-10

248

(3)模块的参数设置 双击S82_1,在对话框中的Data中填写TU (4)在指令窗中,运行以下指令,在MATLAB 工作空间中产生TU信号矩阵。 TU=source82_1(1,100,4); (5)选中模型窗菜单【Simulation:Start】,示波 器呈现图右图信号。

2013-8-10

249

Sources 库 Band-Limited White Noise(限带白噪声) Chirp Signal(扫频信号) Clock(时钟) Constant(常量) Digital Clock(数字时钟) Discrete Pulse Generator(离散脉冲生成器) From Workspace(从工作空间读取数据) From File(从文件读数据) Pulse Generator(脉冲生成器) Ramp(倾斜) Random Number(随机数产生器) Repeating Sequence(重复序列)
2013-8-10 250

Sources 库(续)
Signal Generator(信号发生 器) Sine Wave(正弦波)

Step(阶跃)
Uniform Random Number(均匀分布随机数)

2013-8-10

251

Sinks 库
Display(显示) Scope(示波器) Stop Simulation(停止仿真) To File(写入文件) To Workspace(写到工作空间) XY Graph(显示平面图形)

2013-8-10

252

Discrete 库
Discrete Filter(离散滤波器) Discrete State Space(离散状态空间) Discrete-Time Integrator(离散时间积分器) Discrete Transfer Fcn(离散传递函数) Discrete Zero-Pole(数字零极点函数) First-Order Hold(一阶保持) Zero-Order Hold(零阶保持) Unit Delay(单位延迟)

2013-8-10

253

Continuous 库
Derivative(导数) Integrator(积分器) Memory(记忆) State Space(状态空间) Transfer Fcn(传递函数) Transport Delay(传递延迟) Variable Transport Delay(可变传输延迟) Zero-Pole(零-极点)

2013-8-10

254

Math 库
Abs(绝对值) Algebraic Constraint

Combinatorial Logic(组合逻辑) Complex to Magnitude-Angle Complex to Real-Image Dot Product(点乘) Gain(增益) Logical Operator(逻辑运算) Magnitude--Angle to Complex() Math Function(数学函数) Matrix Gain(矩阵增益) MinMax(最大最小值)
2013-8-10 255

Math 库(续)
Product(乘积) Real--Image to Complex Relational Operator(关系运算)

Rounding Function(圆整函数) Sign(符号) Slider Gain(滑块增益) Sum(和) Trigonometric Function(三角函数)

2013-8-10

256

Nonlinear 库
Backlash 模块

Coulomb and Viscous Friction(库仑和粘性摩擦) Dead Zone(死区) Manual Switch(手动开关 ) Multiport Switch(多路转换开关) Quantizer(量化) Rate Limiter(限速器) Relay(继电器) Saturation(饱和) Switch(选择开关)
2013-8-10 257

Signals & Systems 库
Bus Selector(总线选择器) Configurable Subsystem(可配置子系统) Data Store Memory(数据存储器)

Data Store Read(读数据存储) Data Store Write(写数据存储) Data Type Conversion(数据类型转换) Demux(解混) Enable(激活) From(导入) Goto(传出 ) Goto Tag Visibility(传出标记符的可见性) Ground(接地) Hit Crossing(捕获穿越点)
2013-8-10 258

Signals & Systems 库(续)
IC(初始状态) Inport(输入端口) Merge(合并)

Model Info (模型信息) Mux (混合) Outport(输出端口) Probe (探测器) Selector(选择器) Subsystem(子系统) Terminator(终结器) Trigger(触发器) Width(宽度) Function-Call Generator(函数调用发生器)
2013-8-10 259

Functions & Tables 库
Fcn(函数表达式 ) Look-Up Table(查找表 ) Look-Up Table (2-D)(二维查找表 ) MATLAB Fcn (MATLAB 函数 ) S-Function( S 函数 )

2013-8-10

260

第五章 Matlab 在电路中的应用
具体应用的一般步骤:
1、分析及建模

2、编程
3、调试及运行 4、数据分析

2013-8-10

261

5.1 电阻电路的计算
1、分析及建模
用基尔霍夫定理列方 程组

图5.1 例5.1的电路图

( R1 ? R2 ? R3 )ia ? R3ib ? us ? R3ia ? ( R3 ? R4 ? R5 )ib ? R5ic ? 0 ? R5ib ? ( R5 ? R6 ? R7 )ic ? 0
2013-8-10 262

把方程组写成矩阵形式为
? R1 ? R2 ? R3 ? ? ? R3 ? 0 ? ? R3 R3 ? R4 ? R5 ? R5 ? ?ia ? ?1 ? ?? ? ? ? ? R5 ? ?ib ? ? ?0?us R5 ? R6 ? R7 ? ?ic ? ?0? ?? ? ? ? 0

2013-8-10

263

直接列数字方程,简写为 AI ? B?s
? 2 ? 4 ? 12 ? ? 12 ? ? 0 ? ? 12 12 ? 4 ? 12 ? 12 ? ?ia ? ?1 ? ? ?i ? ? ? 0 ? u ? 12 ?? b? ? ? s 12 ? 4 ? 2 ? ?ic ? ?0 ? ?? ? ? ? 0

2013-8-10

264

2013-8-10

265

2013-8-10

266

说明:
?

?

?

关键问题是:正确的列出三个网孔方程,然后 以这三个方程为中心求解。 将三个方程的系数写成矩阵形式,利用《线性 代数》中所学的矩阵的知识来求解,其实是为 了方便后面利用MATLAB软件来进行计算。 运用MATLAB计算出来的结果和理论分析计 算出来的结果进行比较,理论上应该是相同的。

2013-8-10

267

?

2、编程

%第五章例5.1程序q501 clear,format compact R1=2;R2=4;R3=12;R4=4;R5=12;R6=4;R7=2; %为 给定元件赋值% 解问题(1) a11=R1+R2+R3;a12=-R3;a13=0; %将系数矩阵各 元素赋值 a21=-R3;a22=R3+R4+R5; a23=-R5; a31=0;a32=-R5;a33=R5+R6+R7; b1=1;b2=0;b3=0;

2013-8-10

268

us=input('us='); % 输入解(1)的已知条件 A=[a11,a12,a13;a21,a22,a23;a31,a32,a33] % 列出系数 矩阵A B=[b1;0;0]; I=A\B*us; % I=[ia;ib;ic] ia=I(1);ib=I(2);ic=I(3); i3=ia-ib,u4=R4*ib,u7=R7*ic % 解出所需变量 u42=input('给定u42= '); % 利用电路的线性性质及问题 (1)的解 k1=i3/us;k2=u4/us;k3=u7/us; % 由问题(1)得出待求 量与us的比例系数 us2=u42/k2,i32=k1/k2*u42,u72=k3/k2*u42 % 按比例方 法求出所需变量

2013-8-10

269

3、调试及运行

2013-8-10

270

4、数据分析

(1)运行结果与实际情况是否吻合 (2)算法中参数对于结果的影响情况 (3)算法与其它算法的性能比较

2013-8-10

271

附:Simulink进行建模仿真
1、仿真元件的选取 (1)电阻的选择 由于设计电路中必须要有两个电阻 R1,R2。所以我添加两个电阻R1,R2,来加入 路中,并将电容值设为0,电感值设为inf,由 此来设置出电阻的阻值。 如图所示:
?

2013-8-10

272

(2)电压源的选择 由于设计电路中必须有一个电压源,所 以在元件库内添加一个电压源。添加电压源后, 将电压源的相位调为90度,频率调为0HZ。这 样就将交流电压源变成了直流电压源。如图所 示:

2013-8-10

273

(3)电流表,电压表的选择 由于电路结果测量需要,电流表和电压表 来测量。所以添加电压表和电流表到文件内, 把电流表串联到指定的位置,将电压表并联到 指定的位置。就可以完成电路的测量。 如图所示:

2013-8-10

274

2 Simulink电路模型 打开MATLAB软件,在Simulink中构建的 电路图如下图所示:

2013-8-10

275

3 Simulink电路图的仿真结果 在软件中可以修改元器件的参数值。当对所 选题目的第一问的仿真中,将Us的大小改为 10V,单击“开始仿真”按钮,出现的仿真结 果如图所示。 图中显示元件显示的仿真结果为: U4=2.222V,i3=0.374A,U7=0.7407V。

2013-8-10

276

2013-8-10

277

当对选题目的第二问的仿真中,将U4的大小改 为6V,单击“开始仿真“按钮,出现的仿真 结果如图所示。图中显示元件显示的仿真结果 为:Us=27V,i3=1A,U7=2V。

2013-8-10

278

?
?

5.2动态电路 二阶过阻尼电路的零输入响应如下图所示,其零输入响应有过阻 尼、临界阻尼和欠阻尼三种情况,本例讨论过阻尼情况。已知

L ? 0.5H , C ? 0.02F , R ? 12.5?,

初始值u c (0) ? 1V , iL (0) ? 0, 求t ? 0时的u c (t )和iL (t )
的零输入响应,并画出波形。 解: uc 的微分方程为

d 2uc (t ) R duc (t ) 1 ? ? uc (t ) ? 0 2 dt L dt LC
令衰减常数

??
2013-8-10

R , 谐振角频率?n ? 2L

1 LC
279

则上式可写为二阶微分方程的典型形式 2 其初始值为

对微分方程做拉普拉斯变换,考虑到初始条件,可得

d uc duc 2 ? 2? ? ? n uc ? 0 dt 2 dt du c i L ( 0) uc (0), t ?0 ? dt C

du c (0 ? ) 2 s U c ( s) ? suc (0) ? ? 2? [ sU c ( s) ? uc c(0 ? )] ? ?n U c ( s) ? 0 dt 整理后得 suc (0 ? ) ? 2?uc (0 ? ) ? iL (0 ? ) / C U c (s) ? 2 s 2 ? 2?s ?? n
2

对上式求拉普拉斯反变换,就可得到时域函数。为此可等 式右端的多项式分解为部分分式

r1 r2 U c ( s) ? ? s ? p1 s ? p2
2013-8-10 280

?

其中,p1,p2是多项式分式的极点,而r1,r2是它们对应的 留数。便有

uc (t ) ? r e p1t ? r2e p2t 1
p1,p2,r1,r2可以用代数方法求出,在MATLAB中有residue 函数,专门用来求多项式分式的极点和留数,其 格式为: [r,p,k]=residue(num,den)。 其中,num,den分别为分子和分母多项式的系数组成的数 组。进而可得 u=r(1)*exp(p(1)*t)+ r(2)*exp(p(2)*t)

2013-8-10

281

?
? ? ? ? ? ?

?
? ?

?
? ? ? ?

MATLAB程序如下(用拉普拉斯变换及留数法) L=0.5;R=12.5;C=0.02; %输入元件参数 uc0=1;iL0=0; dt=0.01;t=0:dt:1; %设定时间组 num=[uc0,R/L*uc0+iL0/C]; %uc(s)的分子系数多项式 den=[1,R/L,1/L/C]; %uc(s)的分母系数多项式 [r,p,k]=residue(num,den); %求极点留数 %求时域函数ucn,对ucn求导得到电流iLn ucn=r(1)*exp(p(1)*t)+r(2)*exp(p(2)*t); iLn=C*diff(ucn)/dt; %绘曲线,注意求导后数据长度减少一个 subplot(2,1,1), plot(t,ucn),grid subplot(2,1,2) plot(t(1:end-1),iLn),grid
2013-8-10 282

?

程序运行结果:

2013-8-10

283

? ?

5.3正弦稳态电路 如图所示,已知R=5欧,wL=3欧,1/Wc=2欧,UC=10∠30°V, 求Ir,Ic,I,UL,Us,并画出其相量图。(注:在MATLAB程序中, 变量都看做复数,并且不能在变量上方加点)

解:建模 设Z1=jwL, Z2=R, Z3=1/jWc R,C并联后的阻抗为 Z23=Z3Z2/(Z2+Z3) 总阻抗为Z=Z1+Z23

2013-8-10

284

?
?
? ?

MATLAB程序如下:
z1=3*j;z2=5;z3=-2j;uc=10*exp(30j*pi/180); %输入参数 z23=z2*z3/(z2+z3);z=z1+z23; %交流电路方程 Ir=uc/z2,Ic=uc/z3,I=Ic+Ir;uL=I*z1;us=I*z disp('uc Ir Ic I uL us') disp('幅值'),disp(abs([uc,Ir,Ic,I,uL,us])) disp('相角'),disp(angle([uc,Ir,Ic,I,uL,us])*180/pi) %compass是MATLAB中绘制复数相量图的命令 ha=compass([uc,Ir,Ic,I,uL,us]) set(ha,'linewidth',3) %设置线宽
2013-8-10 285

?
? ? ? ? ? ? ?

?

程序运行结果:

2013-8-10

286

?
? ? ?

Ir =1.7321 + 1.0000i Ic = -2.5000 + 4.3301i us = -7.3301 + 2.6962i
I 5.3852 uL 16.1555 us 7.8102

uc Ir Ic 幅值10.0000 2.0000 5.0000
?

相角 30.0000 30.0000 120.0000 98.1986 –171.8014 159.8056

2013-8-10

287

? ?

5.4频率响应 & 如下图所示是一阶RC低通电路,若以 uc为响应,求频率响 H 应函数,画出其频响曲线(幅频特性) ( j? ) 和相频的响应 (相频特性) ? (? ) 解:建模

1 ?j & Uc 1 ?c ? 1 ? H ( j? ) ? ? & U s R ? j 1 1 ? j?c 1 ? j ? ?c ?c

由图,由分压公式可求得频率 响应函数

式中 设 ?c

& uc
?

为截止角频率。 1 画出幅频及相频的响应。

RC

?
2013-8-10

w?

? ? 0, 0.2, 0.4, L , 4, ?c
288

? ? ? ? ? ? ? ? ? ?

MATLAB程序如下: ww=0:0.2:4;%设定频率数组ww=w/wc H=1./(1+j*ww);%求复频率响应 figure(1) subplot(2,1,1),plot(ww,abs(H)),%绘制幅频特性 grid,xlabel('ww'),ylabel('abs(H)') subplot(2,1,2),semilogx(ww,angle(H))%绘制相频特性 grid,xlabel ('ww'),ylabel('angle(H)') figure(2) %绘制对数频率特性 subplot(2,1,1),semilogx(ww,20*log10(abs(H)))%纵坐标

为分贝
?
? ?

grid,xlabel ('ww'),ylabel('分贝') subplot(2,1,2),semilogx(ww,angle(H))%绘制相频特性 grid,xlabel ('ww'),ylabel('angle(H)')
289

2013-8-10

?

程序运行结果:

2013-8-10

290

2013-8-10

291

5.3

2013-8-10

292

5.3
1.4 16

1.2

14

1

12

0.8 10 0.6 8 0.4 6 0.2 4 0 1 2 3 4 5 6 7 8 9 10

0

0

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

1.8

2

2013-8-10

293

5.4
20 20 10 0 15 -10 -20 -5

10

0

5

10

15

20

3 5 2 1 0 0 -1 -5 0 5 10 15 20 25

-5

0

5

10

15

20

2013-8-10

294

5.5

4 uc uctr ucst

3

2

1

0

-1

-2

0

1

2

3

4

5

6

7

8

9

10

2013-8-10

295

5.6
1 0.8 0.6 0.4 0.2 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1 0.8 0.6 0.4 0.2 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

0 -0.02 -0.04 -0.06 -0.08

0 -0.02 -0.04 -0.06 -0.08

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

2013-8-10

296

5.7
1 0.8 0.1 0.6 0.4 0.2 0 -0.05 -0.2 -0.1 -0.4 -0.6 -0.8 -0.15 0.05 0.15

0

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

-0.2

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

2013-8-10

297

5.7
1 0.8 0.1 0.6 0.4 0.2 0 -0.05 -0.2 -0.1 -0.4 -0.6 -0.8 -0.15 0.05 0.15

0

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

-0.2

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

2013-8-10

298

5.8

2013-8-10

299

5.8
90 120 15 150 10 5 30 20 60

180

0

210

330

240 270

300

2013-8-10

300

5.14
1 0.8 0

abs(H)

-5

分贝
-10 0 0.5 1 1.5 2 wo 2.5 3 3.5 4 -15 wo 0

0.6 0.4 0.2

10

0

0

angle(H)

-1

angle(H)
0 0.5 1 1.5 2 wo 2.5 3 3.5 4

-0.5

-0.5

-1

-1.5

-1.5 wo

10

0

2013-8-10

301

5.15
20 4 3 0

abs(H)

分贝
0 0.5 1 1.5 2 2.5 w 3 3.5 4 4.5 5

2 1

-20 -40 -60 -1 10
0 1

10 w

10

0

angle(H)

-1

-1

angle(H)
0 0.5 1 1.5 2 2.5 w 3 3.5 4 4.5 5

-2 -3

-2

-3

-4 -1 10

10 w

0

10

1

2013-8-10

302

5.16
1 0

abs(H)

-20

分贝
-40 0 1 2 3 4 5 w 6 7 8 9 10 -60 -1 10

0.5

0

10 w

0

10

1

2 1

2 1

angle(H)

0 -1 -2

angle(H)
0 1 2 3 4 5 w 6 7 8 9 10

0 -1 -2 -1 10
0 1

10 w

10

2013-8-10

303

5.17
10
4

10 100 50 0 -50 -100

6

10

6

2013-8-10

304

5.20
2 1.5 1 0.5 0 1 0.5 0 -0.5 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 -1

0

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

1.8

2

0

1 0.5 0

-2

-4 -0.5 -6 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 -1

0

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

1.8

2

2013-8-10

305

2 1.5 1 0.5 0

0

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

1.8

2

0.2

0.1

0

-0.1

0

0.2

0.4

0.6

0.8

1

1.2

1.4

1.6

1.8

2

2013-8-10

306


赞助商链接