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中有值即可:
好了,也就是说,无论是从系统的传递函数,还是从系统的状态方程,因为是同一个系统的不同描述而已,因此系统的阶跃响应曲线是完全一模一样的。
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。