在 Matlab 中用高斯白噪声求解一阶导数的二阶 SDE

计算科学 matlab 随机
2021-12-21 00:16:07

我在求解具有高斯白噪声的二阶微分方程时遇到了麻烦。我正在求解的方程如下:

Ax+Bx+sin(x)=i+in

其中in是高斯白噪声,i是恒定源。我最终对x感兴趣,而不是x如果没有高斯源,我可以简单地使用像ode15sor之类的 ODE 求解器ode45但是,对于随机源,我不知道如何使用 SDE 求解器来获得x任何有在 MATLAB 中解决 SDE 经验的人都可以提供一些建议吗?

1个回答

求解 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 不起作用;用这个另外,请注意,代码中使用的随机数生成器种子现在已弃用。