Van der pol方程所描绘系统的仿真。
% 在编写S-函数之前要确定系统
% 是否有状态变量、
% 是连续还是离散状态以及输入输出个数、
% % 是否传入参数、
% 采样时间等因素,
% 针对不同的系统进行初始化、编写不同的子函数。
function[sys,x0,str,ts]=text1(t,x,u,flag)
% t是采样时间,代表当前的仿真时间,这个输入参数通常用于决定下一个采样时刻,
% 或者在多采样速率系统中,用来区分不同的采样时刻点,并据此进行不同的处理。
% x是状态变量,这个参数是必须的,甚至在系统中不存在状态时也是如此。
% u是输入(是做成simulink模块的输入),表示输入向量。
% flag是仿真过程中的状态标志(以它来判断当前是初始化还是运行等);
% sys输出根据flag的不同而不同,是一个通用的返回参数,它所返回值的意义取决于flag的值。
% x0是状态变量的初始值,是初始的状态值(没有状态时是一个空矩阵[]),
% 这个返回参数只在flag值为0时才有效,其他时候都会被忽略。
% str是保留参数(mathworks公司还没想好该怎么用它,嘻嘻,一般在初始化中将它置空就可以了,str=[]),
% ts是一个1×2的向量,ts(1)是采样周期,ts(2)是偏移量。
switch flag, %判断flag,看当前处于哪个状态
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
% flag=0表示处于初始化状态,此时用函数mdlInitializeSizes进行初始化
% sys是一个结构体,用它来设置模块的一些参数.如果sys=[]表示没有输出
case 1,
sys=mdlDerivatives(t,x,u);
% flag=1表示此时要计算连续状态的微分
% flag=2表示此时要计算下一个离散状态
case 3,
sys=mdlOutputs(t,x,u);
% flag=3表示此时要计算输出
% flag=4表示此时要计算下一次采样的时间,只在离散采样系统中有用
case {2,4,9}
sys=[];
otherwise
error(‘Simulink:blocks:unhandledFlag’, num2str(flag));%模板
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes; %用于设置模块参数的结构体用simsizes来生成
sizes.NumContStates = 2; %连续状态个数
sizes.NumDiscStates = 0; %离散状态个数
sizes.NumOutputs = 2; %输出个数
sizes.NumInputs = 0; %输入个数
sizes.DirFeedthrough = 0; %模块是否存在直接贯通(我的理解是只要输出跟输入有关,只要你在输出中,用到输入,则DirFeedthrough 必须为1)
sizes.NumSampleTimes = 1; %采样时间个数,至少一个
sys = simsizes(sizes); %将size结构传到sys中
x0 = [0.25 0.25]; %初始状态向量,由传入的参数决定,没有为空,状态变量设置为空,表示没有状态变量
str = []; %是保留参数(mathworks公司还没想好该怎么用它,一般在初始化中将它置空就可以了,str=[])
ts = [0 0]; %设置采样时间,这里是连续采样,偏移量为0,采样周期设为0表示是连续系统
function sys=mdlDerivatives(t,x,u)% flag=1表示此时要计算连续状态的微分
sys(1)=x(1).*(1-x(2).^2)-x(2);
sys(2)=x(1);
function sys=mdlOutputs(t,x,u) % flag=3表示此时要计算输出
sys=x;