资源描述
第八章 SIMULINK交互式仿真集成环境
l 引导
SIMULINK是一个进行动态系统建模、仿真和综合分析的集成软件包。它可以处理的系统包括:线性、非线性系统;离散、连续及混合系统;单任务、多任务离散事件系统。
在SIMULINK 提供的图形用户界面GUI上,只要进行鼠标的简单拖拉操作就可构造出复杂的仿真模型。它外表以方块图形式呈现,且采用分层结构。从建模角度讲,这既适于自上而下(Top-down)的设计流程(概念、功能、系统、子系统、直至器件),又适于自下而上(Bottum-up) 逆程设计。从分析研究角度讲,这种SIMULINK模型不仅能让用户知道具体环节的动态细节,而且能让用户清晰地了解各器件、各子系统、各系统间的信息交换,掌握各部分之间的交互影响。
在SIMULINK环境中,用户将摆脱理论演绎时需做理想化假设的无奈,观察到现实世界中摩擦、风阻、齿隙、饱和、死区等非线性因素和各种随机因素对系统行为的影响。在SIMULINK环境中,用户可以在仿真进程中改变感兴趣的参数,实时地观察系统行为的变化。由于SIMULINK环境使用户摆脱了深奥数学推演的压力和烦琐编程的困扰,因此用户在此环境中会产生浓厚的探索兴趣,引发活跃的思维,感悟出新的真谛。
在MATLAB6.x版中,可直接在SIMULINK环境中运作的工具包很多,已覆盖通信、控制、信号处理、DSP、电力系统等诸多领域,所涉内容专业性极强。本书无意论述涉及工具包的专业内容,而只是集中阐述:SIMULINK 的基本使用技法和相关的数值考虑。
节8.1虽是专为SIMULINK初学者写的,但即便是熟悉SIMULINK以前版本的读者也值得快速浏览这部分内容,因为新版的界面、菜单、工具条、模块库都有较大的变化。第8.2节比较详细地阐述建模的基本操作:通用模块的具体化设置、信号线勾画、标识、模型窗参数设置。这部分内容是进一步深入的前提。从第8.3节起,由浅入深地讲述SIMULINK对各种数学、工程问题的建模、仿真和分析的基本方法。
本章采用“算例”作为主体,配以适量的归纳性表述。本章包含了34个“尽量简单”又“独立完整”的“典型”算例,而这正是SIMULINK在线PDF文件之所缺。读者通过“手、眼、脑”并用地练习算例,掌握SIMULINK的一般使用规则和操作技法。
鉴于SIMULINK的本质,本节算例必定涉及数学、物理、和若干工程考虑。本书已采取“无量纲记述”、“注释”等措施使算例尽可能易读易懂,读者只要稍微耐心,就可以从这些有背景的内容体验到SIMULINK仿真之细腻和切实,从这些带背景性的算例品出SIMULINK的精妙之处。
本章内容已在MATLAB6.5基础上进行全面更新,变动最大的是第8.4.3节。此外,为适应读者应用水平的提高,新增了第8.8节,论述S函数模块的创建和使用。
l SIMULINK的安装
图 8.1.1-1
l SIMULINK入门
图 8.1.2-1
图 8.1.2-2
图 8.1.2-3
图 8.1.2-4 模型创建中的模型窗一
图 8.1.2-5
图 8.1.2-6
图 8.1.2-7
l SIMULINK库浏览器界面
图 8.1.3-1
l SIMULINK模型窗的组成
图8.1.4-1
l 模型的创建
l 模型概念和文件操作
l SIMULINK模型是什么
l 模型文件的操作
图 8.2.1.2-1
l 模块操作
l 模块的基本操作
(1)模块的选定
图 8.2.2.1-1
l 选定单个模块的操作方法:
l 选定多个模块的操作方法:
图 8.2.2.1-2
(2)模块的复制
(3)模块的移动
(4)模块的删除
(5)改变模块大小
(a)原尺寸
( b)拖动边框
(c)新尺寸
图 8.2.2.1-3
(6)模块的旋转
(a)缺省状态
(b)旋转1800
(c)旋转900
图 8.2.2.1-4
(7)模块名的操作
(8)模块的阴影效果
l 向量化模块和标量扩展
(1)向量化模块
(2)标量扩展
【例8.2.2.2-1】演示“示波”模块的向量显示能力。
图 8.2.2.2-1-1
【例8.2.2.2-2】演示“求和”模块的向量处理能力:输入扩展。
图 8.2.2.2-2-1
【例8.2.2.2-3】演示“增益”模块的向量处理能力:参数扩展。
图 8.2.2.2-3-1
l 参数设置
l 信号线操作
l 产生连线
(1)水平或垂直连线的产生
(2)斜连线的产生
(3)连线的移动和删除
l 信号线的分支和折曲
(1)分支的产生
(2)信号线的折曲
(3)折点的移动
l 信号线宽度显示
l 彩色显示信号线
l 插入模块
图 8.2.3.5-1
l 信号线标识(label)
【例8.2.3.6-1】演示:信号线标识的传播
l 对模型的注释
(1)模型注释的创建
(2)注释位置的移动
(3)注释文字的字体控制
l 常用的Sourse库信源
【例8.2.5-1】如何调用MATLAB工作空间中的信号矩阵作为模型输入。本例所需的输入为 。
(1)
[sourec 0825_1.m]
function TU=source0825_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'];
(2)
图8.2.5-1
(3)
(4)
TU=source0825_1(1,100,4);
(5)
l 常用的Sink库信宿
l 库信宿一览表
l 示波器
(1)示波器的用途
(2)示波器窗的工具条
(3)示波器纵坐标范围的手工设置
(4)示波器横坐标的设置
(5)把示波器数据送入MATLAB工作空间
(6)多信号显示区设置
(7)设置为游离示波器
l 仿真的配置
l 解算器参数的设置(Solver)
图8.2.7.1-1
l 仿真数据的输入输出设置(Workspace I/O)
图8.2.7.2-1
l 仿真中异常情况的诊断(Diagnostics)
图 8.2.7.3-1
l 连续系统建模
l 线性系统
l 积分模块的功用
【例8.3.1.1-1】复位积分器的功用示例。
图8.3.1.1-1
l 积分模块直接构造微分方程求解模型
【例8.3.1.2-1】假设从实际自然界(力学、电学、生态等)或社会中,抽象出有初始状态为0的二阶微分方程,是单位阶跃函数。本例演示如何用积分器直接构搭求解该微分方程的模型。
(1)
(2)
图8.3.1.2-1-1
(3)仿真操作
(4)保存在MATLAB工作空间中的数据
clf
tt=ScopeData.time;
xx=ScopeData.signals.values;
[xm,km]=max(xx);
plot(tt,xx,'r','LineWidth',4),hold on
plot(tt(km),xm,'b.','MarkerSize',36),hold off
strmax=char('最大值',['t = ',num2str(tt(km))],['x = ',num2str(xm)]);
text(6.5,xm,strmax),xlabel('t'),ylabel('x')
图8.3.1.2-1-2
l 传递函数模块
【例8.3.1.3-1】直接利用传递函数模块求解方程(8.3.1.3-1)。
(1)
图8.3.1.3-1
(2)
l 状态方程模块和单位脉冲输入的生成
【例8.3.1.4-1】假设式(8.3.1.4-1)中的输入函数是单位脉冲函数,研究该系统的位移变化。本例演示:(A)状态方程模块的使用;(B)脉冲函数的生成方法。
(1)
(2)
图8.3.1.4-1-1
(3)
图8.3.1.4-1-2
l 非线性系统
l 建立非线性仿真模型的基本考虑
【例8.3.2.1-1】物理背景:如图8.3.2.1-1-1所示喷射动力车的定位控制问题。
图8.3.2.1-1-1
(1)
图8.3.2.1-1-2
(2)
(3)
图8.3.2.1-1-3
(4)
(5)
(6)
subplot(1,2,1),plot(xout(:,2),xout(:,1))
grid on,axis([-0.2,1,-1,0.2]),axis square
xlabel('\fontsize{14}位移'),ylabel('\fontsize{14}速度'),
subplot(1,2,2),plot(xout(:,2),xout(:,1))
grid on,axis([-0.1,0.05,-0.05,0.1]),axis square
图8.3.2.1-1-4
l 任意非线性函数模块及其应用
【例8.3.2.2-1】轿车沿直线山坡路向前行驶。要求设计一个简单的比例放大器,使轿车能以指定的速度运动。本例演示:(A)仿真系统的创建。(B)非线性模块的使用。(C)任意函数模块的应用。(D)体现“自下而上”的建模方式。(E)本例将作为下面章节多个算例的基础,读者切莫跳略此题。
(1)
图8.3.2.2-1-1
(2)
图8.3.2.2-1-2
(2)
图8.3.2.2-1-3
(3)
图8.3.2.2-1-4
(4)
l 子系统的创建、装帧及受控执行
l 简装子系统及其应用
l 创建简装子系统的“先有内容后套包装”法
【例8.4.1.1-1】题目的背景和参数与例8.3.2.2-1完全相同,要求创建利用比例控制器使轿车的运动速度稳定在期望车速的分层仿真模型。本例演示:如何从非分层模型获得分层模型;创建简装子系统的“先有内容后套包装”法。
(1)
(2)
(3)
(4)
(5)
图8.4.1.1-1
l 创建简装子系统的“先有包装后置内容”法
【例8.4.1.2-1】本例演示:如何自上而下构造分层模型;产生简装子系统的“先有包装后置内容”法。
(1)
图 8.4.1.2-1
(2)
(3)
(4)
(5)
l 精装子系统
l 精装子系统的制作过程
l 装帧示例
【例8.4.2.2-1】目标:把图8.4.1.1-1所示轿车速度控制模型中的轿车动态模型简装子系统变成精装子系统。
(1)
(2)
图8.4.2.2-1-1
(3)
(4)
(5)
(6)
图 8.4.2.2-1-2
(7)
图 8.4.2.2-1-3
(8)
图8.4.2.2-1-4
l 精装子系统的使用特点
【例8.4.2.3-1】本例演示:精装子系统参数对话窗的来源和外形特点;如何打开精装子系统自身的“下层”结构模型;精装子系统如何从外界获得参数。
(1)
图8.4.2.3-1-1
(2)
(3)
l 条件执行子系统
l 使能子系统
【例8.4.3.1-1】利用使能原理构成一个半波整流器。本例演示使能子系统的创建及工作机理。
(1)
(2)
(3)
(4)
图8.4.3.1-1-1
图8.4.3.1-1-2
【例8.4.3.1-2】本例演示:在使能子系统中插入滤波模块。
图8.4.3.1-2-1
(1)
(2)
(3)
(4)
图8.4.3.1-2-2
l 触发子系统
【例8.4.3.2-1】利用触发子系统获得零阶保持的采样信号。本例演示:触发子系统工作原理。
图8.4.3.2-1-1
(1)
(2)
[t,x,y]=sim('exm080432_1',10);
clf,hold on
plot(t,y(:,1),'b')
stairs(t,y(:,2),'r')
stairs(t,y(:,3),'c:'),hold off
axis([0 10 -1.1 1.1]),box on
legend('sinewave','output','trigger',4)
图 8.4.3.2-1-2
l 触发使能子系统
l 使能子系统和出发子系统综合运用示例
【例8.4.3.4-1】本例是前面例8.3.2.2-1 , 8.4.1.1-1 , 8.4.2.2-1的继续,使得汽车速度受两种不同的控制器操纵。具体要求是:(A)当汽车实际速度与期望速度的误差绝对值,且时,将切换为PI比例-积分控制器;(B)一旦PI控制器被使用,只要仍满足,那么PI将继续起控制作用;(C)除以上情况外,则都使用简单的P比例控制器。
(1)
图 8.4.3.4-1-1
(2)
图 8.4.3.4-1-
(3)
图 8.4.3.4-1-3
(4)
图 8.4.3.4-1-4
(5)
图 8.4.3.4-1-5
l 交替执行子系统
【例8.4.3.5-1】在例8.4.3.4-1中,比例控制器和比例-积分控制器的工作切换是借助Model Selector子系统产生的两个输出切换信号Choose PI和Choose P实现的。本例将演示:如何依靠一个Choose PI信号和merge汇合模块的配合使用,实现同样的控制器切换。
(1)
(2)
图8.4.3.5-1
l 离散时间系统和混合系统
l 若干基本模块
(1)单位延迟模块Unit delay
(2)零阶保持器Zero-Order hold
(3)传递函数型模块
(4)组合逻辑模块Combinational logic
(5)离散时间积分器Discrete-time integrator
【例8.5.1-1】用组合逻辑模块产生的“逻辑和”结果及“逻辑或”结果。
(1)
表8.5.1-2
a
b
c(1)
c(2)
0
0
0
0
0
1
0
1
1
0
0
1
1
1
1
1
(2)
图8.5.1-1
l 多速率离散时间系统
【例8.5.2-1】在离散控制系统中,控制器的更新频率一般低于对象本身的工作频率。而显示系统的更新频率总比显示器的可读速度低得多。假设有某过程的离散状态方程
式中是输入。该过程的采样周期为秒。控制器应用采样周期为秒的比例控制器;显示系统的更新周期为秒。
l
图8.5.2-1-1
(2)
(3)
tt=TX.time;
x1=TX.signals.values;
plot(tt,x1),grid on,
xlabel('kT'),ylabel('x1(kT)')
图8.5.2-1-1
l 离散-连续混合系统
【例8.5.3-1】本例是在例8.4.2.2-1的基础上进行的。目标是:设计一个离散PID控制器子系统对轿车速度进行控制。本例演示:(A)离散PID的构成;(B)展示仿真模型在研究控制器各参数影响上的能力。
(1)
(2)
图8.5.3-1-1
(3)
(4)
图8.5.3-1-2
(5)
(6)
图8.5.3-1-3
l SIMULINK的分析工具
l 确定模型的特征
【例8.6.1-1】观察例8.5.3-1中所建模型exm08053_1.mdl中状态向量的结构。
[sizes,x0,StateCell]=exm08053_1;
SIZES=sizes',X0=x0',StateCell
SIZES =
2 2 0 0 0 0 3
X0 =
0 0 0 0
StateCell =
'exm08053_1/Automobile Model/Int1'
'exm08053_1/Automobile Model/Int2'
'exm08053_1/PID Controller/DT-I'
'exm08053_1/PID Controller/DD'
l 用MATLAB指令运行SIMULINK模型
l 运行SIMULINK模型的sim指令
l 设置编辑仿真参数的simset 指令
l 获取模型仿真参数的simget指令
l MATLAB指令运行SIMULINK模型的示例
【例8.6.2.4-1】以例8.5.3-1中所建模型exm08053_1.mdl为基础进行本题解算。演示:(A)显示模型窗中的初始状态设置。(B)把初始车速重置为120 ,而其他初始值仍为0 。(B)画出两种初始状态下的车速曲线。
InInit=simget('exm08053_1','InitialState') %获取模型窗对初始值的设置
[t,x,y]=sim('exm08053_1',100); %在模型内设置参数下进行仿真
opts=simset('InitialState',[120,0,0,0]); %初始值的重置
[tt,xx,yy]=sim('exm08053_1',100,opts); %在重置初值下仿真
plot(t,x(:,1),':b',tt,xx(:,1),'r')
legend('\fontname{隶书}\fontsize{16}内初值','外初值',4)
图8.6.2.4-1
l 模型的线性化问题
l 线性化的数学描述
l 连续系统的线性化模型
l 离散系统的线性化模型
l 模型线性化的算例
【例8.6.3.4-1】求非线性系统在坐标原点处的线性化模型。
(1)
(2)
图8.6.3.4-1
(3)
[A,B,C,D]=linmod('exm080634_1');A
A =
0 0
2.0000 -1.0000
(4)
[A1,B1,C1,D1]=linmod('exm080634_1',[1,0.5]);A1
A1 =
2.0000 1.0000
2.0000 -1.0000
(5)
eA=eig(A)',eA1=eig(A1)'
eA =
-1.0000 0
eA1 =
2.5616 -1.5616
l 系统平衡点的求取
l 综合算例
l “一步仿真”和精良状态轨迹斜率图
【例8.6.5.1-1】求非线性系统的相平面轨迹、平衡点,并进行稳定性分析。本例综合演示:(A)SIMULINK模型和MATLAB指令的配合使用。(B)sim , simset , trim 指令的应用。(C)“一步仿真”计算方法。(D)二阶系统相轨迹的精良图形。
(1)
(2)
[exm080651_1.m]
% exm080651_1.m
clf;hold on
xx=[-2,1;-1,1;0,1;1,1;1,0;1,-1;1,-2];
nxx=size(xx,1);
for k=1:nxx
opts=simset('initialstate',[xx(k,1),xx(k,2)]);
[t,x,y]=sim('exm080634_1',10,opts);
plot(x(:,1),x(:,2));
end
xlabel('x1');ylabel('x2'),grid,hold off
l
exm080651_1
图 8.6.5.1-1-1
(4)
[portraitzzy.m]
function [DX1,DX2,DP]=portraitzzy(x1,x2,h)
% PORTRAITZZY
%
%
opts=simset('solver','ode5','fixedstep',h); % <7>
n=length(x1);
X1=zeros(n,n);X2=X1;
for ii=1:n;
for jj=1:n;
opts=simset(opts,'initialstate',[x1(ii),x2(jj)]);% <12>
[t,x,y]=sim('exm08634_1',h,opts); % <13>
dx1=x(2,1)-x1(ii);
dx2=x(2,2)-x2(jj);
L=sqrt(dx1^2+dx2^2);。
Z(jj,ii)=L;
if L>1.e-10
DX1(jj,ii)=dx1/L;DX2(jj,ii)=dx2/L; % <19>
end
end
end
DP=Z/h;
(5)
h=0.01;
x1=-2.5:0.25:2.5;x2=x1;
k=3.5;
[X1,X2]=portraitzzy(x1,x2,h);
quiver(x1,x2,k*X1,k*X2,0)
xlabel('x1'),ylabel('x2')
图 8.6.5.1-1-2
(6)
surfc(x1,x2,Z),view([18,32]),xlabel('x1'),ylabel('x2')
图 8.6.5.1-1-3
(6)
xa=trim('exm080634_1',[-1,-2]')
xb=trim('exm080634_1',[1,2]')
xa =
-0.8944
-1.7889
xb =
0.8944
1.7889
(7)
Axa=linmod2('exm080634_1',xa);eig_Axa=(eig(Axa))'
Axb=linmod2('exm080634_1',xb);eig_Axb=(eig(Axb))'
eig_Axa =
-1.3944 - 2.6457i -1.3944 + 2.6457i
eig_Axb =
3.4110 -2.6222
l 仿真模型和优化指令的协调
【例8.6.5.2-1】本例演示:(A)如何用SIMULINK模块计算性能函数。(B)SIMULINK方块模型、目标函数和优化程序之间的协调和参数传递。(C)跨空间交换数据、跨空间计算表达式。
(1)
(2)
图8.6.5.2-1-1
(3)
[itae.m]
function ss=itae(aa)
%
global a ss
a=aa;
Tspan=evalin('base','Tspan'); % <5>
opts=simset('RelTol',0.0001); %
[tt,x,s]=sim('smodel',Tspan,opts); % <7>
ss=s(end); % <8>
[exm080652_1.m]
[exm080652_1.m]
%exm08652_1.m
clear
global a ss
a0=[3.3 6.6 8.6 7.5 3.9];
Tspan=(0:500)/10;
options=optimset('LargeScale','off');
a=fminunc(@itae,a0,options);
coeff=[1,a,1]
ss
(4)
exm080652_1
coeff =
1.0000 2.1526 5.6292 6.9349 6.7927 3.7399 1.0000
ss =
8.3338
(5)
old=tf(1,[1 3.25 6.60 8.60 7.45 3.95 1]);
new=tf(1,coeff);
[yold,told]=step(old,50);
[ynew,tnew]=step(new,50);
plot(told,yold,'b','LineWidth',1)
axis([3,18,0.95,1.05])
hold on,plot(tnew,ynew,'r','LineWidth',3),hold off
legend('Old','New',4),grid on
图8.6.5.2-1-1
表8.6.5.2-1 ITAE(单点)标准型新系数(黑体)和相应老“经典”系数对照
阶次
ITAE值
传递函数分母多项式系数
2
1.99
1.952
1 1.4 1
1 1.5 1
3
3.144
3.138
1 1.75 2.15 1
1 1.78 2.17 1
4
4.626
4.591
1 2.10 3.40 2.75 1
1 1.95 3.35 2.65 1
5
7.155
6.319
1 2.80 5.00 5.50 3.40 1
1 2.07 4.49 4.67 3.26 1
6
9.656
8.333
1 3.25 6.60 8.60 7.45 3.95 1
1 2.17 5.63 6.96 6.79 3.74 1
7
15.003
10.628
1 4.48 10.42 15.05 15.54 10.64 4.580 1
1 2.22 6.750 9.360 11.58 8.680 4.320 1
8
18.680
13.222
1 5.20 12.80 21.60 25.75 22.20 13.30 5.15 1
1 2.53 8.020 12.72 17.98 16.70 11.49 4.86 1
表8.6.5.2-2 ITAE(区域)标准型系数
阶次
ITAE均值
传递函数分母多项式系数
2
1.999
1 1.50.2 1
3
3.241
1 1.820.15 2.190.12 1
4
5.597
1 2.320.41 3.600.31 2.800.24 1
5
10.74
1 4.250.46 6.480.78 6.850.75 3.840.32 1
6
11.99
1 2.770.35 6.910.49 8.730.65 8.140.61 4.090.41 1
7
17.86
1 2.540.34 9.130.25 14.970.35 17.310.45 12.360.30 5.240.53 1
8
19.92
1 3.770.14 8.350.12 16.150.15 17.690.09 18.340.18 10.740.14 4.770.65 1
l 数值计算方面的考虑
l 微分方程解算器Solver
l ODE45和ODE23运作机理简要
l ODE113运作机理简要
l ODE15S和ODE23S运作机理简要
l 不同解算器处理Stiff系统时表现
【例8.7.1.4-1】求微分方程在时的解。本例演示:对于Stiff方程,如果解算方法选择不当将产生严重后果。
(1)
xsym=dsolve('D2x+100*Dx+0.9999*x=0','x(0)=1,Dx(0)=0','t')
dxsym=diff(xsym,'t')
xsym =
9999/9998*exp(-1/100*t)-1/9998*exp(-9999/100*t)
dxsym =
-9999/999800*exp(-1/100*t)+9999/999800*exp(-9999/100*t)
(2)
图8.7.1.4-1-1
(3)
t=(0:5000)/10;x=eval(char(dxsym));
Tspan=500;
opts=simset('Solver','ode45');
[tt1,xx1,s]=sim('exm080714_1',Tspan,opts);
opts=simset('Solver','ode15s');
[tt2,xx2,s]=sim('exm080714_1',Tspan,opts);
plot(t,x,'k',tt1,xx1(:,2),'b:',tt2,xx2(:,2),'r-.')
axis([246 247 -8.55e-4 -8.35e-4])
legend('Symbolic','ODE45','ODE15S',0)
ns1=length(xx1)
ns2=length(xx2)
ns1 =
15072
ns2 =
101
图8.7.1.4-1-2
l 积分步长和容差
l 积分步长的选择
【例8.7.2.1-1】以例8.5.2-1的多采样模型exm08052_1.mdl为基础。试验解算器、工作模式、采样转移模块的影响。
l 计算容差的选择
l 代数环问题
l 代数环的形成
【例8.7.3.1-1】研究方程组的解算问题。
(1)
图8.7.3.1-1
l 代数环的处理
【例8.7.3.2-1】本例以例8.7.3.1-1为基础。演示:通过重组模型,直接消除代数环,建立等价模型。
(1)
(2)
图8.7.3.2-1
【例8.7.3.2-2】本例以例8.7.3.1-1为基础。演示:(A)利用“记忆”模块中断代数环。(B)“记忆”模块的副作用。(C)与前两个模型做性能比较。
(1)
图8.7.3.2-2-1
(2)
clear all
tic;[t1,x1,y1]=sim('exm080731_1',5);T1=toc;
tic;[t2,x2,y2]=sim('exm080732_1',5);T2=toc;
tic;[t3,x3,y3]=sim('exm080732_2',5);T3=toc;
disp([blanks(4),'有代数环',blanks(3),'无代数环',blanks(3),'带记忆块'])
disp([T1,T2,T3])
plot(t1,y1,'g','LineWidth',6),hold on
plot(t2,y2,'r','LineWidth',2)
plot(t3,y3,'b'),hold off
legend('with loop','without loop','memory',4)
Warning: Block diagram 'exm080731_1' contains 1 algebraic loop(s).
Found algebraic loop containing block(s):
'exm080731_1/k3'
'exm080731_1/Sum'
'exm080731_1/k2'
'exm080731_1/Sum1' (algebraic variable)
有代数环 无代数环 带记忆块
0.2800 0.2200 0.1100
图8.7.3.2-2-2
l S函数模块
l 概述
l SIMULINK的运行机理
l 用M文件表述的S函数
l S函数的模板程序
l S函数模块的创建和使用
【例8.8.3.2-1】本例演示:(1)用S函数模块为图8.8.3.2-1所示单摆构造系统动力学模型;(2)利用SIMULINK研究该单摆摆角的运动曲线;(3)用S函数动画模块表现单摆的运动。
(1)
(2)
(3)
[simpendzzy.m]
function [sys,x0,str,ts] = simpendzzy(t,x,u,flag,dampzzy,gravzzy,angzzy)
%
%
%
%
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes(angzzy);
case 1,
sys=mdlDerivatives(t,x,u,dampzzy,gravzzy);
case 2,
sys=mdlUpdate(t,x,u);
case 3,
sys=mdlOutputs(t,x,u);
case 9,
sys=mdlTerminate(t,x,u);
otherwise
error(['Unhandled flag = ',num2str(flag)]);
end
% ------ mdlInitializeSizes ------------------------
function [sys,x0,str,ts]=mdlInitializeSizes(angzzy)
sizes = simsizes;
sizes.NumContStates = 2;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = angzzy;
str = [ ];
ts = [0, 0];
% -----mdlDerivatives -----------------------------
function sys=mdlDerivatives(t,x,u,dampzzy,gravzzy)
dx(1)=-dampzzy*x(1)-gravzzy*sin(x(2))+u;
dx(2)=x(1);
sys =dx ;
% -----mdlUpdate --
展开阅读全文