求Julia库中ESRK1与RSwM1实现代码,排查ESRK1收敛异常
ESRK1与RSwM1算法实现问题求助
我正在用Python实现Rackauckas & Nie(2017)提出的SDE求解器ESRK1及自适应步长算法RSwM1,以此验证对算法的理解。但在ESRK1实现阶段出现问题:用几何布朗运动的简单SDE测试时,时间步长dt不断减小的情况下解并未收敛,说明代码存在错误。
我了解到这些算法已在Julia的DifferentialEquations.jl库中实现,希望通过查看Julia代码获得帮助,但无法定位对应实现。若有人能指出Julia库中ESRK1和RSwM1的实现(或其他可读性强的正确实现),我将非常感激。我曾在StochasticDiffEq.jl仓库中搜索ESRK和RSwM,但未找到与论文描述相符的实现。
更新:
我已找到ESRK1的代码,但仍未找到RSwM1的代码。
以下是我尚未修正的ESRK1 Python实现代码:
def ESRK1(U, t, dt, f, g, dW, dZ): # Implementation of ESRK1, following Rackauckas & Nie (2017) # Eq. (2), (3) and (4) and Table 1 # Stochastic integrals, taken from Eqs. (25) - (30) in Rackauckas & Nie (2017) I1 = dW I11 = (I1**2 - dt) / 2 I111 = (I1**3 - 3*dt*I1) / 6 I10 = (I1 + dZ/np.sqrt(3))*dt / 2 # Coefficients, taken from Table 1 in Rackauckas & Nie (2017) # All coefficients not included below are zero c0_2 = 3/4 c1_2, c1_3, c1_4 = 1/4, 1, 1/4 A0_21 = 3/4 B0_21 = 3/2 A1_21 = 1/4 A1_31 = 1 A1_43 = 1/4 B1_21 = 1/2 B1_31 = -1 B1_41, B1_42, B1_43 = -5, 3, 1/2 alpha1, alpha2 = 1/2, 2/3 alpha_tilde1, alpha_tilde2 = 1/2, 1/2 beta1_1, beta1_2, beta1_3 = -1, 4/3, 2/3 beta2_1, beta2_2, beta2_3 = -1, 4/3, -1/3 beta3_1, beta3_2, beta3_3 = 2, -4/3, -2/3 beta4_1, beta4_2, beta4_3, beta4_4 = -2, 5/3, -2/3, 1 # Stages in the Runge-Kutta approximation # Eqs. (3) and (4) and Table 1 in Rackauckas & Nie (2017) # First stages H0_1 = U # H^(0)_1 H1_1 = U # Second stages H0_2 = U + A0_21 * f(t, H0_1)*dt + B0_21 * g(t, H1_1)*I10/dt H1_2 = U + A1_21 * f(t, H0_1)*dt + B1_21 * g(t, H1_1)*np.sqrt(dt) # Third stages H0_3 = U H1_3 = U + A1_31 * f(t, H0_1) * dt + B1_31 * g(t, H1_1) * np.sqrt(dt) # Fourth stages H0_4 = U H1_4 = U + A1_43 * f(t, H0_3) * dt + (B1_41 * g(t, H1_1) + B1_42 * g(t+c1_2*dt, H1_2) + B1_43 * g(t+c1_3*dt, H1_3)) * np.sqrt(dt) # Construct next position # Eq. (2) and Table 1 in Rackauckas & Nie (2017) U_ = U + (alpha1*f(t, H0_1) + alpha2*f(t+c0_2*dt, H0_2))*dt \ + (beta1_1*I1 + beta2_1*I11/np.sqrt(dt) + beta3_1*I10/dt ) * g(t, H1_1) \ + (beta1_2*I1 + beta2_2*I11/np.sqrt(dt) + beta3_2*I10/dt ) * g(t + c1_2*dt, H1_2) \ + (beta1_3*I1 + beta2_3*I11/np.sqrt(dt) + beta3_3*I10/dt ) * g(t + c1_3*dt, H1_3) \ + (beta4_4*I111/dt ) * g(t + c1_4*dt, H1_4) # Calculate error estimate # Eq. (9) and Table 1 in Rackauckas & Nie (2017) E = -dt*(f(t, H0_1) + f(t + c0_2*dt, H0_2))/6 \ + (beta3_1*I10/dt + beta4_1*I111/dt)*g(t, H1_1) \ + (beta3_2*I10/dt + beta4_2*I111/dt)*g(t + c1_2*dt, H1_2) \ + (beta3_3*I10/dt + beta4_3*I111/dt)*g(t + c1_3*dt, H1_3) \ + (beta4_4*I111/dt)*g(t + c1_4*dt, H1_4) # Return next position and error return U_, E
参考论文:Rackauckas & Nie(2017)
内容的提问来源于stack exchange,提问作者Tor
相关产品推荐
相关产品推荐

