在Simulink中用matlab ode23ss算法仿真得到的波形进行一维小波分解原波形发生变化

赞助商链接
当前位置: >>
matlab通信仿真指导书
Matlab通信仿真指导书? 第一章 MATLAB介绍? ? ? ? 第一节 使用MATLAB窗口环境 第二节 MATLAB矩阵运算及多项式处理 第三节 绘图简介 第四节 MATLAB程序设计入门 ? 第二章 SIMULINK仿真基础? ? ? ? ? ? ? 第一节 第二节 第三节 第四节 第五节 第六节 第七节 SIMULINK简介 SIMULINK功能模块的处理 SIMULINK线的处理 SIMULINK自定义功能模块 SIMULINK仿真的运行 SIMULINK s-function的设计 SIMULINK仿真举例 ? 第三章 练习部分 ? 第四章 设计题? ? 自己找一个仿真模拟并于matlab相结合? 第五章 实验报告要求和格式 第一章 MATLAB介绍? 第一节 使用MATLAB的窗口环境 ? 1.1 MATLAB 语言的显著特点 ? 1、具有强大的矩阵运算能力:Matrix Laboratory (矩阵实验室),使得矩阵 运算非常简单。 ? 2、是一种演算式语言 MATLAB 的基本数据单元 是既不需要指定维数,也不需要说明数据类型的 矩阵(向量和标量为矩阵的特例),而且数学表 达式和运算规则与通常的习惯相 同。 因此 MATLAB 语言编程简单,使用方便。 ? 例 exp2_1.m clc %清屏 clear %从内存中清除变量和函数 more on echo on %求矩阵与矩阵的乘积,矩阵与向量的乘积 A=[5 6 7;9 4 6;4 3 6] B=[3 4 5;5 7 9;7 3 1] X=[5 7 8]' C=A*B Y=A*X more off echo off 1.2MATLAB 命令窗口? 1.2.1 启动 MATLAB 命令窗口 计算机安装好 MATLAB 之后,双击 MATLAB 图标,就可以进 入命令窗口, 此时意味着系统处于准备接受命令 的状态,可以在命令窗口中直接输入命令语 句。 MATLAB 语句形式 》变量=表达式; 通过等于 符号将表达式的值赋予变量。当键入回车键时, 该语句被执行。 语句执行之后,窗口自动显示出 语句执行的结果。如果希望结果不被显示,则只 要在语句之后加上一个分号(;)即可。此时尽 管结果没有显示,但它依然被赋 值并在 MATLAB 工作空间中分配了内存。 1.2.2 命令行编辑器( 1)方向键和控制键可以编辑修改已输入的命令 : ↑回调上一行命令↓回调下一行命令 ( 2)命令窗口的分页输出 :more off:不允许分 页 more on:允许分页 more(n):指定每页输出 的行数 回车前进一行(more(3),more (4)),空格键显示下一页,q 结束当前显示。 ( 3)多行命令(?) 如果命令语句超过一行或者 太长希望分行输入,则可使用多行命令继续输 入。 S=1-12+13+4+? 9-4-18; (shift+回车) 1.31.3.1 变量变量和数值显示格式( 1)变量的命名:变量的名字必须以字母开头(不能超过 19 个字 符),之 后可以是任意字母、数字或下划线;变量名称区分字母的大 小写;变量中不能包 含有标点符号。( 2)一些特殊的变量 ans:用于结果的缺省变量名 i、j:虚数单位 (2+3i i=j=sqrt(-1)) pi:圆周率 nargin:函数的输入变量个数 eps:计算机的最小数 nargout:函数的输出变量个数 inf:无穷大 realmin:最小正实数 realmax:最大正实数 flops:浮点运算数 nan: 不定量(3)变量操作 在命令窗口中,同时存储着输入的命令和创建的所有变 量值,它们可以在任 何需要的时候被调用。如要察看变量 a 的值, 只需要在命令窗口中输入变量的名 称即可:》a 1.3.2 数值显示格式任何 MATLAB 的语句的执行结果都可以在屏幕上显示,同时赋值 给指定的 变量,没有指定变量时,赋值给一个特殊的变量 ans,数据 的显示格式由 format 命令控制。 format 只是影响结果的显示,不影 响其计算与存储;MATLAB 总是以双字长 浮点数(双精度)来执行 所有的运算。 如果结果为整数(a=16),则显示没有小数;如果结 果不是整数,则输出形式有: format (short):短格式(小数点后四位有效)aa=-0.7510 format long:长格式(小数点后15 位有效) aa=-99.0 format short e:5位科学记数表示 aa=-7. format long e:15位科学记数表示 aa=-7.762e-001 format bank: (金融)元角分表示 aa=0.75 format hex:十六进制格式 aa=bfee27 fromat +:正负零分别用“+”“-”“空格”表示 aa=+ format rat:分数表示 aa= 1.4简单的数学运算? 1.4.1 常用的数学运算符 +,―,*(乘), /(左除),\(右除),^(幂) 在运算式 中,MATLAB 通常不需要考虑空格;多条 命令可以放在一行中, 它们之间需要用分 号隔开;逗号告诉 MATLAB 显示结果,而 分号则禁止结果显 示。 1.4.2 常用数学函数 abs,sin,cos,tan,asin,acos,atan,sqrt,exp,imag(复数实部),real(复数虚部),sign(函数符号,符号函数), log,log10,conj(共扼复数)等。例 exp2_2.m clc clear more on echo on %为便于理解,在程序等执行过程中显示程序的表达式 a=16;b=12; c=3; d=4; e=a+b-c*d f=e/2 k=e\2 h=c^3 g=e+f+ ... 2+1-9 aa=sin(g) abs(aa) bb=2+3j cc=conj(bb) rbb=real(bb) log(rbb) sqrt(rbb) exp(rbb) echo off more off 1.5MATLAB 的工作空间1.5.1 MATLAB 的工作空间 包含了一组可以在命令窗口中调整(调用) 的参数 who:显示当前工作空间中所有变量的一个 简单列表 whos:则列出变量的大小、数据格式等详细 信息 clear :清除工作空间中所有的变量 clear 变量名:清除指定的变量 命令窗口中调整(调用)的参数 1.5.2 保存和载入 workspace( 1)save filename variables 将变量列表 variables 所列出的变量保存 到磁盘文件 filename 中 Variables 所表示的变量列表中,不能用逗号,各个不同的变量之间只能 用空 格来分隔。 未列出 variables 时,表示将当前工作空间中所有变量都保持到磁盘文件 中。 缺省的磁盘文件扩展名为“.mat”,可以使用“-”定义不同的存储 格式(ASCII、 V4 等) ( 2)load filename variables 将以前用 save 命令保存的变量 variables 从磁盘文件中调入 MATLAB 工作空 间。 用 load 命令调入的变量,其名称为用 save 命令保存时的名称,取值也 一样。 Variables 所表示的变量列表中,不能用逗号,各个不同的变 量之间只能用空 格来分隔。 未列出 variables 时,表示将磁盘文件中的所有变量都调入工作空间。 1.5.3 退出工作空间用quit 或 exit命令。 1.6文件管理文件管理的命令,包括列文件名、显示或删除文件、 显示或改变当前目录等。 (what、dir、type、delete、cd、 which) what:显示当前目录下所有与 matlab 相关的文件及它们的 路径。 dir:显示当前目录下所有的文件 which:显示某个文件的路径 cd path:由当前目录进入 path 目录 cd ..:返回上一级目录 cd:显示当前目录 type filename:在命令窗口中显示文件 filename(type exp2matlab.mat) delete filename:删除文件 filename 1.7使用帮助? 1.7.1 help 命令,在命令窗口中显示 MATLBA 的所有函数都是以逻辑群组方式进行组织的,而 MATLAB 的 目录 结构就是以这些群组方式来编排的。 help matfun :矩阵函数-数值线性代数 help general:通用命令 help graphics:通用图形函数 help elfun:基本的数学函数 help elmat:基本矩阵和矩阵操作 help datafun:数据分析和傅立叶变换函数 help ops:操作符和特殊字符 help polyfun:多项式和内插函数 help lang:语言结构和调试 help strfun:字符串函数 help control:控制系统工具箱函数 ? 1.7.2 helpwin:帮助窗口 ? 1.7.3 helpdesk:帮助桌面,浏览器模式 ? 1.7.4 lookfor 命令:返回包含指定关键词的那些项(关键词搜索) 例: lookfor integral:查找包含积分的这个关键词的所有指令? 1.7.5 demo:打开示例窗口 第二节MATLAB矩阵运算及多项 式处理? 2.1 矩阵的输入 ? 2.1.1 在命令窗口中输入 》a=1; b=2; c=3; 》x=[5 a*b a+c c/b] x= 5.000 2.000 3.000 2.000 4.000 1.500 》y=[2 4 5; 3 6 8] y= 2 4 5 368矩阵生成不但可以使用纯数字(含复数),也可以使用变量(或 者说采用一 个表达式)。矩阵的元素直接排列在方括号内,行与行之 间用分号隔开,每行内 的元素使用空格或逗号隔开。大的矩阵可用分 行输入,shift+回车键代表分号。 2.1.2 语句生成( 1)用线性等间距生成向量矩阵(start:step:end) 》a=[1:2:10] (1 1+2 1+2*2 1+2*3 1+2*4) a= 1 3 5 7 9 其中 start 为起始值,step 为步长,end 为终止值。 当步长为 1 时可省略 step 参数;另外 step 也可以取负数。 (2)a=linspace(n1,n2,n) 在线性空间上,行矢量的值从 n1 到 n2,数据个数为 n,缺省 n 为 100。 》a=linspace(1,10,10) a= 1 2 3 4 5 6 7 8 9 10 (3)a=logspace(n1,n2,n) 在对数空间上, 行矢量的值从 10n1 到 10n2,数据个数为 n, 缺省 n 为 50。 这个指令为建立对数频域轴 坐标提供了方便。 》a=logspace(1,3,3) a= 10 100 1000 ( 4)一些常用的特殊矩阵 单位矩阵:eye(m,n); eye(m) 零矩阵:zeros(m,n); zeros(m) 一矩阵:ones(m,n); ones(m) 对角矩阵:对角元素向量 V=[a1,a2,?,an] A=diag(V) 随机矩阵:rand(m,n)产生一个 m×n 的均匀分别的随机矩阵》eye(2,3) ans= 1 0 0 010 》zeros(2,3) ans= 0 0 0 000 》ones(2,3) ans= 1 1 1 111 》V=[5 7 2]; A=diag(V) A= 5 0 0 070 002 》eye(2) ans= 1 0 01 》zeros(2) ans= 0 0 00 》ones(2) ans= 1 1 11如果已知 A 为方阵,则 V=diag(A)可以提取 A 的对角元素构成向量 V。 2.2矩阵的运算转置对于实矩阵用(‘)符号或(.?)求转置结果是一样的;然而对 于含复数的矩 阵,则(‘)将同时对复数进行共轭处理,而 (.?)则 只是将其排列形式进行转 置。 》a=[1 2 3;4 5 6].? (方括号内(;)表示2行3列;空格表示1行6列) a =1 4 25 36 》b=[1+2i 2-7i]' b = 1.0000 - 2.0 + 7.0000i 》b=[1+2i 2-7i].' b = 1.0000 + 2.0 - 7.0000i 2.2.1 四则运算与幂运算1.只有维数相同的矩阵才能进行加减运算。 2.只有当两个矩阵中前一个矩阵的列数和后 一个矩阵的行数相同时,才可 以进行乘法 运算。a\b 运算等效于求 a*x=b 的解;而 a/b 等效于求 x*b=a 的解。只有方阵才可以 求幂。 3.点运算是两个维数相同矩阵对应元素之间 的运算,在有的教材中也定义为数 组运算。 ? ? ? ? ? ? ? ? ? ? ? ? ? ?+ ;- ;* ;\和/ ;^;.* ;.\ ;./;.^ 如:a=[1 2;3 4];b=[ 3 5; 5 9] 》c=a+b d=a-b 》c= d= 4 7 -2 -3 8 13 -2 -5 》a*b=[13 23; 29 51] 》a/b=[-0.50 0.50;3.50 -1.50] 》a\b=[-1 -1;2 3] 》a^3=[37 54; 81 118] 》a.*b=[3 10;15 36] 》a./b=[0.33 0.40;0.60 0.44] 》a.\b=[3.00 2.50;1.67 2.25] 》a.^3= [1 8; 27 64]7 283 2.2.2 逆矩阵与行列式计算求逆:inv(A); 求行列式:det(A) 要求矩阵必须为方阵 》a=[1 2 3;4 5 6;2 3 5]; 》b=inv(a) b=-2.3 1.7 0.0 -0.3 1.0000 》det(a) ans=-3 2.2.3 了解矩阵超越函数在 MATLAB 中 exp、sqrt 等命令也可以作用到矩阵上,但这种运算是定 义在 矩阵的单个元素上的,即分别对矩阵的每一个元素进行计算。 超越数学 函数可以在函数后加上 m 而成为矩阵的超越函数,例如: expm,sqrtm。矩 阵的超越函数要求运算矩阵为方阵。 例:sqrtm(A)计算矩阵的平方根 2.3 矩阵的操作? 2.3.1 矩阵下标 MATLAB 通过确认矩阵下标,可以对矩阵进行插入子块,提取子 块和重排 子块的操作。 A(m,n):提取第 m 行,第 n 列元素 A(:,n):提取第 n 列元素 A(m,:):提取第 m 行元素 A(m1:m2,n1:n2):提取第 m1 行到第 m2 行和第 n1 列到第 n2 列的所 有元素(提 取子块)。 A(:):得到一个长列矢量,该矢量的元素按矩 阵的列进行排列。 矩阵扩展:如果在原矩阵中一个不存在的地址位置上设定一个数(赋 值), 则该矩阵会自动扩展行列数,并在该位置上添加这个数,而且 在其他没有指定的 位置补零。 消除子块:如果将矩阵的子块赋值为 空矩阵[ ],则相当于消除了相应的矩阵 子块。 ? 提取n列和m行元素 ? 得到一个长列矢量 ? 消除字块 ? 扩展行列数 ? 扩展行列数 2.3.2 矩阵的大小[m,n]=size(A,x):返回矩阵的行列数 m 与n,当 x=1,则只返回行数 m,当 x=2,则只返回列数 n。 length(A)=max(size(A)):返回行数或列数的最大值。 rank(A):求矩阵的秩》a=[1 2 3;3 4 5]; 》[m,n]=size(a) m=2 n=3 》length(a) ans = 3 》max(size(a)) ans = 3 》rank(a) ans = 2 2.3.3 了解矩阵操作函数:flipud; fliplr;rot90? 矩阵上下翻转,矩阵左右翻转,逆时针90度 2.4多项式处理? 2.4.1 多项式的建立与表示方法 在 MATLAB 中,多项式使用降幂系数的行向量表示, 如:多项式 表示为:p=[1 -12 0 25 116],即:x^412*x^3+0*x^2+25*x+116。使用函数 roots 可以求出多项 式等于 0 的根,根 用列向量表示。若已知多项式等于 0 的根,函数 poly 可以求出相应多项式。 r=roots(p) r = 11.8 -1.2251 + 1.4672i -1.2251 - 1.4672i p=poly(r) p = 1.0 -0.0 116.0000 2.4.2 多项式的运算相乘 conv a=[1 2 3] ; b=[1 2] c=conv(a,b)=1 4 7 6 conv 指令可以嵌套使用, 如 conv(conv(a,b),c) 相除 deconv [q,r]=deconv(c,b) q=1 2 3 %商多项式 r=0 0 0 %余多项式( s 2 ? 2)(s ? 4)(s ? 1) s3 ? s ? 1{a=x^2+2*x+3?;b=x+2}P1=conv([1 0 2],conve([1 4],[1 1])); P2=[1 0 1 1]; [q,r]=deconv(P1,P2) 求多项式的微分多项式 polyder polyder(a)=2 2 da/dx=(x^2)?+(2*x)?+(3)?=2x+2+0 求多项式函数值 polyval(p,n):将值 n 代入多项式求解。polyval(a,2)=11 2.4.3 多项式的拟合? 多项式拟合又称为曲线拟合,其目的就是在众多的样本点中进行拟合,找出 满足样本点分布的多项式。这在分析实验数据,将实验数据做解析描述时非 常有 用。 命令格式:p=polyfit(x,y,n),其中 x 和 y 为样本点向量,n 为所求 多项式的阶 数,p 为求出的多项式。 ? 例 exp2_15.m %curve fitting of sin wave clc clear x=0:0.1:2* %生成样本点 x y=sin(x)+0.5*rand(size(x)); %生成样本点 y,通过矩阵大小生成正弦曲线的随机 均匀分布矩阵 p=polyfit(x,y,3) %拟合出多项式(3 阶) y1=polyval(p,x); %求多项式关于x的值 plot(x,y,?+?) plot(x,y1,?-r?) plot(x,y,'+',x,y1,'-r') %绘制多项式曲线,以验证结果 原有的x,y曲线图 ? 拟合后的曲线图 ? 原有曲线图和拟合后的曲线图的绘图比较 2.4.4 多项式插值? 多项式插值是指根据给定的有限个样本点,产生另外的估 计点以达到数据更 为平滑的效果。(一般是指差异不大 或者比较接近)该技巧在信号处理与图像处理上应用广泛。 ? 所用指令有一维的 interp1、二维的 interp2、三维的 interp3。这些指令分别有 不同的方法(method),设计 者可以根据需要选择适当的方法,以满足系统属性 的要 求。Help polyfun 可以得到更详细的内容。 ? y=interp1(xs,ys,x,'method') 在有限样本点向量 xs 与 ys 中, 插值产生向量 x 和 y,所用方法定义在 method 中,有 4 种选择: nearest:执行速度最快,输出结果为直角转折 linear:默认值,在样本点上斜率变化很大 spline:最花 时间,但输出结果也最平滑 cubic:最占内存,输出结果 与 spline 差不多 ? 例 exp2_16.m %curve interpolation ys=[0 0.9 0.6 1 0 0.1 -0.3 -0.7 -0.9 -0.2]; %已有的样 本点 ys xs=0:length(ys)-1; %已有的样本点 xs x=0:0.1:length(ys)-1;%新的样本点 x y1=interp1(xs,ys,x,'nearest'); %插值产生新的样本点 y1 y2=interp1(xs,ys,x,'linear'); %插值产生新的样本点 y2 y3=interp1(xs,ys,x,'spline'); %插值产生新的样本点 y3 y4=interp1(xs,ys,x,'cubic'); %插值产生新的样本点 y4 plot(xs,ys,?+k?,x,y1,?:r?,x,y2,?-m?,x,y3,?--c?,x,y4,?--b?) %分别绘 制不同方法产生的曲线 legend('sampled point','nearest','linear','spline','cubic') ? 不同方法的明细 2.5? 2.5.1 矩阵分解MATLAB 数据处理( 1)奇异值分解 求矩阵 A 的奇异值及分解矩阵,满足 U*S*V'=A,其中 U、V 矩阵为正交矩 阵(U*U'=I), S 矩阵为对角矩阵,它的对角元素即 A 矩阵的奇异值。 [U,S,V]=svd(A)例:a = [9 8;6 8] 可以验证: u*u'=I v*v'=I u*s*v'=a [u,s,v]=svd(a) u = 0.5 0.5 s = 15. 1.5408 v = 0.1 0.7 ? ( 2)特征值分解 求矩阵 A 的特征向量 V 及特征值 D,满足 A*V=V*D。其中 D 的对 角线元素 为特征值,V 的列为对应的特征 向量。如果 D=eig(A)则只返回特征值。 [V,D]=eig(A) a=[9 8;6 8]; [v,d]=eig(a) v = 0.0 0.3 d = 15. 1.5538 ? ( 3)正交分解 将矩阵 A 做正交化分解,使得 Q*R=A,其中 Q 为正交矩阵(其范数为 1, 指令 norm(Q)=1),R 为对角化的上三角矩阵。 a=[9 8;6 8]; [q,r]=qr(a) q=-0.7 -0.1 r=-10.0 0 2.2188 norm(q) ans=1 q*r ans=9.0 6.0 ? ( 4)三角分解 [L,U]=lu(A)? 将 A 做对角线分解,使得 A=L*U,其中 L 为下三角矩阵,U 为上三角 矩阵。 注意:L 实际上是一个&心理上&的下三角矩阵,它事实上是一 个置换矩阵 P 的逆矩阵与一个真正下三角矩阵 L1(其对角线元素为 1)的乘积。 [L1,U1,P]=lu(A) 例:a=[1 2 3;4 5 6;7 8 9] 比较: [l1,u1,p]=lu(a) [l,u]=lu(a)l1 = 1.00 0 0 l=0.0 0 0.14 1.00 0 0.0 1. 0.50 1.00 1. U1=7.00 8.00 9.00 u=7.0 9..86 1.71 0 0.3 0 0 0.00 0 0 0.0000 P=0 0 1 1 0 0 0 1 0 可知,L实际上是一个心理上的下三角矩阵,它事实上是一个置换矩阵P的逆矩 阵与一个真正意义上的正下三角矩阵L1(其对角线元素为1)的乘积。 2.5.2 数据分析? 1.绘制函数图形:fplot()fplot(fun,lims) fun为要绘制的函数,可以是定义函数的m文件名,也可以是 以x为变量的可计算的字符串;lims=[Xmin Xmax Ymin Ymax]限定x,y轴上的绘图空间 X^2/a^2+y^2/b^2=1 fplot(?[b*sqrt(1-x.^2/a^2),-b*sqrt(1-x.^2/a^2)]?,[-a,a]) a=3 b=4 ? 绘制函数图形(椭圆) ? 2.求极值 fminsearch x=fminsearch(fun,x0) 从x0开始找到函数fun中的局部最小值x,x0可 以是标量,向量,矩阵,fun是函数的句柄 “句柄”包含了函数的路径,函数名,类型 及可能存在的重载,方法:@或者str2fune 命令创建 h_fun=@fun=str2fune(?fun?) ? 3.求零点:寻找一维函数的过零点fzero() 例: %fzero一元函数 y=inline(?sin(t)^2*exp(-a*t)-b*abs(t)?,?t?,?a?,?b?); a=0.1;b=0.5;t=[-10:0.01:10]; y_char=vectorize(y);%将乘转化成点乘 Y=feval(y_char,t,a,b); %调用y_char返回值 clf plot(t,Y,?r?);hold on,plot(t,zeros(size(t)),?k?); xlabel(?t?),ylabel(?y(t)?),hold off zoom on [tt,yy]=ginput(5);%[x,y]=ginput(n),能使你从当前坐标系中读出n个点,并 返回n个点x,y坐标,可以按回车提前结束读数。 zoom off tt [t3,y3,exitflag]=fzero(y,tt(3),[ ],a,b) [t4,y4,exitflag]=fzero(y,tt(4),[ ],a,b)%求tt,t3,t4,exitflag ? 求过零点 ? 4.频谱分析: (fft):y=FFT(x);abs幅度;angle相角;wnwrap相位 按弧度展开大于pi的变换为2*pi的补角 例:对模拟信号在t=0.01n,n=0,1,2…N-1上采样,得到 N点序列,求N=128点信号的FFT. N=128;n=[0:N-1];t=0.01*n; x=2*sin(4*pi*t)+5*cos(16*pi*t); subplot(2,1,1);stem(n,x,?.?);%绘制火柴梗图形 title(?signal x(n)?); G X=fft(x,N); magx=abs(x(1:1:N/2+1));k=[0:1:N/2]; w=2*pi/N*k; subplot(2,1,2);plot(w/pi,magx);%magx=absx title(?FFT N=128?); xlabel(?频率单位:pi?);ylabel(‘|X|?);grid; ? 频谱分析(FFT) ? 5.了解数据分析函数 max min mean(平均值) sun(元素和) prod(元素积)? 6.了解积运算 trap2 quad quad8 2.5.3 常微分方程数值解? [t,Y]=ode45(odefun,tspan,y0) odefun是待解微分方程的句柄(必须为一阶导) tspan常被赋成二元组的向量[t0,tf]起始结束时间 y0一阶微分方程的(nX1)初值列向量 例: function ydot=DyDt(t,y)%M函数文件DyDt.m mu=2; ydot=[y(2);mu*(1-y(1)^2)*y(2)-y(1)]; %解微分方程 tspan[0,30]%时间区间 y0=[1;0]%初值向量应与DyDt.m文件中的y形式一致 [tt,yy]=ode45(@DyDt,tspan,y0); plot(tt,yy(:,1)) Xlabel(?t?),title(?x(t)?) 第三节绘图简介? MATLAB 提供了丰富的绘图功能 help graph2d 可得到所 有画二维图形的命令 help graph3d 可得到所有画三维图 形的命令 下面介绍常用的二维图形命令 ? 1、基本的绘图命令 plot(x1,y1,option1,x2,y2,option2,?) x1,y1 给出的数据分别为 x,y 轴坐标值,option1 为选项参 数,以逐点连折线 的方式绘制 1 个二维图形;同时类似地 绘制第二个二维图形,??等。 这是 plot 命令的完全格式, 在实际应用中可以根据需要进行简化。比如: plot(x,y); plot(x,y,option) 选项参数 option 定义了图形曲线的颜色、 线型及标示符号,它由一对单引号 括起来。 ? 例 exp2_3.m %plot 绘图命令的使用 clc %清屏命令 clear %清除工作空间中所有变量 %定义时间范围 t=[0:pi/20:9*pi]; y1=sin(t); y2=cos(t); plot(t,y1,t,y2) ? 2、选择图像 figure(1);figure(2);?; figure(n) 打开不同的图形窗口,以便绘制 不同的图形。 ? 3、grid on:在所画出的图形坐标中加入栅 格 grid off:除去图形坐标中的栅格 ? 4、hold on:把当前图形保持在屏幕上不变, 同时允许在这个坐标内绘制另 外一个图形。 hold off:使新图覆盖旧的图形 ? 例 exp2_4.m close all clc clear %定义时间范围 t=[0:pi/20:9*pi]; figure(1) %选择图像 plot(t,sin(t),?r:*?) grid on%在所画图形的坐标中加栅格,注意用在plot之后 Grid off%删除栅格 figure(2) plot(t,cos(t)) grid on grid off ? 无栅格的图像2 ? 无栅格的图像1 ? 可以去掉grid off试试无栅格情况 ? 有栅格的图像1 ? 有栅格的图像2 ? 5、设定轴的范围 axis([xmin xmax ymin ymax]) 例 exp2_5.m axis(?equal?):将 x 坐标轴和 y 坐标轴的单位刻 度大小调整为一样。 ? 6、文字标示 text(x,y,?字符串’) 在图形的指定坐标位置(x,y)处,标示 单引号括起来的字符串。 gtext(?字符串’) 利用鼠标在图形的某一位置标示字符串。 title(?字符串’) 在所画图形的最上端显示说明该图形标题 的字符串。 xlabel(?字符串’),ylabel(?字符串’) 设置 x,y 坐标轴的 名称。 输入特殊的文字需要用反斜杠(\)开头。 ? 7、legend('字符串 1','字符串 2',?,'字符串 n') 在屏幕上开启一个小视窗,然后依据绘图命令的先后次序, 用对应的字符串 区分图形上的线。 ? 例 exp2_5_.m %绘制单位圆 clear close all clc %定义时间范围 t=[0:0.01:2*pi]; x=sin(t); y=cos(t); plot(x,y) axis([-1.5 1.5 -1.5 1.5]) %限定 x 轴和 y 轴的显示范围 grid on axis('equal') 可以在这个编程例子中尝试下文字标识的几种命令 ? 8、subplot(mnk):分割图形显示窗口 m:上下分割个数,n:左右分割个数,k:子图编号 ? 9、semilogx:绘制以 x 轴为对数坐标(以 10 为底),y 轴为线性坐 标的半对 数坐标图形。 semilogy:绘制以 y 轴为对数坐标(以 10 为 底),x 轴为线性坐标的 半对数坐标图形。 %功能:半对数坐标图形与线性坐标图形的比较 clear close clc x=0:0.1:1; y=10.^x; subplot(211) semilogy(x,y) title('semilogarithmic scales gragh') grid on subplot(212) plot(x,y) title('linear scales graph') grid on ? 半对数坐标图形与线性坐标图形比较 ? ? ? ? ?10、了解应用型绘图指令:可用于数值统计分析或离散数据处理 bax(x,y);直方图 hist(y,x); 统计频数直方图 stairs(x,y);阶梯型曲线图 stem(x,y );杆图clc clear %绘制对应于每个输入 x 的输出 y 的高度条形图 subplot(221) x=[1 2 3 4 5 6 7 8 9 10];y=[5 6 3 4 8 1 10 3 5 6]; bar(x,y) %绘制 x1 在以 y1 为中心的区间中分布的个数条形图 subplot(222) x1=randn(1,1000);%生成 1000 个各随机数 y1=-3:0.1:3; hist(x1,y1) %绘制 y2 对应于 x2 的梯形图 subplot(223) x2=0:0.1:10; y2=1./(x2.^3-2.*x2+4); stairs(x2,y2) %绘制 y3 对应于 x3 的散点图 subplot(224) x3=0:0.1:10; y3=1./(x2.^3-2.*x2+4); stem(x3,y3) ?应用型绘图效果?补充说明:对于图形的属性编辑可以通过在图形窗口直接进行,但是图形窗 口关闭后结果不会保存 第四节 MATLAB程序设计入门? ? ? ? ? ? ? ? ? 4.1 MATLAB 程序的基本设计原则 1、%后面的内容是程序的注解,要善于运用注解使程序更具可读性。 2、养成在主程序开头用 clear 指令清除变量的习惯,以消除工作空间中其他 变量对程序运行的影响。但注意在子程序中不要用 clear。 3、参数值要集中放在程序的开始部分,以便维护。要充分利用 MATLAB 工 具箱提供的指令来执行所要进行的运算,在语句行之后输入分号使其及中间 结果 不在屏幕上显示,以提高执行速度。 4、input 指令可以用来输入一些临时的数据;而对于大量参数,则通过建立 一个存储参数的子程序,在主程序中用子程序的名称来调用。 5、程序尽量模块化,也就是采用主程序调用子程序的方法,将所有子程序 合并在一起来执行全部的操作。 6、充分利用 Debugger 来进行程序的调试(设置断点、单步执行、连续执 行), 并利用其他工具箱或图形用户界面(GUI)的设计技巧,将设计结果 集成到一起。 7、设置好 MATLAB 的工作路径,以便程序运行。 8、MATLAB 程序的基本组成结构 ? ? ? ? ? ? ? ? ? ?%说明 清除命令:清除 workspace 中的变量和图形(clear,close) 定义变量:包括全局变量的声明及参数值的设定 逐行执行命令:指 MATLAB 提供的运算指令或工具箱提 供的专用命令 ? ? ? 控制循环 包含:for,if then,switch,while 逐行执行命令 ? ? end? 绘图命令:将运算结果绘制出来 当然更复杂程序还需调用子程序,或与 simulink 以及其他 应用程序结合起来。 4.2M 文件的编辑及 MATLAB 工 作路径的设置? 进入 MATLAB 的 Editor/Debugger 窗口来编辑程序 ? 在编辑环境中,文字的不同颜色显示表明文字的不同属性。 绿色:注解;黑色:程序主体;红色:属性值的设定;蓝 色:控制流程。 ? 在运行程序之前,必须设置好 MATLAB 的工作路径,使 得所要运行的程序 及运行程序所需要的其他文件处在当 前目录之下,只有这样,才可以使程序得以 正常运行。 否则可能导致无法读取某些系统文件或数据,从而程序无 法执行。 ? 通过 cd 指令在命令窗口中可以更改、显示当前工作路径。 通过路径浏览器(path browser)也可以进行设置 4.3MATLAB 的程序类型MATLAB 的程序类型有三种,一种是在命令窗口下执 行的脚本 M 文件;另 外一种是可以存取的 M 文件,也即 程序文件;最后一种是函数(function)文件。 ? 4.3.1 脚本 M 文件 在命令窗口中输入并执行,它所用的变量都要在工作 空间中获取,不需要输 入输出参数的调用,退出 MATLAB 后就释放了。 4.3.2 程序文件 以.m 格式进行存取,包含一连串的 MATLAB 指令和 必要的注解。需要在工 作空间中创建并获取变量,也就 是说处理的数据为命令窗口中的数据,没有输入 参数, 也不会返回参数。程序运行时只需在工作空间中键入其名 称即可。 4.3.3 函数文件? 例 myhilb1.m myhilb.m ? 与在命令窗口中输入命令一样,函数接受输入参数,然后执行并输出 结果。 用 help 命令可以显示它的注释说明。 具有标准的基本结构。 (1)函数定义行(关键字 function) function[out1,out2,..]=filename(in1,in2,..) 输入和输出(返回)的参数 个数分别由 nargin 和 nargout 两个 MATLAB 保留 的变量来给出。 ( 2)第一行帮助行,即 H1 行 以(%)开头,作为 lookfor 指令搜 索的行 ? ( 3)函数体说明及有关注解 以(%)开头,用以说明函数的作用及 有关内容 如果不希望显示某段信息,可在它的前面加空行 ? ( 4)函数体语句 函数体内使用的除返回和输入变量这些在 function 语句中直接引用的变量以 外的所有变量都是局部变量,即在该函数返 回之后,这些变量会自动在 MATLAB 的工作空间中清除掉。如果希 望这些中间变量成为在整个程序中都起作用的变 量,则可以将它们设 置为全局变量。 function[A,B]=myhilb(n,m) % MYHILB 生成一个 Hilbert 矩阵 H1行 % [A,B]=myhilb(n,m) % where % n,m are size of the Hilbert matrix,if only one % argument given,then a square matrix is generated % A is the Hilbert matrix % B:if two matrices to be returned,B is assigned to % A'*A %
if nargin==1,m=n;end for i=1:n for j=1:m A(i,j)=1/(i+j-1); end end if (nargout==2),B=A'*A;end B为输出变量,myhilb为函数名,n,m为输入变量内容在线帮助函数代码体 4.4声明子程序(函数程序)变量? 1.子程序与主程序之间的数据是通过参数进行传递的,子程序应用主 程序传递 来的参数进行计算后,将结果返回主程序。 %主程序 exp2_9.m a=input('please input value of a='); b=input('please input value of b='); c=sumhe(a,b) % 在此例中,主程序 exp2_9.m 设定了两个参数 a 和 b 来调用,子程序 sumhe.m(为一个函数文件),所以执行主程序时,子程序就会调用主 程序传递过来的a 和 b 值进行计算,再将结果返回主程序。 %子程序 sumhe.m function result=sumhe(a,b) sumhe(a,b) %sum the serial of numbers from a tob result=sum(a:b); a=1,b=2,c=0 3 ? 2.如果一个函数内的变量没有特别声明,那么这个变量只在函数内部 使用, 即为局部变量。如果两个或多个函数共用一个变量(或者说在 子程序中也要用到 主程序中的变量,注意不是参数),那么可以用 global 来将它声明为全局变量。 %主程序 exp2_10.m global a %声明变量 a 为全局变量 global b x=1:100; b=sum(x); a=3; c=prods(x) %调用子程序 prods.m %子程序 prods.m function result=prods(x) global a %声明与主程序一样的全局变量,以便在子程序中可以使用主程 序中定义的变量global b result=a*sum(x);ans=15150 4.5 字符串及其宏命令? 字符串要用单引号并用括号括在里面。如: ? 》disp(?text string?) %disp 字符串显示命令 text string 在单引号里 边的字符串可以作为矢量或矩阵的元素。使用 disp 命令或输入变 量 名就可以显示它们表示的字符串。如: ? 》a=[?this is a?;?text string?] (元素 1 含 9 个字符,包括空格;元素 2 含有 11 个字符;因此只要在元 素 1 中加入 2 个空格即可解决问题) ? 必须保证两字符串包含字符个数相等 》aa=['this is a aa = this is a text string 》disp(aa) this is a text string ';'text string'] ? 宏是 MATLAB 语言用在常用命令部分的缩写。它 可以被存储用于建立 M 文 件的一部分。宏命令 采用字符串,并使用 eval 命令去执行宏命令。下 例是采用 宏命令计算阶乘的例子。 》fct=?prod(1:n)?; %prod元素积,求 10 的阶乘 》n=10;eval(fct) ans=3628800 注:宏格式:字符串=?常用命令’ eval()函数的功能是将括号内的字符串视为语句并 运行 d=?cd? eval(d) d=cd 4.6 常用的编程命令? ? ? ? (例 exp2_8.m) pause:停止 m 文件的执行直至有键按下。 pause(n)将使程序暂停 n 秒。 echo on/off:控制是否在屏幕上显示程序内 容。 ? keyboard:停止程序执行,把控制权交给 键盘。输入 return 并回车后继续程 序执行。 ? x=input(?prompt?):把输入的字符串作为提 示符,等待使用者输入一个响应, 然后把 它赋值到 x。 echo off % 不显示程序内容 clear clc a=4; ?b=6 disp(‘暂停,请按任意键继续’) % disp 指令可以用来显示字符 pause % 暂停,直到用户按任意键 echo on % 显示程序内容,注意 matlab 默认是不显示 c=a+b % 暂时把控制权交给键盘(在命令窗口中出现 k 提示符), 输入 return, 回车后退出,继续执行下面的语句。 keyboard d=input(‘Enter the value of d=’);%提示用户输入 d 的值 e=a*24+b*8+d*6-c f=e/d disp(‘work pause 30 second’) % disp 指令可以用来显示字符 pause(10) %暂停 10 秒 disp(f) % 显示指定变量的结果,而不显示变量名称 echo off 4.7 关系与逻辑运算符? MATLAB 的运算符有三种类型:算术运算符、关系运算符、逻辑运算 符。 它们的处理顺序依次为算术运算符、关系运算符、逻辑运算符。 在前面我们已经 介绍例算术运算符,这里我们着重介绍后两种运算符。 ? 4.7.1 关系运算符 关系运算符总是以矩阵内元素对元素做运算,满足则返回1,不满 足则返回0 假设有:A=[1 2 -1 -5] B=[0 2 3 1] &小于 A&B ans=[0 0 1 1] A&1 ans=[0 0 1 1] &大于 A&B ans=[1 0 0 0] A&1 ans=[0 1 0 0] &=小于等于 A&=B ans=[0 1 1 1] &=大于等于 A&=B ans=[1 1 0 0] ==等于 A==B ans=[0 1 0 0] A=1 ans=[1 0 0 0] ~=不等于 A~=B ans=[1 0 1 1] A~=1 ans=[0 1 1 1] 4.7.2 逻辑运算符? &与 |或 ~非 ? 注意:在处理逻辑运算时,运算元只有两个值即 0 和 1,所以如果指定的数 为 0,MATLAB 认为 其为 0,而任何数不等于 0,则认为是 1。 ? 设有:A=[5 -4 0 -0.5] B=[0 1 0 9] ? A&B=[0 1 0 1] A&1=[1 1 0 1] ? 同为真为1,同为假为0,1真1假为0 ? A|B=[1 1 0 1] A|1=[1 1 1 1] ? 同为真为1,1真1假为1,同为假为0 ? ~A=[0 0 1 0] ~1=0 4.8程序流程控制? 4.8.1 for 循环语句 基本格式 for 循环变量=起始值:步长:终止值 (无分号) 循环体 ; end (无分号) 步长缺省值为 1,可以在正实数或负实数范围内任意指定。对于正数,循 环 变量的值大于终止值时,循环结束;对于负数,循环变量的值小于终止值 时,循 环结束。循环结构可以嵌套使用。 书写格式不必太过于拘泥,在 Editor 编辑器中会自动进行处理。 (例 exp2_11.m) sum=0; for i=1:100 sum=sum+i; end sum i 4.8.2 while 循环语句? 基本格式 while 表达式 (无分号) 循环体; end (无分号) 若表达式为真,则执行循环体的内容,执行后再判断表达式是否为真,若不 为真,则跳出 循环体,向下继续执行 While 循环和 for 循环的区别在于,while 循环结构的循环体被执行的次数不 是确定的,而 for 结构中循环体的执行次数是确定的。 例 exp2_12.m sum=0; j=0; while sum&100 j=j+1; sum=sum+j; end j sum 本循环体为:若sum=0满足条件,则执行j=j+1 sum=sum+j;若sum仍小于100返回j=j+1 sum=sum+j继续循环,直到sum&=100停止循环 4.8.3 if,else,elseif 语句1. if 逻辑表达式 (无分号) 例:%复制程序 执行语句 x=input(?please input x=?); end (无分号) if x&1 2.if 逻辑表达式 y=10 执行语句1 elseif x&-1&x&1 else y=0 执行语句2 else end y=-10 3.if 逻辑表达式1 end 执行语句1 elseif 逻辑表达式2 执行语句2 end if-else 的执行方式为:如果逻辑表达式的值为真,则执行语句 1,然后跳过 语 句 2,向下执行;如果为假,则执行语句 2,然后向下执行。 if-elseif 的执行 方式为:如果逻辑表达式 1 的值为真,则执行语句 1;如果为 假,则判断逻 辑表达式 2,如果为真,则执行语句 2,否则向下执行。 4.8.4 switch 语句格式:switch 表达式(%可以是标量或字符串) case 值1 语句1 case 值2 语句2 otherwise 语句3end 执行方式:表达式的值和 哪种情况(case)的值相同,就 执 行哪种情况中的语句,如果 不同,则执行otherwise中的 语 句 。 格 式 中 也 可 以 不 包 括 otherwise,这时如果 表达式的 值与列出的各种情况都不相 同,则继续向下执 行 clear clc close t=-pi:0.1: trigname=input('Input trig functions name:') switch trigname case 'sin' plot(t,sin(t)) case 'cos' plot(t,cos(t)) otherwise break %终止,跳出 switch 语句 注:输入input一定要与case情况相同,是‘sin’而不是sin end 第一章小结? ? 1.本章所要掌握的是 MATLAB 语言的基本知识,包括 MATLAB 窗口环境的 使 用;矩阵运算及多项式处理;基本的绘图命令;程序设计入门。 2. MATLAB 的窗口环境是基础的基础,要求熟练掌握语句命令的输入、变量 的使用、基本的数学函数及各种工作空间与文件管理的命令。要善于运用 help 命令自学。 3. MATLAB 具有强大的矩阵运算能力,要求熟练掌握矩阵的输入与生成,掌 握矩阵的基本运算及操作,区分带点运算与不带点运算点的不同;掌握多项 式的 建立与表示方法及多项式的基本运算。 4. MATLAB 同样具有强大的图形处理能力,要求熟练掌握基本二维绘图命令。 5. MATLAB 具有三种基本的 M 文件类型,要求掌握它们的区别及基本结构, 熟悉程序流程控制的使用及常用的编程命令。?? ? 第二章SIMULINK仿真基础? 在工程实际中,控制系统的结构往往很复杂,如果不借助 专用的系统建模软 件,则很难准确地把一个控制系统的 复杂模型输入计算机,对其进行进一步的分 析与仿真。 1990 年,Math Works 软件公司为 MATLAB 提供了新的 控制系统模型图输入 与仿真工具,并命名为 SIMULAB, 该工具很快就在控制工程界获得了广泛的认 可,使得仿 真软件进入了模型化图形组态阶段。但因其名字与当时比 较著名的软 件 SIMULA 类似,所以 1992 年正式将该软 件更名为 SIMULINK。 SIMULINK 的出现,给控制系统 分析与设计带来了福音。顾名思义,该软件 的名称表明 了该系统的两个主要功能:Simu(仿真)和 Link(连 接),即该软件 可以利用鼠标在模型窗口上绘制出所需 要的控制系统模型,然后利用 SIMULINK 提供的功能来 对系统进行仿真和分析。 第一节SIMULINK简介? 所谓模型化图形输入是指 SIMULINK 提供了一些按功能 分类的基本的系统 模块,用户只需要知道这些模块的输 入输出及模块的功能,而不必考察模块内部 是如何实现 的,通过对这些基本模块的调用,再将它们连接起来就可 以构成所需 要的系统模型(以.mdl 文件进行存取),进 而进行仿真与分析。 SIMULINK 是 MATLAB 软件的扩展, 它是实现动态系统建模和仿真的一个 软件包,它与 MATLAB 语言的主要区别在于,其与用户交互接口是基 于 Windows的模型化图形输入,其结果是使得用户可以 把更多的精力投入到系统模型的构 建,而非语言的编程 上。 SIMULINK 的最新版本是 SIMULINK4.0(包含在 MATLAB6.0 里), MATLAB5.3 里的版本为 3.0 版,它 们的变化不大。 1.2SIMULINK 的启动? 1、在 MATLAB 命令窗口中输入 simulink 结果是在桌面 上出现一个称为 Simulink Library Browser 的窗口,在这 个窗口 中列出了按功能分类的各种模块的名称。 当然用 户也可以通过 MATLAB 主窗口的快捷按钮来打开 Simulink Library Browser 窗口。 ? 2、在 MATLAB 命令窗口中输入 simulink3 结果是在桌面 上出现一个用图标形式显示的 Library :simulink3 的 Simulink 模 块库窗口。 两种模块库窗口界面只是不同的 显示形式,用户可以根据各人喜好进行选 用,一般说来 第二种窗口直观、形象,易于初学者,但使用时会打开太 多的子窗 口。 1.3SIMULINK 的模块库介绍? SIMILINK 模块库按功能进行分类,包括以下 8 类子库: ? Continuous(连续模块) ? Discrete(离散模块) ? Function&Tables(函数和平台模块) ? Math(数学模块) ? Nonlinear(非线性模块) ? Signals&Systems(信号和系统模块) ? Sinks(接收器模块) ? Sources(输入源模块) 1.3.1 连续模块(Continuous) continuous.mdl? ? ? ? ? ? ? Integrator:输入信号积分 Derivative:输入信号微分 State-Space:线性状态空间系统模型 Transfer-Fcn:线性传递函数模型 Zero-Pole:以零极点表示的传递函数模型 Memory:存储上一时刻的状态值 Transport Delay:输入信号延时一个固定时间再 输出 ? Variable Transport Delay:输入信号延时一个可 变时间再输出 1.3.2 离散模块(Discrete) discrete.mdl? ? ? ? ? Discrete-time Integrator:离散时间积分器 Discrete Filter:IIR 与 FIR 滤波器 Discrete State-Space:离散状态空间系统模型 Discrete Transfer-Fcn:离散传递函数模型 Discrete Zero-Pole:以零极点表示的离散传递函 数模型 ? First-Order Hold:一阶采样和保持器 ? Zero-Order Hold:零阶采样和保持器 ? Unit Delay:一个采样周期的延时 1.3.3 Function&Tables(函数和 平台模块)function.mdl? Fcn:用自定义的函数(表达式)进行运算 ? MATLAB Fcn:利用 matlab 的现有函数进 行运算 ? S-Function:调用自编的 S 函数的程序进 行运算 ? Look-Up Table:建立输入信号的查询表 (线性峰值匹配) ? Look-Up Table(2-D):建立两个输入信号的 查询表(线性峰值匹配) 1.3.4 Math(数学模块) math.mdl? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Sum:加减运算 Product:乘运算 Dot Product:点乘运算 Gain:比例运算 Math Function:包括指数函数、对数函数、求平方、开根号等常用数学函数 Trigonometric Function:三角函数,包括正弦、余弦、正切等 MinMax:最值运算 Abs:取绝对值 Sign:符号函数 Logical Operator:逻辑运算 Relational Operator:关系运算 Complex to Magnitude-Angle:由复数输入转为幅值和相角输出 Magnitude-Angle to Complex:由幅值和相角输入合成复数输出 Complex to Real-Imag:由复数输入转为实部和虚部输出 Real-Imag to Complex:由实部和虚部输入合成复数输出 1.3.5 Nonlinear(非线性模块) nonlinear.mdl? Saturation:饱和输出,让输出超过某一值 时能够饱和。 ? Relay:滞环比较器,限制输出值在某一范 围内变化。 ? Switch:开关选择,当第二个输入端大于临 界值时,输出由第一个输入端而 来,否则 输出由第三个输入端而来。 ? Manual Switch:手动选择开关 1.3.6 Signal&Systems(信号和 系统模块)sigsys.mdl? ? ? ? ? ? ? In1:输入端。 Out1:输出端。 Mux:将多个单一输入转化为一个复合输出。 Demux:将一个复合输入转化为多个单一输出。 Ground:连接到没有连接到的输入端。 Terminator:连接到没有连接到的输出端。 SubSystem:建立新的封装(Mask)功能模块 ? ? ? ? ? ? ? ? ? ? ? ? ?1.3.7 Sinks(接收器模块) Scope:示波器。 XY Graph:显示二维图形 To Workspace:将输出写入 MATLAB 的工作空间。 To File(.mat):将输出写入数据文件。 1.3.8 Sources(输入源模块)sources.mdl Constant:常数信号。 Clock:时钟信号。 From Workspace:来自 MATLAB 的工作空间。 From File(.mat):来自数据文件。 Pulse Generator:脉冲发生器。 Repeating Sequence:重复信号。 Signal Generator:信号发生器,可以产生正弦、方波、 锯齿波及随意波。 ? Sine Wave:正弦波信号。 ? Step:阶跃波信号。 1.4? ? ? ? ? ?SIMULINK 简单模型的建立及 模型特点1.4.1 简单模型的建立 exp5_1.md ( 1)建立模型窗口 ( 2)将功能模块由模块库窗口复制到模型窗口 ( 3)对模块进行连接,从而构成需要的系统模型 1.4.2 模型的特点 在 SIMULINK 里提供了许多如 Scope 的接收器模块,这 使得用 SIMULNK 进行仿真具有像做实验一般的图形化显 示效果。 SIMULINK 的模型具有层次性,通过底层子系 统可以构建上层母系统。 SIMULINK 提供了对子系统进 行封装的功能,用户可以自定义子系统的图标 和设置参 数对话框。 第二节 SIMULINK功能模块的处理? 功能模块的基本操作,包括模块的移动、复制、删除、转向、改变大小、模 块命名、颜色设定、参数设定、属性设定、模块输入输出信号等。模块库中 的模 块可以直接用鼠标进行拖曳(选中模块,按住鼠标左键不放)而放到模 型窗口中 进行处理。 在模型窗口中,选中模块,则其 4 个角会出现黑色标记。 此时可以对模块进 行以下的基本操作。 1)移动:选中模块,按住鼠标左键将其拖曳到所需的位置即可。若要脱离线 而移动,可按住 shift 键,再进行拖曳。 2)复制:选中模块,然后按住鼠标右键进行拖曳即可复制同样的一个功能模 块。 3)删除:选中模块,按 Delete 键即可。若要删除多个模块,可以同时按住 Shift 键,再用鼠标选中多个模块,按 Delete 键即可。也可以用鼠标选取某 区域,再 按 Delete 键就可以把该区域中的所有模块和线等全部删除。 4)转向:为了能够顺序连接功能模块的输入和输出端,功能模块有时需要转 向。在菜单 Format 中选择 Flip Block 旋转 180 度,选择 Rotate Block 顺时 针旋转 90 度。 5)改变大小:选中模块,对模块出现的 4 个黑色标记进行拖曳即可? ? ? ? ? ? 6)模块命名:先用鼠标在需要更改的名称上单击一下,然后直接更改 即可。 名称在功能模块上的位置也可以变换 180 度,可以用 Format 菜单中的 Flip Name 来实现,也可以直接通过鼠标进行拖曳。Hide Name 可以隐藏模块名称。 ? 7)颜色设定: Format 菜单中的 Foreground Color 可以改变模块的前 景颜色, Background Color 可以改变模块的背景颜色;而模型窗口 的颜色可以通过 Screen Color 来改变。 ? 8)参数设定:用鼠标双击模块,就可以进入模块的参数设定窗口,从 而对模 块进行参数设定。参数设定窗口包含了该模块的基本功能帮助, 为获得更详尽的 帮助,可以点击其上的 help 按钮。通过对模块的参 数设定,就可以获得需要的 功能模块。 ? 9)属性设定:选中模块,打开 Edit 菜单的 Block Properties 可以对模 块进行属 性设定。包括 Description (描述)属性、 Priority 优先级属 性、Tag (标签)属性、。 ? 10)模块的输入输出信号:模块处理的信号包括标量信号和向量信号; 标量信 号是一种单一信号,而向量信号为一种复合信号,是多个信号 的集合,它对应着 系统中几条连线的合成。缺省情况下,大多数模块 的输出都为标量信号,对于输 入信号,模块都具有一种&智能&的识别 功能,能自动进行匹配。某些模块通过对 参数的设定,可以使模块输 出向量信号。 第三节 SIMULINK线的处理? SIMULINK 模型的构建是通过用线将各种功能模块进行连接而构成的。 用鼠 标可以在功能模块的输入与输出端之间直接连线。所画的线可以 改变粗细、设定 标签,也可以把线折弯、分支。 ? 改变粗细:线所以有粗细是因为线引出的信号可以是标量信号或向量 信号, 当选中 Format 菜单下的 Wide Vector Lines 时,线的粗细会 根据线所引出的信号 是标量还是向量而改变,如果信号为标量则为细 线,若为向量则为粗线。选中 Vector Line Widths 则可以显示出向量 引出线的宽度,即向量信号由多少个单一信 号合成。 ? 设定标签:只要在线上双击鼠标,即可输入该线的说明标签。也可以 通过选 中线,然后打开 Edit 菜单下的 Signal Properties 进行设定, 其中 signal name 属性 的作用是标明信号的名称,设置这个名称反映 在模型上的直接效果就是与该信号 有关的端口相连的所有直线附近都 会出现写有信号名称的标签。 ? 线的折弯:按住 Shift 键,再用鼠标在要折弯的线处单击一下,就会 出现圆 圈,表示折点,利用折点就可以改变线的形状。 ? 线的分支:按住鼠标右键,在需要分支的地方拉出即可以。或者按住 Ctrl 键, 并在要建立分支的地方用鼠标拉出即可 。 第四节SIMULINK自定义功能模 块? 自定义功能模块有两种方法,一种方法是采用 Signal&Systems 模块库中的 Subsystem 功能模块,利 用其编辑区设计组合新的功能模块;另一种方法是将现 有的多个功能模块组合起来,形成新的功能模块。对于很 大的 SIMULINK 模型, 通过自定义功能模块可以简化图 形,减少功能模块的个数,有利于模型的分层构 建。 ? 4.1 方法 1 ? 1)将 Signal&Systems 模块库中的 Subsystem 功能模块 复制到打开的模型窗口 中。 ? 2)双击 Subsystem 功能模块,进入自定义功能模块窗口, 从而可以利用已有 的基本功能模块设计出新的功能模块。 ? 4.2 方法 2 ? 1)在模型窗口中建立所定义功能模块的子模块。 ? 2)用鼠标将这些需要组合的功能模块框住,然后 选择 Edit 菜单下的 Create Subsystem 即可。 ? 4.3 自定义功能模块的封装 ? 上面提到的两种方法都只是创建一个功能模块而 已,如果要命名该自定义功 能模块、对功能模块 进行说明、选定模块外观、设定输入数据窗口, 则需要对其 进行封装处理。 首先选中 Subsystem 功能模块,再打开 Edit 菜单中的 Mask Subsystem 进入 mask 的编辑窗口,可以 看出有 3 个标签页。 ? 1)Icon:设定功能模块的外观。 ? 2) Parameters:设定输入数据窗口(参数设置) ? 3)Documentation:设计该功能模块的文字说明。 4.3.1 Icon 标签页? ? ? ? ? ? 此页最重要的部分是 Drawing Commands,在该区域内可以用 disp 指令设 定 功能模块的文字名称,用 plot 指令画线,用 dpoly 指令画转换函数。 注意, 尽管这些命令在名字上和以前讲的 MATLAB 函数相同,但它们在功 能上却 不完全相同,因此不能随便套用以前所讲的格式。 a)disp('text')可以在功能模块上显示设定的文字内容。disp('text1\ntext2')分行 显示文字 text1 和 text2 b)plot([x1 x2 ? xn],[y1 y2 ? yn])指令会在功能模块上画出由[x1 y1]经[x2 y2] 经[x3 y3] ? 直到[xn,yn]为止的直线。功能模块的左下角会根据目前的坐标 刻度 被正规化为[0,0],右上角则会依据目前的坐标刻度被正规化为[1,1]。 c)dpoly(num,den):按 s 次数的降幂排序,在功能模块上显示连续的传递函 数。 d)dpoly(num,den,?z?):按 z 次数的降幂排序,在功能模块上显示离散的传递 函数。 用户还可以设置一些参数来控制图标的属性,这些属性在 Icon 页右下端的下 拉式列表中进行选择。 ? Icon 标签页 4.3.2 Parameters输入参数标签页? 此页主要用来设计输入提示(prompt)以及对应的变量名称(variable)。在 prompt 栏上输入变量的含义,其内容会显示在输入提示中。而 variable 是仿 真要 用到的变量,该变量的值一直存于 mask workspace 中,因此可以与其 他程序相 互传递。 如果配合在 initialization commands 内编辑程序,可以发 挥功能模块的功能来 执行特定的操作。 a)在 prompt 编辑框中输入文字,这些文字就会出现在 prompt 列表中;在 variable 列表中输入变量名称,则 prompt 中的文字对应该变量的说明。如果 要增 加新的项目,可以点击边上的 Add 键。Up 和 Down 按钮用于执行项目 间的位置 调整。 b)type 列表给用户提供选择设计的编辑区,选择 Edit 会出现供输入的 空白区 域,所输入的值代表对应的 variable;Popup 则为用户提供可选择的列表 框, 所选的值代表 variable,此时在下面会出现 Popup strings 输入框,用来设计 选择的内容,各值之间用逻辑或符号“|”隔开;如选择 Checkbox 则用于 on 与 off 的选择设定。 Edit:输入文字是程序执行时所用的变量值 输入内容做字符串处理 Popup:为选择的程序,选第一项输出为1, 选择内容做字符串处理 Checkbox:输出为1或者0 输出为“on”或“off”??? ? ? ? Parameters输入参数标签页 4.3.3 Documentation 标签页? 此页主要用来针对完成的功能模块来编写相应的 说明文字和 Help。 ? a)在 Mask description 中输入的文字,会出现在 参数窗口的说明部分。 ? b)在 Mask help 中输入的文字则会显示在单击参 数窗口中的 help 按钮后浏览 器所加载的 HTML 文件中。 ? c)Mask type:在此处输入的文字作为封装模块的 标注性说明,在模型窗口下, 将鼠标指向模块, 则会显示该文字。当然必须先在 View 菜单中选 择 Block Data Tips――Show Block Data Tips。 ? Documentation 标签页 第五节SIMULINK仿真的运行? 构建好一个系统的模型之后,接下来的事情就是运行模型, 得出仿真结果。 运行一个仿真的完整过程分成三个步骤: 设置仿真参数,启动仿真和仿真结果分 析。 ? 5.1 设置仿真参数和选择解法器 设置仿真参数和选择解 法器,选择 Simulation 菜单下的 Parameters 命令,就 会 弹出一个仿真参数对话框,它主要用三个页面来管理仿真 的参数。 ? I.Solver 页,它允许用户设置仿真的开始和结束时间,选 择解法器,说明解 法器参数及选择一些输出选项。 ? II.Workspace I/O 页,作用是管理模型从 MATLAB 工作空 间的输入和对它的 输出。 ? III.Diagnostics 页,允许用户选择 Simulink 在仿真中显示 的警告信息的等级。 5.1.1 Solver 页? 此页可以进行的设置有:选择仿真开始和结束的时间;选择解法器, 并设定 它的参数;选择输出项。 ? 1)仿真时间:注意这里的时间概念与真实的时间并不一样,只是计算 机仿真 中对时间的一种表示,比如 10 秒的仿真时间,如果采样步长 定为 0.1,则需要执行 100 步,若把步长减小,则采样点数增加,那 么实际的执行时间就会增加。一 般仿真开始时间设为 0,而结束时间 视不同的因素而选择。总的说来,执行一次 仿真要耗费的时间依赖于 很多因素,包括模型的复杂程度、解法器及其步长的选 择、计算机时 钟的速度等等 ? 2)仿真步长模式:用户在 Type 后面的第一个下拉选项框中指定仿真 的步长选 取方式,可供选择的有 Variable-step(变步长)和 Fixedstep(固定步长)方式。 变步长模式可以在仿真的过程中改变步长, 提供误差控制和过零检测。固定步长 模式在仿真过程中提供固定的步 长,不提供误差控制和过零检测。用户还可以在 第二个下拉选项框中 选择对应模式下仿真所采用的算法。 ? ?? ? ? ? ???变步长模式解法器有:ode45,ode23,ode113,ode15s,ode23s,ode23t, ode23tb 和 discrete。 a)ode45:缺省值,四/五阶龙格-库塔法,适用于大多数连续或离散系统, 但不适用于刚性(stiff)系统。它是单步解法器,也就是,在计算 y(tn)时, 它仅 需要最近处理时刻的结果 y(tn-1)。一般来说,面对一个仿真问题最好是 首先试试 ode45。 b)ode23:二/三阶龙格-库塔法,它在误差限要求不高和求解的问题不太难 的情况下,可能会比 ode45 更有效。也是一个单步解法器。 c)ode113:是一种阶数可变的解法器,它在误差容许要求严格的情况下通常 比 ode45 有效。ode113 是一种多步解法器,也就是在计算当前时刻输出时, 它需 要以前多个时刻的解。 d)ode15s:是一种基于数字微分公式的解法器(NDFs)。也是一种多步解 法 器。适用于刚性系统,当用户估计要解决的问题是比较困难的,或者不能 使用 ode45,或者即使使用效果也不好,就可以用 ode15s。 e)ode23s:它是一种单步解法器,专门应用于刚性系统,在弱误差允许下的 效果好于 ode15s。它能解决某些 ode15s 所不能有效解决的 stiff 问题。 f)ode23t:是梯形规则的一种自由插值实现。这种解法器适用于求解适度 stiff 的问题而用户又需要一个无数字振荡的解法器的情况。 g)ode23tb:是 TR-BDF2 的一种实现, TR-BDF2 是具有两个阶段的隐式龙 格-库塔公式。 h)discrtet:当 Simulink 检查到模型没有连续状态时使用它。 ? 固定步长模式解法器有:ode5,ode4,ode3, ode2,ode1 和 discrete。 ? a)ode5:缺省值,是 ode45 的固定步长版本,适 用于大多数连续或离散系统, 不适用于刚性系统。 ? b)ode4:四阶龙格-库塔法,具有一定的计算精 度。 ? c)ode3:固定步长的二/三阶龙格-库塔法。 ? d)ode2:改进的欧拉法。 ? e)ode1:欧拉法。 ? f)discrete:是一个实现积分的固定步长解法器, 它适合于离散无连续状态的 系统。 ? 3)步长参数:对于变步长模式,用户可以设置最大的和推荐的初始步 长参数, 缺省情况下,步长自动地确定,它由值 auto 表示。 ? a)Maximum step size(最大步长参数):它决定了解法器能够使用 的最大时间 步长,它的缺省值为“仿真时间/50”,即整个仿真过程中 至少取 50 个取样点,但 这样的取法对于仿真时间较长的系统则可能 带来取样点过于稀疏,而使仿真结果 失真。一般建议对于仿真时间不 超过 15s 的采用默认值即可,对于超过 15s 的每 秒至少保证 5 个采 样点,对于超过 100s 的,每秒至少保证 3 个采样点。 ? b)Initial step size(初始步长参数):一般建议使用“auto”默认值即 可。? 4)仿真精度的定义(对于变步长模式) ? a)Relative tolerance(相对误差):它是指误差相对于状态的值,是 一个百分 比,缺省值为 1e-3,表示状态的计算值要精确到 0.1%。 ? b)Absolute tolerance(绝对误差):表示误差值的门限,或者是说在 状态值为 零的情况下,可以接受的误差。如果它被设成了 auto,那 么 simulink 为每一个状 态设置初始绝对误差为 1e-6。 ? 5)Mode(固定步长模式选择) ? a)Multitasking:选择这种模式时,当 simulink 检测到模块间非法的 采样速率 转换,它会给出错误提示。所谓的非法采样速率转换指两个 工作在不同采样速率 的模块之间的直接连接。在实时多任务系统中, 如果任务之间存在非法采样速率 转换,那么就有可能出现一个模块的 输出在另一个模块需要时却无法利用的情 况。通过检查这种转换, Multitasking 将有助于用户建立一个符合现实的多任务 系统的有效模 型。 ? 使用速率转换模块可以减少模型中的非法速率转换。Simulink 提供了 两个 这样的模块:unit delay 模块和 zero-order hold 模块。对于从慢 速率到快速率的非 法转换,可以在慢输出端口和快输入端口插入一个 单位延时 unit delay 模块。而 对于快速率到慢速率的转换,则可以插 入一个零阶采样保持器 zero-order hold。 ? b)Singletasking:这种模式不检查模块间的速率转换,它在建立单任 务系统模 型时非常有用,在这种系统就不存在任务同步问题。 ? c)Auto:这种模式,simulink 会根据模型中模块的采样速率是否一致, 自动 决定切换到 multitasking 和 singletasking。 ? 6)输出选项 (在matlab7.0版本中Data Import/Export中的 Save options output options ) ? a)Refine output:这个选项可以理解成精细输出,其意义 是在仿真输出太稀松 时,simulink会产生额外的精细输出, 这一点就像插值处理一样。用户可以在 refine factor 设置 仿真时间步间插入的输出点数。 产生更光滑的输出曲线, 改变精细因子比减小仿真步长更有效。精细输出只 能在 变步长模式中才能使用,并且在 ode45 效果最好。 ? b)Produce additional output:它允许用户直接指定产生输 出的时间点。一旦选 择了该项,则在它的右边出现一个 output times 编辑框,在这里用户指定额外的 仿真输出点, 它既可以是一个时间向量,也可以是表达式。与精细因子 相比,这 个选项会改变仿真的步长。 ? c)Produce specified output only:它的意思是让 simulink 只在指定的时间点上 产生输出。为此解法器要调整仿真 步长以使之和指定的时间点重合。这个选项在 比较不同 的仿真时可以确保它们在相同的时间输出。 5.1.2 Workspace I/O 页? ? ? ? 在matlab7.0中位Data Import/Export 此页主要用来设置 SIMULINK 与 MATLAB 工作空间交换数值的有关选项。 1)Load from workspace:选中前面的复选框即可从 MATLAB 工作空间获取 时 间和输入变量,一般时间变量定义为 t,输入变量定义为 u。 Initial state 用来定 义从 MATLAB 工作空间获得的状态初始值的变量名。 2)Save to workspace:用来设置存往 MATLAB 工作空间的变量类型和变量 名, 选中变量类型前的复选框使相应的变量有效。一般存往工作空间的变量 包括输出 时间向量(Time)、状态向量(States)和输出变量(Output)。 Final state 用来 定义将系统稳态值存往工作空间所使用的变量名。 3)Save option:用来设置存往工作空间的有关选项。Limit rows to last 用来 设 定 SIMULINK 仿真结果最终可存往 MATLAB 工作空间的变量的规模,对 于向量 而言即其维数,对于矩阵而言即其秩;Decimation 设定了一个亚采样 因子,它的 缺省值为 1,也就是对每一个仿真时间点产生值都保存,而若为 2,则是每隔一 个仿真时刻才保存一个值。Format 用来说明返回数据的格式, 包括矩阵 matrix、 结构 struct 及带时间的结构 struct with time。? 5.1.3 Diagnostics 页? 此页分成两个部分:仿真选项和配置选项。 ? 配置选项下的列表框主要列举了 一些常见的事件 类型,以及当 SIMULINK 检查到这些事件时给予 的处理。仿真 选项 options 主要包括是否进行一 致性检验、是否禁用过零检测、是否禁止复用 缓 存、是否进行不同版本的 SIMULINK 的检验等几 项。 ? 除了上述 3 个主要的页外,仿真参数设置窗口还 包括 real-time workshop 页, 主要用于与 C 语言 编辑器的交换,通过它可以直接从 SIMULINK 模 型生成代码 并且自动建立可以在不同环境下运行 的程序,这些环境包括实时系统和单机仿 真。 5.2 启动仿真? ? ? ? ? ? ? ? ? ? ? ? ? 设置仿真参数和选择解法器之后,就可以启动仿真而运行。 选择 Simulink 菜单下的 start 选项来启动仿真,如果模型中有些参数没有定 义,则会出现错误信息提示框。如果一切设置无误,则开始仿真运行,结束 时系 统会发出一鸣叫声。 除了直接在 SIMULINK 环境下启动仿真外,还可以在 MATLAB 命令窗口中 通过函数进行,格式如下: [t,x,y]=sim(?模型文件名’,[to tf],simset(?参数 1?,参数值 1,?参数 2?,参数值 2, ?)) 其中 to 为仿真起始时间,tf 为仿真终止时间。[t,x,y]为返回值,t 为返回 的时 间向量值,x 为返回的状态值,y 为返回的输出向量值。 simset 定义了仿真参数, 包括以下一些主要参数: AbsTol:默认值为 1e-6 设定绝对误差范围。 Decimation:默认值为 1,决定隔多少个点返回状态和输出值。 Solver:解法器的选择。 MaxRows:默认值为 0,表示不限制。若为大于零的值,则表示限制输 出 和状态的规模,使其最大行数等于该数值。 InitialState:一个向量值,用于设定初始状态。 FixedStep:用一个正数表示步阶的大小,仅用于固定步长模式。 MaxStep:默认值为 auto。用于变步长模式,表示最大的步阶大小。 如果知道模型文件名称,可以用以下命令得到该模型的仿真参数: simget(' 模型文件名') ? 利用simget获取模型参数 第六节SIMULINK 设计s-function的? Simulink 为用户提供了许多内置的基本库模块,通过这些模块进行连 接而构 成系统的模型。对于那些经常使用的模块进行组合并封装可以 构建出重复使用的 新模块,但它依然是基于 Simulink 原来提供的内 置模块。而 Simulink s-function 是一种强大的对模块库进行扩展的新 工具。? 6.1 s-function 的概念 ? s-function 是一个动态系统的计算机语言描述,在 MATLAB 里,用户 可以选 择用 m 文件编写,也可以用 c 或 mex 文件编写,在这里只给 大家介绍如何用 m 文件编写 s-function。 ? S-function 提供了扩展 Simulink 模块库的有力工具,它采用一种特定 的调用 语法,使函数和 Simulink 解法器进行交互。 ? S-function 最广泛的用途是定制用户自己的 Simulink 模块。它的形式 十分通 用,能够支持连续系统、离散系统和混合系统。 6.2建立 m 文件 s-function? 该模板文件位于 MATLAB 根目录下 toolbox/simulink/blocks 目录下。 模板文件里 s-function 的结构十分简单,它只为不同的 flag 的值指定要相应 调 用的 m 文件子函数。比如当 flag=3 时,即模块处于计算 输出这个仿真阶段时, 相应调用的子函数为 sys=mdloutputs(t,x,u)。 ? 模板文件使用 switch 语句来完成这种指定,当然这种结 构并不唯一,用户也 可以使用 if 语句来完成同样的功能。 而且在实际运用时,可以根据实际需要来 去掉某些值, 因为并不是每个模块都需要经过所有的子函数调用。 ? 模板文件只是 Simulink 为方便用户而提供的一种参考格 式,并不是编写 s-function 的语法要求,用户完全可以改 变子函数的名称,或者直接把代码写在 主函数里,但使 用模板文件的好处是,比较方便,而且条理清晰。 ? 使用模板编写 s-function,用户只需把 s-函数名 换成期望的函数名称,如果需 要额外的输入参量, 还需在输入参数列表的后面增加这些参数,因为 前面的 4 个参数是 simulink 调用 s-function 时自 动传入的。对于输出参数,最好不做修改。 接下 去的工作就是根据所编 s-function 要完成的任务, 用相应的代码去替代模板 里各个子函数的代码即 可。 ? Simulink 在每个仿真阶段都会对 s-function 进行 调用,在调用时,Simulink 会根据所处的仿真阶 段为 flag 传入不同的值,而且还会为 sys 这个返 回参数指定 不同的角色,也就是说尽管是相同的 sys 变量,但在不同的仿真阶段其意义却不 相同, 这种变化由 simulink 自动完成。 ? m 文件 s-function 可用的子函数说明如下: a)mdlInitializeSizes:定义 s-function 模块的基本特性, 包括采样时间、连续 或者离散状态的初始条件和 sizes 数 组。 ? b)mdlDerivatives:计算连续状态变量的微分方程。 ? c)mdlUpdate:更新离散状态、采样时间和主时间步的要 求。 ? d)mdlOutputs:计算 s-function 的输出。 ? e)mdlGetTimeOfNextVarHit:计算下 一个采样点的绝对 时间,这个方法仅仅是在用户在 mdlInitializeSizes 里说 明了一 个可变的离散采样时间。 ? f)mdlTerminate:实现仿真任务必须的结束。 ? 概括说来,建立 s-function 可以分成两个分离的任务: ? a)初始化模块特性包括输入输出信号的宽度,离散连续状 态的初始条件和采 样时间。 ? b)将算法放到合适的 s-function 子函数中去。 6.2.2 定义 s-function 的初始信息? 为了让 Simulink 识别出一个 m 文件 s-function,用户必须在 s-函数里提供有 关 s-函数的说明信息,包括采样时间、连续或者离散状态个数等初始条件。 这一 部分主要是在 mdlInitializeSizes 子函数里完成。 Sizes 数组是 s-function 函数信息的载体,它内部的字段意义为: a)NumContStates:连续状态的个数(状态向量连续部分的宽度) b)NumDiscStates:离散状态的个数(状态向量离散部分的宽度) c)NumOutputs: 输出变量的个数(输出向量的宽度) d)NumInputs:输入 变量的个数(输入向量的宽度) e)DirFeedthrough:有无直接馈入 f)NumSampleTimes:采样时间的个数 如果字段代表的向量宽度为动态可变,则可以将它们赋值为-1。 注意:DirFeedthrough 是一个布尔变量,它的取值只有 0 和 1 两种,0 表示 没 有直接馈入,此时用户在编写 mdlOutputs 子函数时就要确保子函数的代 码里不 出现输入变量 u;1 表示有直接馈入。 NumSampleTimes 表示采样 时间的个数,也就是 ts 变量的行数,与用户对 ts 的定义有关。?? ? ? 需要指出的是:由于S-function会忽略端口, 所以当多个输入变量或者多个输出变量时, 必须用mux或者demux模块将多单一输入合 成一个复合输入向量或将一个复合输入向 量分解为多个单一输入 6.2.3 输入和输出参量说明? ? ? ? ? ? ? ? ? ? ? S-function 默认的 4 个输入参数为 t、x、u 和 flag,它们的次序不能变动,代 表的意 义分别为: a)t:代表当前的仿真时间,这个输入参数通常用于决定下一个采样时刻,或 者在多采 样速率系统中,用来区分不同的采样时刻点,并据此进行不同的处理。 b)x: 表示状态向量,这个参数是必须的,甚至在系统中不存在状态时也是 如此。它 具有很灵活的运用。 c)u:表示输入向量。 d)flag:是一个控制在每一个仿真阶段调用哪一个子函数的参数,由 Simulink 在调用时 自动取值。 S-function 默认的 4 个返回参数为 sys、x0、str 和 ts,它们的次序不能变动, 代表的 意义分别为: a)sys:是一个通用的返回参数,它所返回值的意义取决于 flag 的值。 b)x0: 是初始的状态值(没有状态时是一个空矩阵[]),这个返回参数只在 flag 值为 0 时才有效,其他时候都会被忽略。 c)str:这个参数没有什么意义,是 MathWorks 公司为将来的应用保留的,m 文件 sfunction 必须把它设为空矩阵。 d)ts:是一个 m×2 的矩阵,它的两列分别表示采样时间间隔和偏移。 例 1 csfunc.m(连续状态 s-function) 例 2 dsfunc.m(离散状态 s-function) 例 3 mixedm.m(混合系统 s-function) 例 4 vsfunc.m(可变步长仿真系统) 例 5 filt.m, rect.m,rload.m(非模板文件形式) 第七节 SIMULINK仿真举例? 7.1?8 线 3 线编码器的设计?在数字电路中,编码器、译码器的应用极为广泛。所谓编码,就是在选定的 一系列二值代码中赋予每个代码以固定的含义,执行编码功能的电路统称为 编码 器。 本例中将要实现 8 线 3 线编码器,,它的功能是对输入端的 8 个信 号进行编码, 输出三位二进制数。要求输入信号每次只有一个是 0,其余 7 个是 1。其中 0 值 是待编码信号。我们将使用 MATLAB 的 Simulink 软件包 实现这种常用的数字组 合逻辑电路,并进行仿真。 根据前面介绍的 8 线 3 线编码器的功能,可列出下面的真值表: ?有了真值表之后,我们可写出输入输出间的逻辑函数式如下:?? ??在写出逻辑表达式之后,我们就可以用与非门来实现这个表达式。到这里, 逻辑设计就告一段落,在进行仿真时,我们将在 8 个输入端依次加一个低电 平, 然后用 3 个示波器观察 3 个输出波形。 用 Simulink 实现这个数字电路系统一共分三个步骤: 第一步:添加模块,在 MATLAB 中运行 Simulink,打开模块浏览器,然后 新建一个模型。接下来把本次仿真需要的模块添加到模型中。这里共需 3 种 模块: (与非门 4 个,离散信号脉冲源 8 个,示波器 3 个)。与非门位于 Simulink 模块 库下的 Math 子模块库中的 Logocal Operator(以后就用 Simulink― Math― Logical Operator 来表示模块位置), 离散信号脉冲源位 于 Simulink― Sources― Discrete Pulse Gennerrator,示波器位于 Simulink―Sinks―Scope. 将这三种模块 个拖一个到模型中。 点击与非门模块的名称,即写着 Logical Operator 的区域,将名称改为 Y0,接 着 点击选中与非门模块不要松开鼠标,按住 Ctrl 健拖动这个模块到另一个位 置,会 复制一个新的 Y1 模块。用同样的方法得到 Y2,类似地将离散信号脉 冲源模块名 字改为 J0,同样得到 J0,J1?J7. 最后将示波器复制 3 个.这样一 来就将所有模块添 加到模型中了。 ? 第二步:修改模块参数 ? 首先双击 Y0,打开属性对话框,将操作(Operator)修改为 “NAND”,输入 节点数改为 4, ? 然后点击哦 OK 确定。Y1,Y2 也做同样修改。 然后,通过双击示波器 模块 Scope,得到一个图形界面,在其工具栏上单击 打印图标右边 的 Parameters 图标,打开示波器属性设置对话框,将坐标轴数改为 3,同样地,将示波器 Scope1,Scope2 的坐标轴数改为 4。 ? 最后我们来修改脉冲源的属性。双击离散脉冲源 J0,将看到关于它的 属性对 话框,可以从对话框中看到有 5 个参数要设置,分别为: Amplititude:方波信号的幅度; Period: 方波信号的周期; Pulse width:脉冲宽度; Phase dalay:相位延迟; Sample Time:采样时间长度,以秒为单位。 ? 针对这个例子中的要求,我们需要 J0 到 J7 依次为低电平,所以将 J0 到 J7 的周期调整为 8,脉冲宽度设为 7,相位延迟依次为-7 到 0, 幅度和采样时间用 默认值。这样在零时刻,J0 为低电平,其余输入 为高电平;过一个采样时间,J1 变为低电平。这样下去,到第七个 采样时间,J7 变为低电平。从而实现了设计 要求。 ? 第三步:联线及仿真 ? 现在我们将各模块之间的线连上。根据输入输出的逻辑表 达式,将 J1、J3、 J5、J7 接到 Y0 的输入,将 J2、J3、 J6、J7 接到 Y1 的输入,将 J4、J5、J6、J7 接到 Y2 的 输入。然后用示波器 Scope 监测 Y2、Y1、Y0 的输出, Scope1 用来监 视 J0 到 J3 这 4 个波形,Scope2 用来监 视 J4 到 J7 这 4 个波形。这样我们就完成 了连线。 ? 在最后进行仿真之前,先保存结果 bianma83.mdl 到自己 的工作目录。 ? 仿真结束后,可以从示波器 Scope1,Scope2 上看到编码 器 8 个输入端波形。 在示波器 Scope 中看到编码器输出 波形。 ? 小结:从本列看到,对于简单系统的 MATLAB 仿真,一 般分为三步: ? (1) 添加模块; ? (2)修改模块参数; ? (3)连线及仿真。 8 线 3 线编码器 ? 下面例子给出结果,以供联系参考 ? 设计一个时钟脉冲控制的 RS 触发器 (RS.mdl) ? 同步RS触发器原理: ? 又称时钟控制RS触发器,这种触发器只有 当时钟脉冲到来时输出端才根据这时的输 入信号改变状态 ~Q ~Q~Q Q G1 Rd G3 G4 R R CP S CP S G2 Sd Rd Sd ? 1.图是同步RS触发器的逻辑图和逻辑符号,它是在基本 RS触发器上(G1和G2)基础上,增加了两个与非门 (G3和G4)组成的输入门和一个钟控端CP组成,该电路 的两个输出端Q和~Q。 ? 1).输入端Rd和Sd Rd=R*CP Sd=S*CP ? Rd和Sd端在CP=0时,可直接触发器置0或置1,d表示直 接的意思 ? Rd是直接置0端,Sd是直接置1端,一般可以在触发器工 作之前采用Rd和Sd直接进行置0或置1,不用Rd和Sd接高 点评悬空 ? 2).信号输入端R和S ? 信息输入端R为置0端,S为置1端,因输入要通过与非门 G3和G4之后,才作用到基本触发器输入端 ? 3).钟控制端CP ? 钟控制端CP用于输入进钟脉冲,控制输入门的开通与关 闭,使输出按一定节拍随输入信号变化 ? ? ? ? ?? ??2.同步RS触发器工作原理Qn+1=S+R*Qn 1)cp=0时,此时G3,G4被封锁,输出为1不论输入信号 R,S如何变化触发器的状态不变 2)cp=1 G3,G4接触封锁,触发器状态Qn+1取决于输 入信号R,S及电路状态Qn ①R=S=0 如果输入端R=S=0,则G3,G4输出仍等于1,故触发器状 态不变 ②R=1,S=0 如果输入端R=1,S=0由于G3门输入均为1,则G3输出为 0,G1输入为0,所以无论G1原状态如何,其输出~Q一 定为1,对于G4来说,由于S0,G4=1,G2门输入均为1, 所以G2输出为Q=0 当Q=0时,又保证了~Q=1,假如将CP再变为0,则 G3=G4=1,基本触发器保持0状态 ? ③R=0,S=1 ? 如果输入端R=0,S=1,则情况同上相反,由于G4输 入为1,则G4=0,迫使G2输出Q=1,由于Q=1,G3 输出也为1,又迫使G1输出~Q=0,此时触发器处 于1状态,即使CP再返回到0,由于G1,G2互锁作 用,该状态也会维持下去 ? ④R=S=1 ? 如果输入端R=S=1,G3,G4输出均为0,于是 G1,G2输出均为1,但当CP返回0时,G3,G4也都 返回1,这是G1,G2输入均为1,因此它们输出都 向0转化,出现竞争状态,如果G2先翻为0,则 G1被锁定在1,结果触发器为0状态,如果G1先 翻为0,则G2被锁定在1,触发器处于1状态,最 后结果难以预料 时钟信号信号输入端信号输出端逻辑装填说明11 ? 综上所述, 1 钟控RS触发 1 器的真值 1 表为 1 1 1 0 000 0 0 1 1 1 1 X X00 1 1 0 0 1 1 X X01 0 1 0 1 0 1 0 101 1 1 0 0 X X 0 1触发器保持 元状态不变 触发器置1 触发器置0触发器状态 不变 CP=0时, 触发器状态 不变 ? 与非门构成的同步RS触发器~Q Q++S R cp ? 时钟脉冲控制的RS触发器? ? ? ?Pulse Generator为脉冲触发器 Constant 0 1分别为R,S 通过与CP(clock)逻辑运算得到switch1和switch 即Rd和Sd,再通过RS触发器实现原理得出scope ? 时钟脉冲构成的与非门RS触发器? CLK为1 0通过与非门逻辑关系得到 7.2利用 SIMULINK 仿真产生数 字基带信号(dsp.mdl)? 要求: ? 产生二进制[0,+1]随机信号序列,信号波特率为 1000 波特 用波形成 形法生成数字基带信号,波形为滚降系数为 1 的升余弦滚降滤波器 冲击响应的截止函数,要求包含主瓣和一对旁瓣。 抽样速率为 8000Hz. 观察输出信号的波形和频谱。 ? 提示: ? 首先生成波特率为 1000B的随机信号序列{a n}。由于生成的数字基带 信号可 以表示为:? 其中 g(t)是升余弦滚降滤波器的冲击响应。有下式成立: ? ? 将上面公式离散化,变为:? 当 m?T ? nT s 时,? (m?T ? nT s ) =0, 否则为 1。1/ ?T 为抽样频率,在此 ? 1 / ?T =8000Hz,于是, ? ? a ? (m?T ? nT ) 可表示成序列 {a0,0,0,0,0,0,0,0,a1,0,0,0,0,0,0,0,a2,??.}。 将{an}转换成 {a0,0,0,0,0,0,0,0,a1,0,0,0,0,0,0,0,a2,??.} 可用插值器(Upsampler)来实现。 ? 利用SIMULINK仿真产生数字基带信号 ? 利用SIMULINK进行fsk调制解调仿真 (fskmodem.mdl) ? FSK调制:数字调频又称移频键控,简记 fsk ? 它是载波频率随数字信号而变化的一种调 制方式,利用基带数字信号离散取值特点 去键控载波频率以传递信息的一种数字调 制技术,除具有两个符号的二进制频移键 控,尚有代表多个符号的多进制频移键控, 简称多频调制,一种用多载波频率承载数 字信息的调制类型。 ? 利用SIMULINK进行fsk调制解调仿真 ? 本章小结 ? SIMULINK 是 MATLAB 的一个扩展软件,它是 基于模型化图型输入的仿真 环境。 ? 模型化图型输入使得用户可以把更多的精力投入 到模型的构建上来,要求熟 悉各功能模块库中各 子模块的功能,熟练掌握 SIMULINK 环境下模块 的操作及 线的处理,掌握自定义功能模块。 ? 掌握 SIMULINK 解法器的设置。 ? S-FUNCTION 是扩展 MATLAB 函数库的一个实 用方法,要求熟练掌握它的 编写及用法。 ? 使用 SIMULINK 进行仿真分析的关键是熟练地运 用各功能子模块构建出需 要的正确的系统模型并 合理地设置解法器以使仿真得以正常运行。
更多搜索:
赞助商链接
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 ode算法 的文章

 

随机推荐