三、简单单摆S-函数仿真实验
使用S-函数来对一个单摆系统进行仿真,主要演示以下三个方面:
(1)利用S-函数对单摆系统进行建模
(2)利用simulink进行仿真,研究单摆的位移
(3)利用S-函数动画来演示单摆的运动
下载 (7.29 KB)
2009-3-31 19:28
(1)单摆的动力学方程为
下载 (1.23 KB)
2009-3-31 19:28
其中M是摆球质量,u是外力,Kd阻尼系数,Fg重力
(2)将系统动力学方程转换为状态方程
下载 (2.91 KB)
2009-3-31 19:28
(3)根据状态方程,在模板的基础上编写S-函数
我们根据状态方程并结合题目分析下
输入:u,故1个
输入:θ,故1个
连续状态变量:x1=θ和x2=θ',故2个
离散状态变量:由于是连续系统,故0个
直通前向馈路:由于输出θ与输入u没有任何联系,故没有直接馈通,所有为0
采样时间数量:在这个系统中我们统一成一个就可以了,故1个
状态变量初值:也就是x1=θ和x2=θ'的初值,这里我们取初始角度60°,速度为0,故x0=[x1 x2]=[60 0]
采样时间:由于是连续系统,故ts=[0 0]function [sys,x0,str,ts] = Single_Pendulum_Demo(t,x,u,flag,M,xx0,Kd,g)
%M=varargin{1};%摆球质量
%xx0=varargin{2};%状态变量初值
%Kd=varargin{3};%阻尼系数
%g=varargin{4};%重力加速度
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes(xx0);
case 1,
sys=mdlDerivatives(t,x,u,Kd,g,M);
case 2,
sys=mdlUpdate(t,x,u);
case 3,
sys=mdlOutputs(t,x,u);
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9,
sys=mdlTerminate(t,x,u);
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts]=mdlInitializeSizes(xx0)
sizes = simsizes;
sizes.NumContStates = 2;%2个连续状态
sizes.NumDiscStates = 0;%0个离散状态
sizes.NumOutputs = 1;%1个输出变量
sizes.NumInputs = 1;%1个输入变量
sizes.DirFeedthrough = 0;%没有直接馈通,简单的说就是输出y中有没有输入参数u
sizes.NumSampleTimes = 1;%采用时间个数
sys = simsizes(sizes);
x0 = s0;%状态变量初值
str = [];%Matlab自已预留的,全部保留空着,不要动
ts = [0 0];%[0 0]适用于连续系统
function sys=mdlDerivatives(t,x,u,Kd,g,M)
%状态变量一阶导数表达式
sys = [x(2);-Kd*x(2)-M*g*sin(x(1))+u];
function sys=mdlUpdate(t,x,u)
%由于是连续系统,故不需填写
sys = [];
function sys=mdlOutputs(t,x,u)
%输入变量是摆角θ,即x(1)
sys = x(1);
function sys=mdlGetTimeOfNextVarHit(t,x,u)
%由于是连续系统这个用不到,可以不理它
sampleTime = 1;
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u)
%模块解决没有什么操作,也不需要理它
sys = [];
复制代码(4)使用simulink建模
在sink中拖出scop,scouce中拖出sine wave,user-defined function中拖出S-function,并如下如连接三个模块
下载 (34.54 KB)
2009-3-31 20:11
双击sine wave输入设置属性
下载 (38.53 KB)
2009-3-31 20:11
双击S-Function,如下设置参数
下载 (68.64 KB)
2009-3-31 20:11
运行仿真,得到以下结果
下载 (29.69 KB)
2009-3-31 20:11