1.内容
(一)、Lorenz模型的状态方程表示为:
![](https://file.jishuzhan.net/article/1754068698613682178/d03b9f498eba425b0669e6d471f69a98.webp)
初值为
要求:
1.建立脚本,采用四阶五级的(Runge-Kutta-Felhberg, RKF)方法,调用ode45()方法求解该方程;
2.在Simulink下完成下列要求:
(1) 在Simulink下为上述方程组建立仿真模型,保存在st1.mdl中;
(2)仿真时间tout初值为0,终值根据实际情况而定,在图形窗口中设置4个子窗口,将x 1 (t), x 2 (t), x 3 *(t)*和相三维图分别绘在其中:
(a) 给该图形窗口增加标题"Lorenz模型的状态方程仿真图形";
(b)给每个子窗口加坐标轴名称。
(3)将tout, x 1 (t), x 2 (t), x 3 *(t)*中的数据分别保存到变量t,x1,x2及x3中,将这四个变量保存到st1_data.mat数据文件中。
(二)、下面给出的微分代数方程表示为:
![](https://file.jishuzhan.net/article/1754068698613682178/3a727a5d5f99173146cb6ca1d7cfaf4d.webp)
初始条件为x 10=0.8, x 20=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下封装成子系统;其中:
![](https://file.jishuzhan.net/article/1754068698613682178/55f5e426fa964af6ad6b8c14c782fbe0.webp)
![](https://file.jishuzhan.net/article/1754068698613682178/48de7ae194d05be892b3ce32efc34d44.webp)
图1 PID Controller模型图
(2)将(1)中的子系统用在图2所示的仿真模型(保存到st2.mdl)中,在Simulink下调用ode45( )方法进行仿真求解单位阶跃响应y(t)(包括y(t)响应曲线和tout在0-20秒内的y(t)的值)。
![](https://file.jishuzhan.net/article/1754068698613682178/0e2f84d04e91e2e268b0951c3980b264.webp)
图2 PID控制系统仿真图
![](https://file.jishuzhan.net/article/1754068698613682178/5f606e38438466754c1c1c14d706ff3d.webp)
Kp=11.520,Ti=0.658,Td=0.164,Step为单位阶跃函数。如果仿真输出超调量过大,希望调整以上参数以获取更好的动态性能。
2. 过程
(一)、Lorenz模型
- 建立脚本,采用四阶五级的(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模型的状态方程仿真图形');
运行图形:
![](https://file.jishuzhan.net/article/1754068698613682178/2df6538b3a9d3b9c10e3618aee2c4437.webp)
图3 Lorenz模型三维仿真图
- Simulink仿真
Lorenz仿真模型:
![](https://file.jishuzhan.net/article/1754068698613682178/58059cce896b013071dcc997a97f51d6.webp)
图4 Lorenz仿真模型
设置相关属性:
形式改为数组形式
![](https://file.jishuzhan.net/article/1754068698613682178/479f03c547a6b2479d2f18f962778012.webp)
图5 修改为数组形式
调用ode45( )方法进行仿真求解x1(t), x2(t)和x3(t),仿真时间tout初值为0,终值为50
![](https://file.jishuzhan.net/article/1754068698613682178/90584dff911efb48c5e4666710e8871a.webp)
图6 修改方法以及时间
设置初值为
![](https://file.jishuzhan.net/article/1754068698613682178/a46d9c60db51249e306b88502a9ac132.webp)
![](https://file.jishuzhan.net/article/1754068698613682178/b8c1fc396fef5a8ca6c1713bdcb45481.webp)
![](https://file.jishuzhan.net/article/1754068698613682178/48592c89b6f45c8495be0e9a2359799d.webp)
图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;%保存
仿真图形
![](https://file.jishuzhan.net/article/1754068698613682178/126a1190b757895fbee1ed31097cfe12.webp)
图8 Lorenz模型仿真图形
比较脚本和仿真的运行图形可以发现它们是有区别的
在脚本和仿真模型都运行过后,查看工作区:
![](https://file.jishuzhan.net/article/1754068698613682178/9a97722461596f8842039971bff8f51d.webp)
图9 工作区
可以发现,脚本中运行后时间和结果长度都是2597,而仿真中tout和yout长度都是530,这导致所绘制的图形有所不同,经过查阅得知可能与ode45为变步长算法有关,自动根据连续状态变化速度,来改变步长,但是具体原因还未弄清。但是可以验证它们的趋势一致,由此可见,ode45脚本解方程与仿真解方程两种方式都是没有问题的。
保存的数据文件st1_data.mat
![](https://file.jishuzhan.net/article/1754068698613682178/e8dd483b65fa57842b14be97eadec5d7.webp)
图10 保存的st1_data.mat文件
(二)微分方程
- 建立脚本,采用刚性方程求解算法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('微分代数方程仿真图形');
仿真图形:
![](https://file.jishuzhan.net/article/1754068698613682178/a26eca01cdbcb92bc75d02140e4ffe46.webp)
图11 微分代数方程仿真图形
- Simulink仿真
微分代数方程仿真模型:
![](https://file.jishuzhan.net/article/1754068698613682178/c4abbe71a1435ba05332bf614c327688.webp)
图12 微分代数方程仿真模型
设置相关属性:
形式改为数组形式
![](https://file.jishuzhan.net/article/1754068698613682178/479f03c547a6b2479d2f18f962778012.webp)
图13 修改输出形式
调用ode15( )方法进行仿真求解x1(t), x2(t)和x3(t),仿真时间tout初值为0,终值为20
![](https://file.jishuzhan.net/article/1754068698613682178/1adbf34441c2c5414fd933ff489753d5.webp)
图14 修改调用方法以及时间
设置初值为。
![](https://file.jishuzhan.net/article/1754068698613682178/e62c3e4bcacd177fbbb345a2d5ff869a.webp)
![](https://file.jishuzhan.net/article/1754068698613682178/453646a6212052f420d8a84efe165309.webp)
![](https://file.jishuzhan.net/article/1754068698613682178/ef8322a2020e6b6cde58e26d819d0d9d.webp)
图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;%保存
仿真图形
![](https://file.jishuzhan.net/article/1754068698613682178/c475e7675b180a365adc4b530ed189e0.webp)
图16 微分代数方程仿真图形
可以看出与ode15脚本所绘制图形一致,表明两种解代数方程的方法均有效实现
保存的数据文件st1_data.mat
![](https://file.jishuzhan.net/article/1754068698613682178/379c510333848d576bb8a5c9db2abe75.webp)
图17 保存的文件
(三)、子系统封装及仿真
(1)将图1中的PID Controller模型图在Simulink下封装成子系统
![](https://file.jishuzhan.net/article/1754068698613682178/71c5f192d35a2f8d18be4393b4300026.webp)
图18 子系统封装内部结构
![](https://file.jishuzhan.net/article/1754068698613682178/30f0c88533b12d5d09d243e849207b06.webp)
图19 封装后
(2)将(1)中的子系统用在图2所示的仿真模型(保存到st2.mdl)中,在Simulink下调用ode45( )方法进行仿真求解单位阶跃响应y(t)(包括y(t)响应曲线和tout在0-20秒内的y(t)的值)。
G(s)值设置:
![](https://file.jishuzhan.net/article/1754068698613682178/6a43f177c64393766ebeaac2ff05fb80.webp)
图20 设置G(s)值
仿真模型:
![](https://file.jishuzhan.net/article/1754068698613682178/4ae4ee1d34d88abf789d5f652d0b361a.webp)
图21 仿真模型
鼠标右击simulink子系统mask如下图所示
![](https://file.jishuzhan.net/article/1754068698613682178/f246b3f2679de4bc37d64d4a89a009c1.webp)
图22 创建mask
设置相关参数的值:
![](https://file.jishuzhan.net/article/1754068698613682178/5049739036faee3ba7723d02d96017c5.webp)
图23 修改参数初始值
设置起始到终止时间0-20,调用ode45
![](https://file.jishuzhan.net/article/1754068698613682178/34552877a85af54d7166dd7d2f9693e2.webp)
图24 修改方法以及时间
此时示波器中仿真图形:
![](https://file.jishuzhan.net/article/1754068698613682178/cab8eb1d8ad4a1af816d32e79ac91e1f.webp)
图25 Kp=11.52,Ti=0.658,Td=0.164
将Kp值减小为8,所的仿真图形:
![](https://file.jishuzhan.net/article/1754068698613682178/d5d668f15d1ef091dd8ca908f68a45ef.webp)
图26 Kp=8,Ti=0.658,Td=0.164
超调量减小
继续将Kp值减小为4,所的仿真图型如下:
![](https://file.jishuzhan.net/article/1754068698613682178/82c88f3b827547632205dd1aeba14c42.webp)
图27 Kp=4,Ti=0.658,Td=0.164
可以看出此时超调量几乎没有了,且曲线变得更加平缓
而若将Kp值升高为15:
![](https://file.jishuzhan.net/article/1754068698613682178/b0604ec3cb676993738cfe62fb966109.webp)
图28 Kp=15,Ti=0.658,Td=0.164
超调量将会增大,且曲线上升的趋势更加陡峭
保持Kp值为15不变,此时如果我们将Ti值增加到1:
![](https://file.jishuzhan.net/article/1754068698613682178/8a5e8f3dbb29313958541053365408e0.webp)
图29 Kp=11.52,Ti=1,Td=0.164
超调量明显减小,系统响应趋于稳态值的速度加快
此时继续升高Ti至1.5:
![](https://file.jishuzhan.net/article/1754068698613682178/0f5bca045b847b8a2e75e2cbb3a97d27.webp)
图30 Kp=11.52,Ti=1.5,Td=0.164
曲线无超调,初期曲线陡峭,然后快速平缓趋于稳态
将Ti减小至0.5:
![](https://file.jishuzhan.net/article/1754068698613682178/92d4df851a4a17655e9138a713607ae7.webp)
图31 Kp=11.52,Ti=0.5,Td=0.164
曲线振荡,稳定性降低
此时,再将Td值增加至1:
![](https://file.jishuzhan.net/article/1754068698613682178/44b8d23c325d5d3ba71bbd63e4720803.webp)
图32 Kp=11.52,Ti=0.658,Td=1
曲线振荡减弱
而若将Td减少至0.5:
![](https://file.jishuzhan.net/article/1754068698613682178/2b36ba27175594d2dc456d770e8f4407.webp)
图33 Kp=11.52,Ti=0.658,Td=0.5
振荡幅度增加
3. 结果分析
通过上述过程分析可以发现,随着Kp的增大系统的响应速度越快,系统的调节精度越高,但是系统易产生超调,系统的稳定性变差,甚至会导致系统不稳定。Kp取值过小,调节精度降低,响应速度变慢,调节时间加长,使系统的动静态性能变坏。Ti可以消除系统的稳态误差。Ti越大系统的稳态误差消除的越快,但Ti如果过大,在响应过程的初期会产生积分饱和现象。若Ti过小,系统的稳态误差将难以消除,影响系统的调节精度,系统可能会更加不稳定,此时可以增加Td的值改善系统的动态性能,抑制响应过程中出现的振荡偏差,系统的抗干扰性能增强。