随机微分方程(Stochastic Differential Equations,SDEs)是描述系统在随机扰动下动态行为的数学模型。与常微分方程(Ordinary Differential Equations,ODEs)不同,SDEs考虑了系统中随机性或不确定性,通常用于建模物理、金融、生物等领域的动态系统。以下是对随机微分方程的详细介绍。
随机微分方程通常写作如下形式:
解决SDE的方法与常微分方程不同,常用的方法有:
随机微分方程在多个领域有广泛应用:
下面是一个简单的随机微分方程示例:
如前所示,可以使用Julia的包来求解SDE。该库提供了强大的功能,可以方便地定义和解决随机微分方程。
代码块
using DifferentialEquations
function sde_system!(du, u, p, t)
du[1] = ...
# 其他的方程
end
# 设置问题
sde_prob = SDEProblem(sde_system!, u0, tspan, p)
sol = solve(sde_prob)
复制成功
在科学计算领域,特别是ODE类微分方程的求解,Julia已经实现并覆盖了最大部分的求解算法,相比于其他科学计算软件(MATLAB)

图片来源:https://www.stochasticlifestyle.com/comparison-differential-equation-solver-suites-matlab-r-julia-python-c-fortran/#:~:text=For%20the%20current%20state%20of%20the%20reproducible%20benchmarks
视频里面up是用matlab的ode45求解器实现的,由于原论文的控制器参数不能正常复现实验结果,所以参考了视频中的参数设置,完整julia代码如下
using DifferentialEquations
using Plots
function sig(x, alpha)
return abs(x)^alpha * sign(x)
end
function d_t(t)
return 2 - cos(t)
end
function control_law(x1, x2, x3)
return -35.9 * x1 - 48.15 * x2 - 35.47 * x3
end
function sde01!(dx, x, p, t)
u = control_law(x[1], x[2], x[3])
dx[1] = d_t(t) * sig(x[2], 5/7) + 1/10*sin(x[3])
dx[2] = sig(x[3], 5/7)
dx[3] = sig(u, 5/7)
end
function σ_sde01!(dx, x, p, t)
dx[1] = 1/6*sig(x[3],6/7)
dx[2] = 0.0
dx[3] = 0.0
end
prob = SDEProblem(sde01!, σ_sde01!, [0.5, -2.0, 3.0], [0.0, 6.0])
sol = solve(prob)
plot(sol, idx=(1, 2, 3))
function control_law(x)
x1, x2, x3 = x
return -35.9 * x1 - 48.15 * x2 - 35.47 * x3
end
plot(sol.t, control_law.(sol.u))
复制成功

states of x

u
与视频中的求解结果一致。
注:Julia支持重载,当参数列表不同时为不同的函数,调用时根据实际情况而定
同时,下面给出python的求解,也适用于其它ode方程的初值问题,
代码块
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
# 定义控制律 u
def control_law(x1, x2, x3):
return -35.9 * x1 - 48.15 * x2 - 35.47 * x3
def sig(x, alpha):
return np.abs(x)**alpha*np.sign(x)
# 定义随机微分方程 (SDE)
def sde_system(t, x):
x1, x2, x3 = x
# 定义 d(t)
d_t = 2 - np.cos(t)
# 控制律 u
u = control_law(x1, x2, x3)
# 随机扰动部分
noise = np.random.normal()
# 微分方程的确定性部分
dx1_dt = d_t * sig(x2, 5/7) + (1/10) * np.sin(x3) + (1/6) * sig(x3,6/7) * noise
dx2_dt = sig(x3, 5/7)
dx3_dt = sig(u, 5/7)
return np.array([dx1_dt, dx2_dt, dx3_dt])
# 设置初始条件和时间范围
x0 = [0.5, -2, 3] # 初始条件 [x1(0), x2(0), x3(0)]
T = 10 # 时间范围
t_span = [0, T]
t_eval = np.linspace(0, 10, 5000) # 用于评估的时间点
# 噪声强度
noise_strength = 0.1
# 使用 solve_ivp 来求解 SDE
sol = solve_ivp(sde_system, t_span, x0, t_eval=t_eval, method='RK45')
# 提取解
x1_sol = sol.y[0]
x2_sol = sol.y[1]
x3_sol = sol.y[2]
# 计算控制律 u(t) 在每个时间点的值
u_sol = control_law(x1_sol, x2_sol, x3_sol)
# 绘制状态变量 x1, x2, x3 和控制律 u 的结果
plt.figure(figsize=(12, 8))
# 状态变量图
plt.subplot(2, 1, 1)
plt.plot(t_eval, x1_sol, label="x1(t)", color="r")
plt.plot(t_eval, x2_sol, label="x2(t)", color="g")
plt.plot(t_eval, x3_sol, label="x3(t)", color="b")
plt.xlim([0,5])
plt.xlabel('Time (t)')
plt.ylabel('States (x1, x2, x3)')
plt.title('Closed-loop System Response')
plt.legend()
plt.grid(True)
# 控制律 u 图
plt.subplot(2, 1, 2)
plt.plot(t_eval, u_sol, label="u(t)", color="m")
plt.xlim([0,6])
plt.xlabel('Time (t)')
plt.ylabel('Control Law u(t)')
plt.title('Control Law u(t) over Time')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
复制成功

总结
随机微分方程是理解和建模具有随机性的动态系统的重要工具。通过结合确定性和随机性,它们能够提供对现实世界中许多现象的深入理解和预测能力。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删