DifferentialEquations.jl实现Heston模型触发Bridging distribution错误
问题解答
关于桥接分布缺失的原因
数学上相关维纳过程的布朗桥分布是完全有明确定义的,出现该报错并非原理层面不支持,而是DiffEqNoiseProcess包的CorrelatedWienerProcess!实现暂时没有补充桥接分布的调度逻辑。
自适应SDE求解器在执行步长拒绝操作时,需要用到布朗桥分布对已采样的噪声路径做插值回退,默认的独立维纳过程WienerProcess早已实现了对应的桥接方法,但CorrelatedWienerProcess!的早期实现仅覆盖了正向噪声采样逻辑,没有适配步长拒绝所需的桥接采样接口,因此触发报错。
关于自动求解器未回退非自适应的原因
solve函数的自动算法选择逻辑的判断依据默认仅包含问题维度、噪声类型(对角/非对角)、刚性特征等通用属性,暂未加入对自定义噪声过程是否支持桥接分布的检查逻辑。因此自动选择器会按默认规则选中开启自适应的求解算法,不会主动触发非自适应回退,这个属于库的体验优化待完善点,不属于逻辑错误。
推荐替代方案
如果需要保留自适应求解能力,不需要自定义CorrelatedWienerProcess!,可以通过对独立噪声做线性变换实现相关效果,示例代码如下:
heston_tspan = (0.0,1.0) μ = 1.0 κ = 1.0 Θ = 1.0 σ = 1.0 ρ = 0.333 # 预计算相关矩阵的Cholesky分解因子 correl = [1 ρ;ρ 1] L = cholesky(correl).L function heston_drift!(du,u,p,t) du[1] = μ*u[1] du[2] = κ*(Θ-u[2]) end function heston_sigma!(du,u,p,t) # 先计算原始独立噪声对应的扩散项 du[1] = √u[2]*u[1] du[2] = σ*√u[2] # 乘Cholesky因子转换为相关噪声 du .= L * du end # 用默认的独立维纳过程,支持桥接分布和自适应 heston_problem = SDEProblem(heston_drift!, heston_sigma!, ones(2), heston_tspan) heston_sol = solve(heston_problem) plot(heston_sol)
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

