系统建模与仿真基础-欧拉法、龙格库塔法Matlab

系统建模与仿真基础-欧拉法、龙格库塔法 附Matlab代码

(本人也在不断学习中,若有错误,欢迎大家批评指正!)

1.系统试验研究方法

1.1解析法

  纯理论,比如将实际模型等效成如图所示模型,进而得到描述该系统动态过程的二级常微分方程。

悬挂系统动力学模型
二阶微分方程

1.2实验法

  在实际系统上利用仪器仪表与装置,给系统施加一个信号,通过测量系统响应来确定系统性能。

1.3仿真实验法

  在模型上进行系统性能分析与研究,模型分为物理模型和数学模型。我们重点讨论数学模型的数字仿真问题。

2.建模三要素

  1. 目的要明确
  2. 方法要恰当
  3. 结果要验证

2.1 建模方法

a.机理建模(白盒法):对内部结构或特性清楚的系统,依据基本的物理定律建立数学模型。
b.实验建模(黑盒法):对内部结构或特性不清楚的系统,根据人工经验或试验得到数据,再经分析、归纳等推理建立系统模型
c.综合建模:在实际工作中通常采用多种方法混合应用。

b.实验建模(黑盒法):

1.频率特性法(自动控制系统中所学到的知识,后面有时间的话,或许会专门写一篇文章讲解一下)
2.系统辨识法:三要素–数据、假设模型、准则(现代控制系统中所学到的知识,后面有时间的话,或许会专门写一篇文章讲解一下)
系统辨识建模的基本原理

仿真中最常用的数值积分法

  1. 欧拉法
  2. 隐式欧拉法
  3. 龙格-库塔法
    在这里插入图片描述
    在这里插入图片描述
    写代码时,根据上述公式来写即可。(其他博客可能与之有些出入,但本质相同)

显示(向前)欧拉法

几何解释:欧拉公式用矩形面积近似代替积分面积。步距DT越小,精度越高。
在这里插入图片描述

隐式(向后)欧拉法

几何解释:与显示欧拉公式同理,还是用矩形面积近似代替积分面积只不过近似代替的方式有变化,如下图所示。
在这里插入图片描述

龙格-库塔法

在这里插入图片描述
(这里借用网上图片,具体来源记不清了,若有侵权,联系我,我会删除)
龙格-库塔法要求所求的解具有较好的光滑性。

代码(例题)

例1:对于前述弹性阻尼系统模型:
在这里插入图片描述
MATLAB程序如下:

clear; 
X1= 0; X2= 0; 
M= 1; K= 1; B=1;u =1.0; ST=20; DT=0.1;
NP = ST / DT; 
for i=1:NP
      F1=X2;   F2=-K/M*X1-B/M*X2+u/M;
     Y(i)=X1;
     X1 = X1 + DT * F1;   X2 = X2 + DT * F2; 	
 end
 plot((1:NP)*DT,Y);
 xlabel('t');ylabel('F(t)');grid;
 title('弹性阻尼系统');	

采用欧拉公式求解:

clear;  %清空内存变量
A=[0 1;-1 -1]; B=[0;1];C=[1 0];%A B C X Y初值
X =[0;0]; u=1; % X 初值,u的大小
ST=20; DT=0.01; NP=ST/DT; %仿真时间步距点数
for i=1:NP;
      F=A*X+B*u;  X=X+DT*F; Y(i)=C*X;
end
plot((1:NP)*DT,Y);
xlabel('t');ylabel('F(t)');grid;
title('弹性阻尼系统');

两种方法运行结果如下图所示:
在这里插入图片描述
在这里插入图片描述

例2.求下图所示系统的阶跃响应y(t)的数值解。
在这里插入图片描述
典型闭环系统的仿真程序框图
在这里插入图片描述
龙格库塔法:面向典型闭环系统数字仿真的程序,从第二部分到程序末尾可编辑为sp3_1.m文件存储起来。使用时,只要进入到MATLAB语言环境,按第一部分格式输入系统参数和运行参数,在调用该文件,即可得到运算结果。

程序框图对应的代码:

%%%1.输入数据
% a=[a0,a1,...,an]
% b=[b0,b1,...,bm]
% v=V0;
% n=n0;
% T0=t0;
% Tf=tf;
% h=h0;
% R=r;
%%%2.形成开、闭环系数阵
b=b/a(1);a = a/a(1); A = a(2:n+1);
A=[rot90(rot90(eye(n-1,n)));-fliplr(A)];
B=[zeros(1,n-1),1]';
m1=length(b);
C=[fliplr(b),zeros(1,n-m1)];
Ab=A-B*C*v;
X=X0';y=0;t=T0;
%3.运算求解
N=round(Tf-T0)/h;
for i = 1:N
    K1=Ab*X+B*R
    K2=Ab*(X+h*K1/2)+B*R;
    K3=Ab*(X+h*K2/2)+B*R;
    K4=Ab*(X+h*K3)+B*R;
    X=X+h*(K1+2*K2+2*K3+K4)/6;
    y=[y,C*X];
    t=[t,t(i)+h];
end
%4.输出结果
[t',y']
plot(t,y)

调用sp3_1.m文件,求取y(t)的数值解。

k=1;
a=conv([1 0 0],conv([0.25 1],[0.25 1]));
b=[2*k k];
X0=[0 0 0 0]
v=1;n=4;T0=0;Tf=10;h=0.25;R=1;
sp3_1
[t',y']

最终结果如图所示:
在这里插入图片描述
纵轴为y(t),横轴为时间t。
也可以对开环放大系数k重新赋值,其余参数不变,分析k对反馈系数v的影响作用,再次调用sp3_1.m文件,运行即可。

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
向前欧拉法(Forward Euler Method)和改进欧拉法(Improved Euler Method)都是常用的一阶常微分方程数值解法,而龙格-库塔法(Runge-Kutta Method)则是更为通用的高阶数值解法。 向前欧拉法是一种简单的数值解法,它是通过利用微分方程的定义式来进行逼近,即通过 $\frac{dy}{dt}=f(t,y)$ 来计算 $y_{i+1}$,公式为: $$y_{i+1}=y_i+h*f(t_i,y_i)$$ 其中 $h$ 为步长,$t_i$ 为时间点,$y_i$ 为时间点对应的函数值。这种方法的优点是计算简单,缺点是精度不高,而且步长需要取得比较小才能得到较为准确的结果。 改进欧拉法是对向前欧拉法的改进,它是在向前欧拉法基础上对 $y_{i+1}$ 进行了一步的修正,公式为: $$y_{i+1}=y_i+\frac{h}{2}*[f(t_i,y_i)+f(t_{i+1},y_i+h*f(t_i,y_i))]$$ 这种方法的优点是比向前欧拉法精度更高,缺点是计算量略大于向前欧拉法。 龙格-库塔法是一类常用的高阶数值解法,它通过对微分方程进行多次迭代来逼近实际函数值。其中最常用的是四阶龙格-库塔法,公式为: $$y_{i+1}=y_i+\frac{1}{6}*(k_1+2k_2+2k_3+k_4)$$ 其中, $$k_1=h*f(t_i,y_i)$$ $$k_2=h*f(t_i+\frac{h}{2},y_i+\frac{k_1}{2})$$ $$k_3=h*f(t_i+\frac{h}{2},y_i+\frac{k_2}{2})$$ $$k_4=h*f(t_i+h,y_i+k_3)$$ 这种方法的优点是精度高,缺点是计算较为复杂。 通过简单的实验可以比较这三种方法的精度和计算效率,从而得到更深刻的认识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值