文章结构
前言
常微分方程求解
传递函数与状态方程
最小二乘法
模糊控制
模糊控制器的设计
模糊控制器的仿真
曲线绘制
结束语
前言
作为控制学科的学生,在一年级的课程当中会涉及到一些MATLAB相关的作业,会用到一些常用的方法,如求解常微分方程、传递函数与状态空间方程、最小二乘法、模糊控制、曲线绘制等。为避免重复造轮子,还是有必要将这些简单的方法记录下来的。那么话不多说,接下来开始分部分进行叙述。
常微分方程求解
MATLAB内置有不少求解常微分方程的函数,如ode23、ode45、ode113、ode23t、ode15s、ode23s、ode23tb等,各个函数使用不同的方法求解,精度与速度也有一定的区别,其中最常用的是ode45。以ode45举例来说,假设我们需要求解方程dy=-y+y^2,那么使用相应的代码如下:
odefun=@(t,y)-y+y^2; % 微分方程dy=-y+y^2
y0=[0.5]'; % 变量初值
[t,y]=ode45(odefun,[0 5],y0); % 调用ode45求解
如果需要求解常微分方程组,那么可单独定义odefun函数,再调用ode45求解。例如求解如下微分方程组:
dy1=y2
dy2=6sin(t)-0.1y2-y1^5
则相应的MATLAB代码如下:
% @odefun.m
function dy = odefun(t, y)
dy=zeros(2,1);
dy(1)=y(2);
dy(2)=6*sin(t)-0.1*y(2)-y(1)^5;
end
% @ode45test.m
y0=[0.5 0.5]';
[t,y]=ode45(odefun,[0 5],y0);
传递函数与状态方程
传函和状态方程可以说是控制专业中接触最频繁的概念之一,MATLAB也内置了近乎完善的一套方法来处理相关的问题,可以说是五花八门,应有尽有。这里我仅记录最近两次作业涉及到的一点方法,其他的方法暂无讨论。
首先是根据数组num,den定义传递函数G,用到的方法是tf。例如传递函数为G=(s+5)/(s^2+5s+3),那么定义传递函数的代码如下:
num=[1 5];
den=[1 5 3];
G=tf(num,den);
如需通过传递函数获取对应的状态空间方程,则可使用tf2ss函数进行转换,对应的也可使用ss2tf函数进行状态空间方程到传递函数的变换,具体代码如下:
[A,B,C,D]=tf2ss(num,den);
[num,den]=ss2tf(A,B,C,D,iu); % iu指定获取第几个输出对应的传递函数(对应传递函数阵的情况)
如需获取传递函数的阶跃响应,可使用step函数求得,具体的代码如下:
[y,t]=step(G,[0 10]); % 获取10秒内的传递函数阶跃响应
上面的式子是直接求取一段时间内的阶跃响应,且输入固定为1。但如需用递推的方式求得指定输入信号作用下的系统输出时,可首先转换传递函数到状态空间方程,再调用c2d函数对状