simulink之S函数--实践

  若系统G(s)=1/(3s+2),乳选取状态变量x=y,则其状态空间方程可表示为

dx = (-2x + u)/3 且 y = x,对系统建立S-函数,绘制该控制系统的阶跃响应曲线。

零、分析,其实该题若不是要求建立S-函数,绘制系统的阶跃响应曲线,完全可以直接用系统的传递函数,采用如下方式,直接完成的。

一、传递函数直接建模如下:

仿真结果:

但是,既然要求建立S-函数,那就开始吧。

二、建立S-函数,通过状态方程实现阶跃函数的绘制

1、S-函数如下:

 1 function[sys, x0, str, ts] = sFunSam1(t, x, u, flag, xInitial)
 2     switch flag
 3         case 0
 4             [sys, x0, str, ts] = mdlInitializeSizes(xInitial);
 5         case 1
 6             sys = mdlDerivatives(t, x, u);
 7         case 2
 8             sys = mdlUpdate(t, x, u);
 9         case 3
10             sys = mdlOutputs(t, x, u);
11         case 4
12             sys = mdlGetTimeOfNextVarHit(t, x, u);
13         case 9
14             sys = mdlTerminate(t, x, u);
15         otherwise
16             error(['Unhandled flag = ', num2str(flag)])
17     end
18 
19     function [sys, x0, str, ts] = mdlInitializeSizes(xInitial)
20         sizes = simsizes;
21         sizes.NumContStates = 1;
22         sizes.NumDiscStates = 0;
23         sizes.NumOutputs = 1;
24         sizes.NumInputs = 1;
25         sizes.DirFeedthrough = 0;
26         sizes.NumSampleTimes = 1;
27         sys = simsizes(sizes);
28         x0 = xInitial;
29         str = [];
30         ts = [0 0];
31 
32     function sys = mdlDerivatives(t, x, u)
33         dx = (-2 * x + u)/3;
34         sys = dx;
35 
36     function sys = mdlUpdate(t, x, u)
37         sys = [];
38 
39     function sys = mdlOutputs(t, x, u)
40         sys = x;
41 
42     function sys = mdlGetTimeOfNextVarHit(t, x, u)
43         sampleTime = 1;
44         sys = t + sampleTime;
45 
46     function sys = mdlTerminate(t, x, u)
47         sys = [];

在初始换子函数中引入了一个xInitial参数,参数的值通过matlab命令窗口输入即可

2、建模如上:

模块的名称是second.mdl,我的S-函数名称为sFunSam1.m,这里的S-函数模块的加入是通过Library Browser--Simulink--User-Defined Functions--S-Function加入的,修改属性只是浏览到sFunSam1.m文件的位置是没有什么用处的,需要将S-函数的目录加入到matlab的path中才可以的。切结仿真模型和S-函数不要同名,我这里是不行的。

3、仿真结果:

  如果直接运行,可能会出现:

Invalid setting in 'second/S-Function' for parameter 'xInitial'.
Caused by:
Error evaluating parameter 'xInitial' in 'second/S-Function'
Unrecognized function or variable 'xInitial'.
Variable 'xInitial' has been deleted from base workspace.
Suggested Actions
Load a file into base workspace.
Fix
Create a new variable.
Fix

  在matlab的命令窗口输入:

  clear

  xInitial = 0;

就是让worksapce中有xInitial中有值即可:

好了,也就是说,无论是从系统的传递函数,还是从系统的状态方程,因为是同一个系统的不同描述而已,因此系统的阶跃响应曲线是完全一模一样的。

posted @ 2023-06-08 16:30  叕叒双又  阅读(847)  评论(0编辑  收藏  举报