MATLAB 数学应用 微分方程 常微分方程 求解捕食者-猎物方程

本文说明如何使用 ode23 和 ode45 求解表示捕食者/猎物模型的微分方程。这两个函数用于对使用可变步长大小 Runge-Kutta 积分方法的常微分方程求数值解。ode23 使用一对简单的 2 阶和 3 阶公式实现中等精度,ode45 使用一对 4 阶和 5 阶公式实现更高的精度。

以名为 Lotka-Volterra 方程,也即捕食者-猎物模型的一对一阶常微分方程为例:

d x d t = x − α x y \dfrac{dx}{dt}=x−αxy dtdx=xαxy
d y d t = − y + β x y . \dfrac{dy}{dt}=−y+βxy. dtdy=y+βxy.

变量 x 和 y 分别计算猎物和捕食者的数量。二次交叉项表示物种之间的交叉。当没有捕食者时,猎物数量将增加,当猎物匮乏时,捕食者数量将减少。

编写方程代码

为了模拟系统,需要创建一个函数,以返回给定状态和时间值时的状态导数的列向量。在 MATLAB 中,两个变量 x 和 y 可以表示为向量 y 中的前两个值。同样,导数是向量 yp 中的前两个值。函数必须接受 t 和 y 的值,并在 yp 中返回公式生成的值。

yp(1) = (1 - alpha*y(2))*y(1)

yp(2) = (-1 + beta*y(1))*y(2)

在此示例中,公式包含在名为 lotka.m 的文件中。此文件使用 α=0.01 和 β=0.02 的参数值。

type lotka % 加载对应lotka.m文件内容

function yp = lotka(t,y)
yp = diag([1 - .01*y(2), -1 + .02*y(1)])*y;

模拟系统

使用 ode23 在区间 0<t<15 中求解 lotka 中定义的微分方程。使用初始条件 x(0)=y(0)=20,使捕食者和猎物的数量相等。

t0 = 0;
tfinal = 15;
y0 = [20; 20];   
[t,y] = ode23(@lotka,[t0 tfinal],y0);

绘制结果

绘制两个种群数量对时间的图。

plot(t,y)
title('Predator/Prey Populations Over Time')
xlabel('t')
ylabel('Population')
legend('Prey','Predators','Location','North')

在这里插入图片描述

现在绘制两个种群数量的相对关系图。生成的相平面图非常清晰地表明了二者数量之间的循环关系。

plot(y(:,1),y(:,2))
title('Phase Plane Plot')
xlabel('Prey Population')
ylabel('Predator Population')

在这里插入图片描述

比较不同求解器的结果

使用 ode45 而不是 ode23 再次求解该方程组。ode45 求解器的每一步都需要更长的时间,但它的步长也更大。然而,ode45 的输出是平滑的,因为默认情况下,此求解器使用连续展开公式在每个步长范围内的四个等间距时间点生成输出。(您可以使用 ‘Refine’ 选项调整时间点数。)绘制两个解进行比较。

[T,Y] = ode45(@lotka,[t0 tfinal],y0);

plot(y(:,1),y(:,2),'-',Y(:,1),Y(:,2),'-');
title('Phase Plane Plot')
legend('ode23','ode45')

在这里插入图片描述

结果表明,使用不同的数值方法求解微分方程会产生略微不同的答案。

  • 10
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

结冰架构

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

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

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

打赏作者

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

抵扣说明:

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

余额充值