直接灵敏度分析
直接灵敏度分析(Direct Sensitivity Analysis),也称为前向灵敏度分析(Forward Sensitivity Analysis),是一种通过直接求解状态关于参数的微分方程来计算灵敏度的方法。
理论基础
对于动力学系统
对原方程两边关于
通过与原始动力学方程联立求解,我们可以同时获得状态轨迹
适用场景
参数数量较少:当参数数量
远小于状态维度 时,直接法通常比伴随法更高效。 实时性要求:由于灵敏度是随时间前向传播的,因此可以在仿真过程中实时获得灵敏度信息。
需要完整灵敏度轨迹:如果需要知道灵敏度随时间的演化过程,直接法是自然的选择。
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: 状态关于初始状态的雅可比Jac_action: 状态关于控制输入的雅可比Jac_control_params: 状态关于控制参数的雅可比