Main Content

dde23

求解带有固定时滞的时滞微分方程 (DDE)

语法

sol = dde23(ddefun,lags,history,tspan)
sol = dde23(ddefun,lags,history,tspan,options)

参数

ddefun

用于对微分方程 y(t)=f(t,y(t),y(tτ1),...,y(tτk)) 右侧进行计算的函数句柄。此函数必须为以下形式:

dydt = ddefun(t,y,Z)

其中 t 对应当前 t,y 是一个求 y(t) 近似值的列向量,Z(:,j) 用于为时滞 τj = lags(j) 求 y(t – τj) 的近似值。输出是对应 f(t,y(t),y(tτ1),...,y(tτk)) 的列向量。

lags

固定正时滞向量 τ1, ..., τk

history

按以下三种方式之一指定 history

  • 一个 t 函数,要求 y = history(t) 能够将 t ≤ t0 的解 y(t) 以列向量的形式返回

  • 一个固定列向量(如果 y(t) 为常量)

  • 来自之前积分的解 sol(如果此调用继续该积分)

tspan

t0=tspan(1)tf=tspan(end) 的积分区间,其中 t0 < tf

options

可选积分参数。使用 ddeset 函数创建的结构体。有关详细信息,请参阅 ddeset

说明

sol = dde23(ddefun,lags,history,tspan) 计算 DDE 结构体

y(t)=f(t,y(t),y(tτ1),...,y(tτk))

在 [t0,tf] 区间上的积分,其中 τ1, ..., τk 为固定正时滞和 t0,tf。输入参数 ddefun 是一个函数句柄。

参数化函数解释了如何为函数 ddefun 提供其他参数(如果需要)。

dde23 以结构体 sol 的形式返回解。使用辅助函数 deval 和输出 sol 来计算区间 tspan = [t0,tf] 中的特定点 tint 的解。

yint = deval(sol,tint)

dde23 返回的结构体 sol 包含下列字段。

sol.x

dde23 选择的网格

sol.y

sol.x 网格点处的 y(x) 近似值。

sol.yp

sol.x 网格点处的 y(x) 近似值

sol.solver

求解器名称 'dde23'

sol = dde23(ddefun,lags,history,tspan,options) 的解算方法与上述方法相同,只是将默认积分属性替换为了 options(使用 ddeset 创建的参数)中的值。有关详细信息,请参阅 ddeset解算时滞微分方程

常用选项包括标量相对误差容限 'RelTol'(默认为 1e-3)和绝对误差容限的向量 'AbsTol'(默认情况下,所有分量均为 1e-6)。

使用 'Jumps' 选项解决历史记录或求解中的不连续问题。将此选项设置为一个包含不连续性问题位置的向量,这些不连续性位于 t0 之前的求解中(历史记录),或者位于 t0 之后的 t 已知值位置的等式系数中。

使用 'Events' 选项指定一个函数,dde23 调用该函数来找出函数 g(t,y(t),y(tτ1),...,y(tτk)) 消失位置。此函数必须为以下形式

[value,isterminal,direction] = events(t,y,Z)

并包含一个事件函数以测试每个事件。对于 events 中的第 k 个事件函数:

  • value(k) 是第 k 个事件函数的值。

  • 如果想要积分在此事件函数为零时终止,则 isterminal(k) = 1;否则为 0

  • 如果想要 dde23 计算此事件函数的所有零,则 direction(k) = 0;如果仅计算事件函数呈上升趋势时的零,则 +1,如果仅计算事件函数呈下降趋势时的零,则 -1

如果指定了 'Events' 选项,并且检测到事件,输出结构体 sol 还包括下列字段:

sol.xe

包含所有事件位置的行向量,即事件函数消失的时间

sol.ye

包含特定列数据的矩阵,其列值为与 sol.xe 中的时间对应的解

sol.ie

索引向量,其中的索引值用于指定在 sol.xe 中的对应时间所发生的事件

示例

以下示例显示如何在 [0, 5] 区间上对 DDE 求解,其中 lags 为 1 和 0.2。ddex1de 函数计算时滞微分方程,ddex1hist 计算 t <= 0 的历史记录。

注意

文件 ddex1.m 包含此示例的完整代码。要在编辑中查看该代码,请在命令行中键入 edit ddex1。要运行该代码,请在命令行中键入 ddex1

sol = dde23(@ddex1de,[1, 0.2],@ddex1hist,[0, 5]);

此代码在 [0,5] 的区间上以 100 个等间距点计算解,然后绘制结果。

tint = linspace(0,5);
yint = deval(sol,tint);
plot(tint,yint);

ddex1 显示如何使用局部函数解决此问题。有关更多示例,请参阅 ddex2

算法

dde23 跟踪不连续性并使用显式 Runge-Kutta (2,3) 对和插值对 ode23 求积分。它通过迭代来采用超过时滞的步长。

参考

[1] Shampine, L.F. and S. Thompson, “Solving DDEs in MATLAB,” Applied Numerical Mathematics, Vol. 37, 2001, pp. 441-458.

[2] Kierzenka, J., L.F. Shampine, and S. Thompson, “Solving Delay Differential Equations with dde23

版本历史记录

在 R2006a 之前推出