Skip to content

直接灵敏度分析

直接灵敏度分析(Direct Sensitivity Analysis),也称为前向灵敏度分析(Forward Sensitivity Analysis),是一种通过直接求解状态关于参数的微分方程来计算灵敏度的方法。

理论基础

对于动力学系统 x˙=f(x,u,θ),其中 x 是状态,u 是控制输入,θ 是参数。我们定义灵敏度矩阵 S=xθ

对原方程两边关于 θ 求导,可以得到灵敏度方程: $ \dot{S} = \frac{\partial f}{\partial x} S + \frac{\partial f}{\partial \theta} $

通过与原始动力学方程联立求解,我们可以同时获得状态轨迹 x(t) 和灵敏度 S(t)

适用场景

  • 参数数量较少:当参数数量 nθ 远小于状态维度 nx 时,直接法通常比伴随法更高效。

  • 实时性要求:由于灵敏度是随时间前向传播的,因此可以在仿真过程中实时获得灵敏度信息。

  • 需要完整灵敏度轨迹:如果需要知道灵敏度随时间的演化过程,直接法是自然的选择。

Rible.jl 实现

Rible.jl 基于 Zhong06 积分格式实现了离散形式的直接灵敏度求解器。

核心组件

  • Direct_Sensitivity_Zhong06_CCP_Constant_Mass_Mono_Cache: 存储直接灵敏度求解所需的中间变量。

  • generate_cache: 初始化求解器缓存。

  • solve!: 执行前向动力学仿真并同时计算灵敏度。

使用示例

julia
using Rible
using LinearAlgebra

# 1. 定义问题
# 假设 prob 是已经定义好的 DynamicsProblem

# 2. 配置求解器
# 使用 DirectDynamicsSensitivitySolver 包装基础求解器
solver = Rible.DirectDynamicsSensitivitySolver(
    Rible.DynamicsSolver(Rible.Zhong06())
)

# 3. 生成缓存
cache = Rible.generate_cache(
    prob, 
    solver, 
    Val(true); # 假设是常质量系统
    dt = 1e-3, 
    totalstep = 1000
)

# 4. 求解
Rible.solve!(
    simulator, 
    forward_cache, 
    cache; 
    dt = 1e-3
)

# 5. 获取结果
# 灵敏度结果存储在 cache.direct_sensitivity_workspace 中
dsw = cache.cache.direct_sensitivity_workspace
# dsw.Jac_control_params 包含了状态关于控制参数的雅可比

API 参考

缓存结构

DirectSensitivityWorkspace 包含以下主要字段:

  • Jac_state: 状态关于初始状态的雅可比 xkx0

  • Jac_action: 状态关于控制输入的雅可比 xku

  • Jac_control_params: 状态关于控制参数的雅可比 xkθ