matlab+Simulink实现微分方程求解及子系统封装

1.内容

(一)、Lorenz模型的状态方程表示为:

初值为

要求:

1.建立脚本,采用四阶五级的(Runge-Kutta-Felhberg, RKF)方法,调用ode45()方法求解该方程;

2.在Simulink下完成下列要求:

     (1) 在Simulink下为上述方程组建立仿真模型,保存在st1.mdl中;

     (2)仿真时间tout初值为0,终值根据实际情况而定,在图形窗口中设置4个子窗口,将x1(t),x2(t),x3(t)和相三维图分别绘在其中:

        (a) 给该图形窗口增加标题“Lorenz模型的状态方程仿真图形”;

        (b)给每个子窗口加坐标轴名称。

     (3)将tout, x1(t),x2(t),x3(t)中的数据分别保存到变量t,x1,x2及x3中,将这四个变量保存到st1_data.mat数据文件中。

(二)、下面给出的微分代数方程表示为:

初始条件为x10=0.8,  x20=x30=0.1

要求:

1.建立脚本,采用刚性方程求解算法ode15()函数求解该方程;

2.在Simulink下完成下列要求

(1)在Simulink下为上述一阶微分方程组建立仿真模型,保存在st1.mdl中;

(2)利用(1)中的仿真模型,在Simulink下调用ode15( )方法进行仿真求解x1(t), x2(t)和x3(t),仿真时间tout初值为0,终值为20,在图形窗口中设置2×2四个子窗口,将x1(t),x2(t),x3(t)和x(t)(包含x1(t), x2(t)和x3(t)三个变量),分别绘在四个子窗口中,并包括:

       (a)给该图形窗口增加标题“微分代数方程仿真图形”;(b)给每个子窗口加坐标轴名称。

(3)  将tout,x1(t),,x2(t)和x3(t)中的数据分别保存到变量t,y1,y2和y3中,将这四个变量保存到st1_data.mat数据文件中。

(三)、子系统封装及仿真

(1)将图1中的PID Controller模型图在Simulink下封装成子系统;其中:

图1 PID Controller模型图

(2)将(1)中的子系统用在图2所示的仿真模型(保存到st2.mdl)中,在Simulink下调用ode45( )方法进行仿真求解单位阶跃响应y(t)(包括y(t)响应曲线和tout在0-20秒内的y(t)的值)。

    

图2  PID控制系统仿真图

   Kp=11.520,Ti=0.658,Td=0.164,Step为单位阶跃函数。如果仿真输出超调量过大,希望调整以上参数以获取更好的动态性能。

2. 过程

(一)、Lorenz模型

1. 建立脚本,采用四阶五级的(Runge-Kutta-Felhberg, RKF)方法,调用ode45()方法求解该方程;

脚本:

clear;

f=@(t,x)[-8*x(1)/3+x(2)*x(3);-10*x(2)+10*x(3);-x(1)*x(2)+28*x(2)-x(3)];

t=50;

x0=[0;0;1e-10];

[t,x]=ode45(f,[0,t],x0); 

x1=x(:,1);

x2=x(:,2);

x3=x(:,3);

plot3(x1,x2,x3);%绘制相三维图

xlabel('x1(t)'),ylabel('x2(t)'),zlabel('x3(t)');

title('Lorenz模型的状态方程仿真图形');

运行图形:

图3 Lorenz模型三维仿真图

2. Simulink仿真

    Lorenz仿真模型:

图4 Lorenz仿真模型

设置相关属性:

形式改为数组形式

图5 修改为数组形式

调用ode45( )方法进行仿真求解x1(t), x2(t)和x3(t),仿真时间tout初值为0,终值为50

图6 修改方法以及时间

设置初值为

图7 修改x1,x2,x3初始值

脚本实现绘图保存数据等功能:

t=tout;

x1=yout(:,1);

x2=yout(:,2);

x3=yout(:,3);

subplot(2,2,1);%设置2*2四个子窗口

plot(t,x1);%绘制x1(t)曲线

xlabel('时间t'),ylabel('x1(t)');%设置坐标轴

subplot(2,2,2);

plot(t,x2);%绘制x2(t)曲线

xlabel('时间t'),ylabel('x2(t)');

subplot(2,2,3);

plot(t,x3);%绘制x3(t)曲线

xlabel('时间t'),ylabel('x3(t)');

subplot(2,2,4);

plot3(x1,x2,x3);%绘制相三维图

xlabel('x1(t)'),ylabel('x2(t)'),zlabel('x3(t)');

suptitle('Lorenz模型的状态方程仿真图形');

save st1_data t x1 x2 x3;%保存

    仿真图形

图8 Lorenz模型仿真图形

比较脚本和仿真的运行图形可以发现它们是有区别的

在脚本和仿真模型都运行过后,查看工作区:

图9 工作区

可以发现,脚本中运行后时间和结果长度都是2597,而仿真中tout和yout长度都是530,这导致所绘制的图形有所不同,经过查阅得知可能与ode45为变步长算法有关,自动根据连续状态变化速度,来改变步长,但是具体原因还未弄清。但是可以验证它们的趋势一致,由此可见,ode45脚本解方程与仿真解方程两种方式都是没有问题的。

    保存的数据文件st1_data.mat

图10 保存的st1_data.mat文件

(二)微分方程

1. 建立脚本,采用刚性方程求解算法ode15()函数求解该方程;

脚本:

clear;

f=@(t,x)[-0.2*x(1)+x(2)*x(3)+0.3*x(1)*x(2);2*x(1)*x(2)-5*x(2)*x(3)-2*x(2)*x(2);x(1)+x(2)+x(3)-1];

A=[1 0 0;0 1 0;0 0 0];

options=odeset;

options.Mass=A;

x0=[0.8;0.1;0.1];

[t,x]=ode15s(f,[0 20],x0,options); 

ph=plot(t,x);

xlabel('时间t'),ylabel('x(t)');

legend([ph(1),ph(2),ph(3)],'x1(t)','x2(t)','x3(t)');

suptitle('微分代数方程仿真图形');

仿真图形:

图11 微分代数方程仿真图形

2. Simulink仿真

    微分代数方程仿真模型:

图12 微分代数方程仿真模型

设置相关属性:

形式改为数组形式

图13 修改输出形式

调用ode15( )方法进行仿真求解x1(t), x2(t)和x3(t),仿真时间tout初值为0,终值为20

图14 修改调用方法以及时间

设置初值为

图15 修改初始值

脚本实现绘图保存数据等功能:

脚本:

t=tout;

x1=yout(:,1);

x2=yout(:,2);

x3=yout(:,3);

subplot(2,2,1);%设置2*2四个子窗口

plot(t,x1);%绘制x1(t)曲线

xlabel('时间t'),ylabel('x1(t)');%设置坐标轴

subplot(2,2,2);

plot(t,x2);%绘制x2(t)曲线

xlabel('时间t'),ylabel('x2(t)');

subplot(2,2,3);

plot(t,x3);%绘制x3(t)曲线

xlabel('时间t'),ylabel('x3(t)');

subplot(2,2,4);

ph=plot(t,yout);%绘制x(t)曲线

xlabel('时间t'),ylabel('x(t)');

legend([ph(1),ph(2),ph(3)],'x1(t)','x2(t)','x3(t)');

suptitle('微分代数方程仿真图形');

y1=x1;y2=x2;y3=x3;

save st1_data t y1 y2 y3;%保存

仿真图形

图16 微分代数方程仿真图形

可以看出与ode15脚本所绘制图形一致,表明两种解代数方程的方法均有效实现

保存的数据文件st1_data.mat

图17 保存的文件

(三)、子系统封装及仿真

    (1)将图1中的PID Controller模型图在Simulink下封装成子系统

图18 子系统封装内部结构

      图19 封装后

(2)将(1)中的子系统用在图2所示的仿真模型(保存到st2.mdl)中,在Simulink下调用ode45( )方法进行仿真求解单位阶跃响应y(t)(包括y(t)响应曲线和tout在0-20秒内的y(t)的值)。

    G(s)值设置:

图20 设置G(s)值

    仿真模型:

图21 仿真模型

鼠标右击simulink子系统mask如下图所示

图22 创建mask

设置相关参数的值:

图23 修改参数初始值

设置起始到终止时间0-20,调用ode45

图24 修改方法以及时间

此时示波器中仿真图形:

图25 Kp=11.52,Ti=0.658,Td=0.164

将Kp值减小为8,所的仿真图形:

图26 Kp=8,Ti=0.658,Td=0.164

超调量减小

继续将Kp值减小为4,所的仿真图型如下:

图27 Kp=4,Ti=0.658,Td=0.164

可以看出此时超调量几乎没有了,且曲线变得更加平缓

而若将Kp值升高为15:

图28 Kp=15,Ti=0.658,Td=0.164

超调量将会增大,且曲线上升的趋势更加陡峭

保持Kp值为15不变,此时如果我们将Ti值增加到1:

图29 Kp=11.52,Ti=1,Td=0.164

超调量明显减小,系统响应趋于稳态值的速度加快

此时继续升高Ti至1.5:

图30 Kp=11.52,Ti=1.5,Td=0.164

曲线无超调,初期曲线陡峭,然后快速平缓趋于稳态

将Ti减小至0.5:

图31 Kp=11.52,Ti=0.5,Td=0.164

曲线振荡,稳定性降低

此时,再将Td值增加至1:

图32 Kp=11.52,Ti=0.658,Td=1

曲线振荡减弱

而若将Td减少至0.5:

图33 Kp=11.52,Ti=0.658,Td=0.5

振荡幅度增加

3. 结果分析

通过上述过程分析可以发现,随着Kp的增大系统的响应速度越快,系统的调节精度越高,但是系统易产生超调,系统的稳定性变差,甚至会导致系统不稳定。Kp取值过小,调节精度降低,响应速度变慢,调节时间加长,使系统的动静态性能变坏。Ti可以消除系统的稳态误差。Ti越大系统的稳态误差消除的越快,但Ti如果过大,在响应过程的初期会产生积分饱和现象。若Ti过小,系统的稳态误差将难以消除,影响系统的调节精度,系统可能会更加不稳定,此时可以增加Td的值改善系统的动态性能,抑制响应过程中出现的振荡偏差,系统的抗干扰性能增强。

  • 23
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是使用Matlab Simulink微分方程的步骤: 1. 打开Simulink并创建一个新模型。 2. 在Simulink库浏览器中,选择Simscape Multibody > Math Operations > Mathematical Functions > MATLAB Function。 3. 将MATLAB Function块拖到模型中。 4. 双击MATLAB Function块以打开编辑器。 5. 在编辑器中,输入以下代码: function dxdt = fcn(t,x) dxdt = 2*sin(t) - 4*x; 6. 单击“保存并关闭”以关闭编辑器。 7. 在Simulink库浏览器中,选择Simscape Multibody > Sources > Sine Wave。 8. 将正弦波块拖到模型中。 9. 将正弦波块的“Amplitude”参数设置为1。 10. 将正弦波块的“Frequency”参数设置为1。 11. 在Simulink库浏览器中,选择Simscape Multibody > Sinks > Scope。 12. 将Scope块拖到模型中。 13. 连接MATLAB Function块和Scope块。 14. 右键单击MATLAB Function块并选择“Block Parameters”。 15. 在“Block Parameters”对话框中,选择“Solver”选项卡。 16. 将“Solver Type”设置为“ode15s”。 17. 单击“确定”以关闭“Block Parameters”对话框。 18. 单击“运行”以运行模型并显示结果。 另外,使用Matlab的dsolve函数也可以解微分方程。以下是使用dsolve函数解微分方程的步骤: 1. 打开Matlab并创建一个新脚本。 2. 输入以下代码: syms x(t) eqn = diff(x,t) == 2*sin(t) - 4*x; cond = x(0) == 0; xSol(t) = dsolve(eqn,cond); 3. 单击“运行”以运行脚本并计算解。 4. 输入以下代码以绘制解: fplot(xSol,[0 10]) xlabel('t') ylabel('x') grid on
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

deleteeee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值