基于Boost C++的Milstein方法求解扩散对流SDE不收敛问题排查
SDE扩散项尺度错误:你给出的随机表示是
dx = v(x)dt + D(x)dW,但Feynman-Kac公式中,PDE的扩散项$\frac{\partial}{\partial x}\left(D(x)\frac{\partial u}{\partial x}\right)$对应的SDE扩散系数应该是$\sqrt{2D(x)}$,而非$D(x)$。这是核心的尺度不匹配问题——直接导致粒子的扩散速率和PDE解的扩散速率完全错位,直方图柱心和峰值自然无法对齐。Milstein方法的修正项缺失:你的扩散系数$D(x)=D_0(1+x^2)$是x的函数,Milstein方法必须包含扩散系数导数的修正项:$\frac{1}{2}\frac{\partial \sigma(x)}{\partial x}(\Delta W_t)^2$(其中$\sigma(x)=\sqrt{2D(x)}$)。如果只采用欧拉-Maruyama格式或遗漏了这个修正项,在扩散系数随x变化显著的场景下,误差会被快速放大,导致粒子分布偏移。
边界条件不一致:检查有限差分法的边界条件(如周期性、Dirichlet、Neumann)与随机模拟的边界处理逻辑是否完全匹配。比如PDE用周期性边界,但随机粒子跑出计算域就被丢弃;或者PDE用吸收边界,随机模拟却让粒子反弹,两种场景下的分布必然出现偏差。
初始条件不匹配:确认PDE的初始条件和随机模拟的粒子初始分布严格一致。比如PDE初始为高斯分布,随机粒子是否严格按照同一均值、方差的高斯分布采样?初始分布的微小偏差会随着时间演化被放大,最终导致结果错位。
有限差分法的数值误差:虽然用了RK4,但需验证有限差分的空间离散格式是否正确——比如扩散项是否采用二阶中心差分?若空间步长过大或格式为一阶精度,PDE解本身就存在偏差,自然无法与随机模拟结果对齐。可以先用简单测试案例(如D(x)、v(x)为常数的情况,存在解析解)验证有限差分法的正确性。
内容的提问来源于stack exchange,提问作者Shreyas Seethalla

