4. 一维系统的分岔类型与计算
一维自治系统可以写成 ẋ = f(x, μ),其中 x 是状态变量,μ 是控制参数。分岔的本质是:当 μ 缓慢变化经过某个临界值 μc 时,系统平衡点的数目或稳定性发生定性改变。判断分岔点最直接的工具是平衡点方程 f(x, μ) = 0 与稳定性条件 f'(x, μ) ≠ 0。当在某点同时满足 f = 0 和 f' = 0 时,平衡点由双曲变为非双曲,这正是分岔发生的必要条件。下面以三个标准方程为例,推导各自的临界条件,并给出可复现的数值计算方案。
三类典型分岔的解析条件
鞍结分岔的标准型为 ẋ = μ − x²。令 f = μ − x² = 0 得 x = ±√μ(μ ≥ 0),再令 f' = −2x = 0 得 x = 0,代回平衡方程得 μc = 0。当 μ < 0 时无平衡点;μ = 0 时出现一个半稳定点 x = 0;μ > 0 时分裂为一对平衡点,其中 x = +√μ 满足 f' = −2√μ < 0 为稳定,x = −√μ 满足 f' > 0 为不稳定。平衡点“从无到有、成对产生”是鞍结分岔的标志。
跨临界分岔的标准型为 ẋ = μx − x² = x(μ − x)。平衡点为 x = 0 与 x = μ。对 x = 0 有 f' = μ,故 μ < 0 时稳定、μ > 0 时不稳定;对 x = μ 有 f' = −μ,稳定性恰好相反。在 μc = 0 处两支平衡点相交并交换稳定性。注意此时 f'(0,0) = 0,同样满足非双曲条件,但平衡点总数不变,只是稳定性互换。
叉式分岔的标准型为 ẋ = μx − x³。平衡点为 x = 0 与 x = ±√μ(μ > 0)。x = 0 处 f' = μ,μ < 0 稳定、μ > 0 不稳定;非零支处 f' = μ − 3x² = −2μ,故 μ > 0 时稳定。临界点 μc = 0,一个稳定平衡点在 μ 增大时失稳并分出一对对称稳定平衡点,形成“音叉”形状。若方程改为 ẋ = μx + x³,则非零支在 μ < 0 一侧出现且不稳定,称为亚临界叉式分岔。
f(x, μ) = 0 与 ∂f/∂x = 0 消去 x 即得临界参数 μc。对上述三例,该方程组分别给出 μc = 0,因此仅凭临界值无法区分类型,还需考察平衡点分支的拓扑与稳定性交换方式。数值计算分岔点的实现
解析推导只适用于简单标准型,工程中更常见的是含多个参数、无法手工求解的 f。此时可用“扫描 + 求根 + 稳定性判定”的数值流程。核心思路是:对每个 μ 值,用牛顿法或二分法求出所有实根;再计算每个根处的 f'(x, μ),由符号判断稳定性;最后比较相邻 μ 之间根的数量或稳定性是否突变,定位 μc。下面给出 Python 示例,采用 scipy.optimize.brentq 在区间上求根,并用细网格扫描捕捉分支。
import numpy as np
from scipy.optimize import brentq
def f(x, mu, kind):
if kind == "saddle": return mu - x**2
if kind == "trans": return mu*x - x**2
if kind == "pitch": return mu*x - x**3
def dfdx(x, mu, kind):
if kind == "saddle": return -2*x
if kind == "trans": return mu - 2*x
if kind == "pitch": return mu - 3*x**2
def roots_on_grid(mu, kind, xmin=-3, xmax=3, n=400):
xs = np.linspace(xmin, xmax, n)
vals = f(xs, mu, kind)
roots = []
for i in range(n-1):
if vals[i] == 0: roots.append(xs[i])
elif vals[i]*vals[i+1] < 0:
r = brentq(f, xs[i], xs[i+1], args=(mu, kind))
roots.append(r)
return roots
def bifurcation_scan(kind, mus):
branches = []
for mu in mus:
for r in roots_on_grid(mu, kind):
stable = dfdx(r, mu, kind) < 0
branches.append((mu, r, stable))
return branches
mus = np.linspace(-1.5, 1.5, 301)
data = bifurcation_scan("pitch", mus)
对叉式分岔运行上述代码,会得到 μ < 0 时仅 x = 0 且稳定;μ > 0 时 x = 0 不稳定、同时出现 ±√μ 两个稳定根。若把 kind 换成 "saddle",则 μ < 0 时根列表为空,μ > 0 时出现一正一负两个根,且负根处 f' > 0。这种“根数从 0 跳到 2”的计数变化,就是数值上识别鞍结分岔最可靠的信号。
绘制分岔图与结果判读
把扫描结果按 (μ, x) 画成散点,稳定根用实心点、不稳定根用空心点,即可得到分岔图。更精细的做法是对每个 μ 用连续延拓(把上一个 μ 的根作为初值)跟踪分支,避免网格漏根。判读时关注三件事:分支在 μc 处是否相交或分叉;稳定性是否在交点两侧互换;分支数目是否发生奇偶变化。若数值上发现 f 与 f' 在某点同时接近零,但根数不变、仅稳定性互换,则对应跨临界型;若根数成对增减,则对应鞍结型;若一个根分裂为对称两支,则对应叉式型。
f 在相邻网格点上的符号变化是否被完整捕获。实际计算中还应统一符号约定:本文始终以 f'(x, μ) < 0 判为稳定,以 μ 增大方向为参数扫描正方向。若换用 ẋ = −f 的写法,稳定性判据要相应取反,否则分岔图上实线与虚线的标注会整体颠倒。掌握这套“解析定条件、数值定位置、图形定类型”的流程,就能把一维分岔从公式推导落到可执行的计算上。