我在求解具有高斯白噪声的二阶微分方程时遇到了麻烦。我正在求解的方程如下:
其中是高斯白噪声,是恒定源。我最终对感兴趣,而不是。如果没有高斯源,我可以简单地使用像ode15sor之类的 ODE 求解器ode45。但是,对于随机源,我不知道如何使用 SDE 求解器来获得。任何有在 MATLAB 中解决 SDE 经验的人都可以提供一些建议吗?
我在求解具有高斯白噪声的二阶微分方程时遇到了麻烦。我正在求解的方程如下:
其中是高斯白噪声,是恒定源。我最终对感兴趣,而不是。如果没有高斯源,我可以简单地使用像ode15sor之类的 ODE 求解器ode45。但是,对于随机源,我不知道如何使用 SDE 求解器来获得。任何有在 MATLAB 中解决 SDE 经验的人都可以提供一些建议吗?
求解 SDE 最直接的方法是使用Euler-Maruyama方案。这是一种简单而有效的加性噪声方法,即扩散/噪声项不是状态的函数,您的示例似乎就是这种情况。这是一些解决您的系统的 Matlab 代码:
n = 2; % Order of system
t0 = 0; % Initial time
dt = 1e-3; % Fixed time step
tf = 1; % Final time
t = t0:dt:tf; % Time vector
tlen = length(t);
A = 1;
B = 1;
c = 1;
f = @(t,x)[x(2);(-B*x(2)-sin(x(1))+c)/A]; % Drift function
ep = 1e-1; % Size of additive noise
g = @(t,x)[0;ep]; % Diffusion function
x = zeros(lt,n); % Allocate output
x0 = [1;1];
x(1,:) = x0; % Set initial condition
seed = 1; % Seed value
rng(seed); % Always seed random number generator
% Euler-Maruyama
for i = 1:tlen-1
x(i+1,:) = x(i,:).' + f(t(i),x(i,:))*dt + g(t(i),x(i,:)).*randn(n,1)*sqrt(dt);
end
figure;
plot(t,x);
xlabel('Time');
ylabel('State');
legend('x(t)','xdot(t)')
这不是像 那样的自适应方法ode45,因此您需要确保积分步长dt足够小。有很多方法可以优化上述代码并使其不那么通用(例如,简化匿名函数、预先计算正态变量等)。您也可以尝试sde_euler在我的 Github 上的SDETools Matlab 工具箱中使用,它有许多类似于 ODE 套件中的选项。请参阅Math.SE 上的此答案。
对于像您这样专门针对二阶 SDE 的方法,您可以查看Burrage 等人的这篇论文(PDF)。对于数值求解 SDE 的介绍,我推荐这篇论文,其中包括许多 Matlab 示例:
Desmond J. Higham,2001,随机微分方程数值模拟的算法介绍,SIAM Rev.(Educ. Sect.),43 525-46。http://dx.doi.org/10.1137/S0036144500378302
论文中 Matlab 文件的 URL 不起作用;用这个。另外,请注意,代码中使用的随机数生成器种子现在已弃用。