动力系统入门:第三部分 经典模型入门

本文是“动力系统入门”系列的第三部分。
前两部分我们已经学习了相空间、相图、平衡点、稳定性和线性化。
从这一部分开始,我们通过几个经典模型把前面的概念真正用起来。

本部分包含四个核心模型:

  1. 指数增长与 Logistic 模型
  2. Lotka-Volterra 捕食者—猎物模型
  3. 单摆与非线性振动
  4. Van der Pol 振子

这四个模型非常适合作为动力系统入门的第一组例子。它们分别对应几种重要现象:

模型 主要现象 关键词
Logistic 方程 受限增长、稳定平衡点 环境容量、相线
捕食者—猎物模型 周期振荡、二维相图 闭合轨道、种群相互作用
单摆模型 非线性振动、分界轨道 相空间、能量、稳定性
Van der Pol 振子 自激振荡、极限环 非线性阻尼、吸引子

在这里插入图片描述


第 8 章 指数增长与 Logistic 模型

8.1 从指数增长开始

最简单的增长模型是指数增长模型:

dxdt=rx \frac{dx}{dt}=rx dtdx=rx

其中:

  • x(t)x(t)x(t) 表示某个数量,例如种群数量;
  • rrr 表示增长率;
  • ttt 表示时间。

这个方程的意思是:

数量越多,增长得越快。

它的解为:

x(t)=x0ert x(t)=x_0e^{rt} x(t)=x0ert

如果 r>0r>0r>0,那么 x(t)x(t)x(t) 会随时间指数增长。这个模型适合描述短时间内资源充足的增长过程,比如细菌在理想培养环境中的早期繁殖。

但是,现实世界中的资源通常不是无限的。食物、空间、能量都会限制增长。因此指数增长模型不能一直适用。


8.2 Logistic 方程

为了描述资源限制,我们引入 Logistic 方程:

dxdt=rx(1−xK) \frac{dx}{dt}=rx\left(1-\frac{x}{K}\right) dtdx=rx(1Kx)

其中:

  • rrr 是内禀增长率;
  • KKK 是环境容量;
  • x(t)x(t)x(t) 是系统状态变量。

这里多出来的因子:

1−xK 1-\frac{x}{K} 1Kx

表示资源限制效应。

xxx 很小时:

1−xK≈1 1-\frac{x}{K}\approx 1 1Kx1

系统近似满足指数增长:

dxdt≈rx \frac{dx}{dt}\approx rx dtdxrx

xxx 接近 KKK 时:

1−xK≈0 1-\frac{x}{K}\approx 0 1Kx0

增长速度变慢,最终趋近稳定值 KKK


8.3 指数增长与 Logistic 增长的对比

在这里插入图片描述

从图中可以看到:

  • 指数增长模型会不断上升;
  • Logistic 模型前期增长较快,后期逐渐趋于环境容量 KKK
  • 现实系统中,Logistic 模型往往比指数模型更合理。

8.4 Logistic 方程的平衡点

平衡点满足:

dxdt=0 \frac{dx}{dt}=0 dtdx=0

因此:

rx(1−xK)=0 rx\left(1-\frac{x}{K}\right)=0 rx(1Kx)=0

得到两个平衡点:

x1∗=0 x^*_1=0 x1=0

x2∗=K x^*_2=K x2=K

其中:

  • x=0x=0x=0 表示种群灭绝;
  • x=Kx=Kx=K 表示种群达到环境容量。

8.5 Logistic 方程的稳定性

考虑变化率函数:

f(x)=rx(1−xK) f(x)=rx\left(1-\frac{x}{K}\right) f(x)=rx(1Kx)

如果 0<x<K0<x<K0<x<K,则:

f(x)>0 f(x)>0 f(x)>0

说明 xxx 会增大。

如果 x>Kx>Kx>K,则:

f(x)<0 f(x)<0 f(x)<0

说明 xxx 会减小。

因此,只要初始值 x0>0x_0>0x0>0,系统最终都会趋向:

x=K x=K x=K

所以:

  • x=0x=0x=0 是不稳定平衡点;
  • x=Kx=Kx=K 是稳定平衡点。

在这里插入图片描述


8.6 Python 示例:绘制 Logistic 增长曲线

import numpy as np
import matplotlib.pyplot as plt

r = 0.5
K = 10
x0 = 0.5

t = np.linspace(0, 20, 500)
x = K / (1 + (K / x0 - 1) * np.exp(-r * t))

plt.plot(t, x, linewidth=2)
plt.axhline(K, linestyle="--", label="环境容量 K")
plt.xlabel("时间 t")
plt.ylabel("种群数量 x(t)")
plt.title("Logistic 增长模型")
plt.legend()
plt.grid(alpha=0.3)
plt.show()

8.7 本章小结

Logistic 方程是动力系统中最经典的一维非线性模型之一。它虽然形式简单,却已经包含了许多重要思想:

  • 非线性增长;
  • 平衡点;
  • 稳定性;
  • 相线分析;
  • 长时间行为。

它告诉我们:

动力系统的重点不只是求解方程,而是理解系统最终会走向哪里。


第 9 章 捕食者—猎物模型

9.1 模型背景

在生态系统中,捕食者和猎物之间存在相互作用。

例如:

  • 兔子数量增加,会给狐狸提供更多食物;
  • 狐狸数量增加,会导致兔子数量减少;
  • 兔子减少后,狐狸因食物不足也会减少;
  • 狐狸减少后,兔子又可能重新增长。

这种相互制约会产生周期振荡。

Lotka-Volterra 模型是描述这种现象的经典二维动力系统。


9.2 Lotka-Volterra 方程

设:

  • x(t)x(t)x(t) 表示猎物数量;
  • y(t)y(t)y(t) 表示捕食者数量。

模型为:

dxdt=αx−βxy \frac{dx}{dt}=\alpha x-\beta xy dtdx=αxβxy

dydt=δxy−γy \frac{dy}{dt}=\delta xy-\gamma y dtdy=δxyγy

其中:

  • αx\alpha xαx:猎物自然增长;
  • −βxy-\beta xyβxy:捕食导致猎物减少;
  • δxy\delta xyδxy:捕食使捕食者增加;
  • −γy-\gamma yγy:捕食者自然死亡。

这个系统的状态变量是二维的:

(x,y) (x,y) (x,y)

因此我们需要在相平面中研究它。


9.3 平衡点分析

平衡点满足:

dxdt=0,dydt=0 \frac{dx}{dt}=0,\qquad \frac{dy}{dt}=0 dtdx=0,dtdy=0

也就是:

αx−βxy=0 \alpha x-\beta xy=0 αxβxy=0

δxy−γy=0 \delta xy-\gamma y=0 δxyγy=0

整理可得:

x(α−βy)=0 x(\alpha-\beta y)=0 x(αβy)=0

y(δx−γ)=0 y(\delta x-\gamma)=0 y(δxγ)=0

因此平衡点有两个:

(0,0) (0,0) (0,0)

(γδ,αβ) \left(\frac{\gamma}{\delta},\frac{\alpha}{\beta}\right) (δγ,βα)

第一个平衡点表示两类种群都不存在。第二个平衡点表示捕食者和猎物共存。


9.4 相平面中的轨道

Lotka-Volterra 模型的典型特征是:在共存平衡点附近会出现周期性轨道。

在这里插入图片描述

从相图中可以看到:

  1. 轨道围绕共存平衡点旋转;
  2. 猎物和捕食者数量交替上升和下降;
  3. 系统并不一定收敛到某个点,而可能长期振荡。

9.5 振荡的直观解释

捕食者—猎物模型的周期振荡可以这样理解:

猎物数量增加
    ↓
捕食者食物变多,捕食者数量增加
    ↓
捕食压力变大,猎物数量下降
    ↓
猎物减少,捕食者缺少食物
    ↓
捕食者数量下降
    ↓
猎物压力减小,数量重新增加

这个循环不断重复,就形成了种群振荡。


9.6 Python 示例:绘制捕食者—猎物轨道

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

def lotka_volterra(t, z, alpha, beta, delta, gamma):
    x, y = z
    dxdt = alpha * x - beta * x * y
    dydt = delta * x * y - gamma * y
    return [dxdt, dydt]

alpha = 1.0
beta = 0.1
delta = 0.075
gamma = 1.5

sol = solve_ivp(
    lotka_volterra,
    t_span=(0, 30),
    y0=[10, 5],
    args=(alpha, beta, delta, gamma),
    dense_output=True
)

t = np.linspace(0, 30, 1000)
z = sol.sol(t)

plt.plot(z[0], z[1], linewidth=2)
plt.xlabel("猎物数量 x")
plt.ylabel("捕食者数量 y")
plt.title("捕食者—猎物模型相轨道")
plt.grid(alpha=0.3)
plt.show()

9.7 本章小结

Lotka-Volterra 模型是一个典型的二维非线性动力系统。它展示了一个重要事实:

二维系统不仅可能趋于平衡点,也可能出现周期振荡。

通过这个模型,我们第一次看到了相平面分析的威力。


第 10 章 单摆与非线性振动

10.1 单摆模型

单摆是动力系统中最经典的物理模型之一。

设:

  • θ(t)\theta(t)θ(t) 表示摆角;
  • ω(t)=dθ/dt\omega(t)=d\theta/dtω(t)=dθ/dt 表示角速度。

如果忽略阻尼,单摆方程为:

d2θdt2+glsin⁡θ=0 \frac{d^2\theta}{dt^2}+\frac{g}{l}\sin\theta=0 dt2d2θ+lgsinθ=0

为了简化记号,我们可以进行无量纲化,写成:

d2θdt2+sin⁡θ=0 \frac{d^2\theta}{dt^2}+\sin\theta=0 dt2d2θ+sinθ=0

将二阶方程改写成一阶系统:

dθdt=ω \frac{d\theta}{dt}=\omega dtdθ=ω

dωdt=−sin⁡θ \frac{d\omega}{dt}=-\sin\theta dtdω=sinθ

于是,单摆就变成了一个二维动力系统。


10.2 小角度近似

当摆角很小时:

sin⁡θ≈θ \sin\theta\approx \theta sinθθ

单摆方程近似为:

d2θdt2+θ=0 \frac{d^2\theta}{dt^2}+\theta=0 dt2d2θ+θ=0

这就是简谐振动方程。

它的解是周期函数,表示摆会来回振动。

但是当摆角较大时,sin⁡θ≈θ\sin\theta\approx\thetasinθθ 不再成立,系统就必须按照非线性方程来分析。


10.3 非线性单摆的相图

非线性单摆的相变量是:

(θ,ω) (\theta,\omega) (θ,ω)

其中:

  • θ\thetaθ 表示角位置;
  • ω\omegaω 表示角速度。

在这里插入图片描述

从相图中可以看到几类运动:

  1. 在稳定平衡点附近,小轨道对应普通摆动;
  2. 较大的闭合轨道对应大角度振动;
  3. 穿过不稳定平衡点附近的轨道称为分界轨道;
  4. 分界轨道外侧对应连续旋转。

这说明同一个方程可以产生不同类型的运动。


10.4 平衡点与稳定性

平衡点满足:

ω=0 \omega=0 ω=0

−sin⁡θ=0 -\sin\theta=0 sinθ=0

因此:

θ=nπ,ω=0 \theta=n\pi,\qquad \omega=0 θ=,ω=0

θ=0,±2π,±4π,⋯\theta=0,\pm 2\pi,\pm 4\pi,\cdotsθ=0,±2π,±4π, 时,摆在最低点,是稳定平衡点。

θ=±π,±3π,⋯\theta=\pm\pi,\pm 3\pi,\cdotsθ=±π,±3π, 时,摆在最高点,是不稳定平衡点。

这与我们的物理直觉一致:

  • 摆自然垂下时稳定;
  • 摆倒立在最高处时不稳定。

10.5 能量观点

无阻尼单摆的能量可以写为:

E=12ω2+1−cos⁡θ E=\frac{1}{2}\omega^2+1-\cos\theta E=21ω2+1cosθ

其中:

  • 12ω2\frac{1}{2}\omega^221ω2 是动能项;
  • 1−cos⁡θ1-\cos\theta1cosθ 是势能项。

由于没有阻尼,能量守恒。因此轨道会沿着等能量曲线运动。

这也是为什么无阻尼单摆的相图中会出现闭合轨道。


10.6 阻尼单摆

现实中的摆会受到摩擦和空气阻力,因此需要加入阻尼项:

d2θdt2+bdθdt+sin⁡θ=0 \frac{d^2\theta}{dt^2}+b\frac{d\theta}{dt}+\sin\theta=0 dt2d2θ+bdtdθ+sinθ=0

写成一阶系统为:

dθdt=ω \frac{d\theta}{dt}=\omega dtdθ=ω

dωdt=−bω−sin⁡θ \frac{d\omega}{dt}=-b\omega-\sin\theta dtdω=sinθ

其中 b>0b>0b>0 表示阻尼强度。

在这里插入图片描述

加入阻尼后,系统能量逐渐减少,轨道不再闭合,而是逐渐螺旋式收敛到稳定平衡点。


10.7 Python 示例:绘制单摆相轨道

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

def pendulum(t, z):
    theta, omega = z
    return [omega, -np.sin(theta)]

sol = solve_ivp(
    pendulum,
    t_span=(0, 30),
    y0=[2.0, 0.0],
    dense_output=True
)

t = np.linspace(0, 30, 1000)
z = sol.sol(t)

plt.plot(z[0], z[1], linewidth=2)
plt.xlabel("角位移 theta")
plt.ylabel("角速度 omega")
plt.title("非线性单摆相轨道")
plt.grid(alpha=0.3)
plt.show()

10.8 本章小结

单摆模型说明:

  • 二阶微分方程可以转化为一阶系统;
  • 相空间可以展示不同类型的运动;
  • 稳定平衡点和不稳定平衡点有明确物理意义;
  • 能量守恒系统的轨道往往具有特殊结构;
  • 加入阻尼后,系统会从保守系统变成耗散系统。

单摆是连接经典力学和动力系统理论的桥梁。


第 11 章 Van der Pol 振子

11.1 为什么需要 Van der Pol 振子?

普通阻尼振子会逐渐停止振动。可是现实中有些系统可以持续振荡,例如:

  • 电子振荡器;
  • 心脏节律;
  • 神经元放电;
  • 某些机械自激振动。

这些系统并不是简单地耗散能量,而是会在某些状态下吸收能量,在另一些状态下释放能量。

Van der Pol 振子就是描述这种自激振荡的经典模型。


11.2 Van der Pol 方程

Van der Pol 方程为:

d2xdt2−μ(1−x2)dxdt+x=0 \frac{d^2x}{dt^2}-\mu(1-x^2)\frac{dx}{dt}+x=0 dt2d2xμ(1x2)dtdx+x=0

其中 μ>0\mu>0μ>0 控制非线性阻尼强度。

令:

v=dxdt v=\frac{dx}{dt} v=dtdx

则可写成一阶系统:

dxdt=v \frac{dx}{dt}=v dtdx=v

dvdt=μ(1−x2)v−x \frac{dv}{dt}=\mu(1-x^2)v-x dtdv=μ(1x2)vx


11.3 非线性阻尼的含义

Van der Pol 方程中最重要的一项是:

−μ(1−x2)dxdt -\mu(1-x^2)\frac{dx}{dt} μ(1x2)dtdx

这个阻尼不是常数,而是依赖于 xxx

∣x∣<1|x|<1x<1 时:

1−x2>0 1-x^2>0 1x2>0

系统表现出“负阻尼”,振幅会被放大。

∣x∣>1|x|>1x>1 时:

1−x2<0 1-x^2<0 1x2<0

系统表现出“正阻尼”,振幅会被抑制。

因此系统会自动调节振幅,最终形成稳定的周期振荡。


11.4 极限环

Van der Pol 振子的一个核心现象是极限环。

极限环是相平面中的一条闭合轨道,并且附近轨道会逐渐靠近它。

在这里插入图片描述

图中可以看到:

  • 初始条件不同的轨道,最终都会靠近同一条闭合曲线;
  • 这条闭合曲线就是稳定极限环;
  • 极限环对应系统长期稳定的周期振荡。

这与无阻尼单摆的闭合轨道不同。

无阻尼单摆中,不同能量对应不同闭合轨道;而 Van der Pol 振子中,许多初始条件都会被吸引到同一个闭合轨道。


11.5 极限环与吸引子

稳定极限环可以看作一种吸引子。

在前面我们见过点吸引子,例如 Logistic 方程中的稳定平衡点 x=Kx=Kx=K

而 Van der Pol 振子的长期行为不是收敛到一个点,而是收敛到一个周期运动。

因此我们可以说:

稳定极限环是周期运动形式的吸引子。

这也是非线性动力系统中非常重要的思想。


11.6 Python 示例:绘制 Van der Pol 极限环

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

def vanderpol(t, z, mu):
    x, v = z
    dxdt = v
    dvdt = mu * (1 - x**2) * v - x
    return [dxdt, dvdt]

mu = 2.0

sol = solve_ivp(
    vanderpol,
    t_span=(0, 50),
    y0=[0.2, 0.1],
    args=(mu,),
    dense_output=True
)

t = np.linspace(0, 50, 2000)
z = sol.sol(t)

plt.plot(z[0], z[1], linewidth=2)
plt.xlabel("x")
plt.ylabel("dx/dt")
plt.title("Van der Pol 振子的相轨道")
plt.grid(alpha=0.3)
plt.show()

11.7 本章小结

Van der Pol 振子展示了动力系统中一个非常重要的现象:

系统可以不收敛到静止状态,而是收敛到稳定周期振荡。

本章重点概念包括:

  • 非线性阻尼;
  • 自激振荡;
  • 极限环;
  • 周期吸引子;
  • 初始条件不同但长期行为相同。

第三部分总结

第三部分通过四个经典模型,把前面学过的动力系统概念具体化了。

1. Logistic 模型

它是最简单的一维非线性模型之一,展示了:

  • 资源限制;
  • 稳定平衡点;
  • 相线分析;
  • 长时间趋向环境容量。

2. 捕食者—猎物模型

它是二维非线性系统的经典例子,展示了:

  • 种群相互作用;
  • 相平面轨道;
  • 周期振荡;
  • 共存平衡点。

3. 单摆模型

它连接了经典力学和动力系统,展示了:

  • 二阶方程转化为一阶系统;
  • 稳定与不稳定平衡点;
  • 能量守恒;
  • 分界轨道;
  • 阻尼导致耗散和收敛。

4. Van der Pol 振子

它展示了非线性系统中的自激振荡,核心概念是:

  • 非线性阻尼;
  • 稳定极限环;
  • 周期吸引子。

本部分知识结构图

经典动力系统模型
│
├── 一维模型
│   └── Logistic 方程
│       ├── 平衡点
│       ├── 稳定性
│       └── 环境容量
│
├── 二维生态模型
│   └── 捕食者—猎物模型
│       ├── 相平面
│       ├── 共存平衡点
│       └── 周期振荡
│
├── 物理振动模型
│   └── 单摆模型
│       ├── 非线性振动
│       ├── 能量守恒
│       ├── 分界轨道
│       └── 阻尼收敛
│
└── 自激振荡模型
    └── Van der Pol 振子
        ├── 非线性阻尼
        ├── 极限环
        └── 周期吸引子

下一部分预告:分岔理论初步

前面我们主要讨论了系统在固定参数下的行为。

但是在真实问题中,参数往往会变化。

例如:

  • 增长率 rrr 变化;
  • 阻尼强度变化;
  • 捕食率变化;
  • 外界驱动力变化。

当参数变化时,系统的平衡点、稳定性和长期行为可能发生突然改变。

这种现象称为:

分岔。

下一部分我们将进入动力系统中非常重要的主题:

分岔理论初步

我们会学习:

  1. 什么是分岔;
  2. 鞍结分岔;
  3. 叉式分岔;
  4. Hopf 分岔;
  5. 如何用 Python 绘制分岔图。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐