多智能体系统仿真学习笔记:(一)ODE

(一)ODE的一般形式

Ⅰ.常微分方程 (ODE)

常微分方程 (ODE) 包含与一个自变量 t(通常称为时间)相关的因变量 y 的一个或多个导数。此处用于表示 y 相对于 t 的导数的表示法对于一阶导数为 y′,对于二阶导数为 y′′,依此类推。

ODE 的阶数即y 在方程中出现的最高阶导数。

Ⅱ.ODE方程组

ODE的主要描述方式,用以对复杂系统进行表示,形如
y ˙ = f ( t , y ) \dot y = f(t,y) y˙=f(t,y)
其中, y = ( y 1 , y 2 , … , y n ) T y=(y_1,y_2,\dots,y_n)^T y=(y1,y2,,yn)T.
例如
{ y 1 = y 2 y 2 = y 1 y 2 − 2 \left\{ \begin{aligned} y_1 & =y_2 \\ y_2 & =y_1y_2-2 \end{aligned} \right. {y1y2=y2=y1y22

Ⅲ.高阶ODE

高阶 ODE 可通过常规代换法重写为等效的一阶方程组
y 1 = y ˙ y 2 = y ¨ … y n = y ( n − 1 ) \begin{aligned} y_1 & =\dot y \\ y_2 & =\ddot y\\ &\dots \\ y_n & = y ^{(n-1)} \end{aligned} y1y2yn=y˙=y¨=y(n1)
通过代换,我们可以得到一个新的方程组
y ˙ 1 = y y ˙ 2 = y ¨ … y ˙ n = y ( n − 1 ) \begin{aligned} \dot y_1 & =y \\ \dot y_2 & =\ddot y\\ &\dots \\ \dot y_n & = y ^{(n-1)} \end{aligned} y˙1y˙2y˙n=y=y¨=y(n1)

Ⅳ.复数ODE

考虑复数 ODE 方程
y ˙ = f ( t , y )   , \dot y=f(t,y) , y˙=f(t,y),
其中 y = y 1 + i y 2 y=y_1+iy_2 y=y1+iy2
为解算该方程,需要将实部和虚部分解为不同的解分量,最后重新组合相应的结果。从概念上讲,这类似于
y v = [ R e a l ( y ) , I m a g ( y ) ] f v = [ R e a l ( f ( t , y ) ) , I m a g ( f ( t , y ) ) ]   \begin{aligned} y_v & =[Real(y) ,Imag(y)] \\ f_v & =[Real(f(t,y)) ,Imag(f(t,y))] \ \end{aligned} yvfv=[Real(y),Imag(y)]=[Real(f(t,y)),Imag(f(t,y))] 

(二)Matlab中的ODE

Ⅰ.Matlab中可求解的ODE

Matlab 中的 ODE 求解器可解算以下类型的一阶 ODE:

  • 显式线性ODE: y ˙ = f ( t , y ) \dot y=f(t,y) y˙=f(t,y)

  • 线性隐式 ODE: M ( t , y ) y ˙ = f ( t , y ) M(t,y) \dot y=f(t,y) M(t,y)y˙=f(t,y)
    – M(t,y) 为非奇异质量矩阵,该质量矩阵可能为时间或状态相关的矩阵,也可能为常量矩阵。
    –线性隐式 ODE 可随时变换为显式形式

  • 完全隐式 ODE: f ( t , y , y ˙ ) = 0 f(t,y,\dot y)=0 f(t,y,y˙)=0
    –该方程 不能重写为显式形式,还可能包含一些代数变量。
    –ode15i 求解器专为完全隐式问题(包括微分指数为 1 的 DAE)而设计。

  • 微分代数方程或 DAE
    –DAE 方程组会包含一些代数变量。代数变量是导数未出现在方程中的因变量。可通过对方程求导来将 DAE 方程组重写为等效的一阶 ODE 方程组,以消除代数变量。将 DAE 重写为 ODE 所需的求导次数称为微分指数
    –ode15s 和 ode23t 求解器可解算微分指数为 1 的 DAE。

Ⅱ.求解器的选择

ode45 适用于大多数 ODE 问题,一般情况下应作为首选求解器。但对于精度要求更宽松或更严格的问题而言,ode23 和 ode113 可能比 ode45 更加高效。
下表提供了关于何时使用每种不同求解器的一般指导原则。

求解器问题类型精度
ode45非刚性
ode23非刚性
ode113非刚性低到高
ode15s刚性低到中
ode23s刚性
ode15i完全隐式

Ⅲ.使用方法(以ode45为例)

A.语法

[t,y] = ode45(odefun,tspan,y0)
[t,y] = ode45(odefun,tspan,y0,options)
[t,y,te,ye,ie] = ode45(odefun,tspan,y0,options)
sol = ode45(___)

B.参数说明
输出:

  • t:返回的时间;
  • y:返回的状态值, y 中的每一行都与列向量 t 中返回的值相对应;
  • te:求解事件函数何处为零时,事件的时间。;
  • ye:求解事件函数何处为零时,事件发生的解;
  • ie:求解事件函数何处为零时,触发的事件的索引。

输入:

  • odefun:给定的ode方程;
  • tspan:求解的时间范围;
  • y0:所求解的状态的初值;
  • options:使用 odeset 函数创建的参数所定义的积分设置。例如,使用 AbsTol 和 RelTol 选项指定绝对误差容限和相对误差容限,或者使用 Mass 选项提供质量矩阵。

(三)ODE使用示例

Ⅰ.简单示例

解算ODE
y ˙ = 2 t \begin{aligned} \dot y& =2t \end{aligned} y˙=2t
使用时间区间 [0,5] 和初始条件 y0 = 0。

tspan = [0 5];
y0 = 0;
[t,y] = ode45(@(t,y) 2*t, tspan, y0);

绘图。

plot(t,y,'-o')

结果如下:
在这里插入图片描述

Ⅱ.复杂示例

Matlab有几个示例文件可用作大多数 ODE 问题的有用参考。要运行微分方程示例应用,以便轻松浏览和运行示例,请键入

odeexamples;

要打开单独的示例文件进行编辑,请键入

edit exampleFileName.m

要运行示例,请键入

exampleFileName

多智能体系统相关几个实例

名称求解器说明
ballodeode23简单事件位置 - 弹球
batonodeode45短棒的位置移动
orbitodeode45高级事件位置 - 限制性三体问题

主要参考资料来源
Mathworks官方帮助中心
求解器的选择:https://ww2.mathworks.cn/help/matlab/math/choose-an-ode-solver.html#bu22m6i-1**
ode45介绍:https://ww2.mathworks.cn/help/matlab/ref/ode45.html

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多智能体系统中的领导者可以通过在MATLAB中编写相应的控制算法来实现。下面是一个简单的示例代码,其中领导者代理(Agent 1)使用了一个简单的比例控制器来控制其位置,其他代理则跟随领导者的位置移动。 ``` % 初始化代理 numAgents = 5; agents = MultiAgent(numAgents); % 设置领导者代理 leaderAgent = 1; agents(leaderAgent).setControlLaw(@leaderControl); % 设置其他代理 followerAgents = setdiff(1:numAgents, leaderAgent); for i = followerAgents agents(i).setControlLaw(@followerControl); end % 模拟运行 tspan = [0 10]; initialState = rand(numAgents,2); [t,y] = ode45(@(t,y) agents.update(t,y), tspan, initialState); % 绘制代理运动轨迹 figure; plot(y(:,1:2:end), y(:,2:2:end)); xlabel('x'); ylabel('y'); % 领导者代理控制器 function u = leaderControl(agent, neighbors) desiredPosition = [1 1]; currentPosition = agent.getState(); error = desiredPosition - currentPosition; u = 0.5 * error; end % 跟随者代理控制器 function u = followerControl(agent, neighbors) leaderPosition = neighbors{1}.getState(); currentPosition = agent.getState(); error = leaderPosition - currentPosition; u = 0.5 * error; end ``` 在上面的代码中,我们首先创建了一个包含多个代理的代理数组,并设置领导者代理和其他跟随者代理的控制算法。然后,我们使用ODE45求解器模拟了代理系统的运动,并绘制了代理的运动轨迹。 注意,在上面的代码中,我们假设所有代理都是完全相同的,因此每个跟随者代理都使用相同的控制器来跟随领导者代理。如果您需要更复杂的控制算法或代理之间的不同性质,则需要相应地修改代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值