#matlab #ode #noise
#matlab #ode #шум
Вопрос:
Я хотел бы добавить шум в нелинейную связанную систему ODE (модель Фитцхью-Нагумо). Я добавил гауссовский белый шум на вход (см. Код: добавление шума в dot (V), который является динамикой напряжения), и я хотел бы получить аналогичные `неровные» всплески, когда я добавляю шум в переменную восстановления ( dot (w)).
Тем не менее, я использую более или менее ту же процедуру для добавления шума к переменной восстановления, хотя мне пришлось уменьшить сигму. В результате я получаю переменный результат, но не «зубчатые» всплески, как хотелось бы видеть. До сих пор мне не удалось выяснить, как изменить масштаб системы, чтобы получить аналогичное моделирование с шумом для динамики напряжения и динамики восстановления.
Код для добавления гауссовского белого шума к динамике напряжения (разница между кодом `сигма» и где шум добавляется в прямом эйлере):
%% Parameters
%Time vector for integration
dt = 0.1;
tend = (3/1e-2); %make sure to capture some spikes
t = 0:dt:tend;
%simulations
nsimu = 20;
%Initial values
V0 = -1.5;
w0 = -3/8;
%initial values vectors
V = zeros(1, length(t));
V(1) = V0;
w = zeros(1, length(t));
w(1) = w0;
%input
Iapp = 0.3303;
%noise
sigma = 1.0;
nsimu = 50;
eta = zeros(1,length(t));
%% Functions
dV = @(t, V, w) V - V^3/3 - w Iapp;
dw = @(t, V, w) 0.08*(V 0.7 - 0.8* w);
%% Adding white noise on input
for m = 1:nsimu
%Generate noise vector
for i = 1:length(t)-1
eta(i 1) = eta(i) sigma*sqrt(dt)*randn;
end
%Forward Euler white noise
for ii = 1:length(eta)-1
w(ii 1) = w(ii) dt * dw(t, V(ii), w(ii));
V(ii 1) = V(ii) dt * dV(t, V(ii), w(ii)) dt*eta(ii);
end
plot(t, V, 'k-', 'LineWidth', 1.5)
drawnow
end
Код для добавления шума к переменной восстановления `w’. (Довольно похоже на предыдущий код… но над этим нужно поработать)
%% Parameters
%Time vector for integration
dt = 0.1;
tend = (3/1e-2); %make sure to capture some spikes
t = 0:dt:tend;
%simulations
nsimu = 20;
%Initial values
V0 = -1.5;
w0 = -3/8;
%initial values vectors
V = zeros(1, length(t));
V(1) = V0;
w = zeros(1, length(t));
w(1) = w0;
%input
Iapp = 0.3303;
%noise
sigma = 1e-3;
nsimu = 50;
eta = zeros(1,length(t));
%% Functions
dV = @(t, V, w) V - V^3/3 - w Iapp;
dw = @(t, V, w) 0.08*(V 0.7 - 0.8* w);
%% Adding white noise on input
for m = 1:nsimu
%Generate noise vector
for i = 1:length(t)-1
eta(i 1) = eta(i) sigma*sqrt(dt)*randn;
end
%Forward Euler white noise
for ii = 1:length(eta)-1
w(ii 1) = w(ii) dt * dw(t, V(ii), w(ii)) dt*eta(ii);
V(ii 1) = V(ii) dt * dV(t, V(ii), w(ii));
end
plot(t, V, 'k-', 'LineWidth', 1.5)
drawnow
end
Результатом обоих кодов должно быть возмущенное моделирование динамики системы. Моделирование шума на w' should appear the same as the simulation of noise on
V’.
Комментарии:
1. Вместо добавления
dt*eta(ii)
, добавьте(eta(ii 1)-eta(ii))
, как того требует формулаdw=a(t,V,w)*dt sigma*dB
в формализме Ito. Конечно, то, что вы делаете, тоже правильно, но использует интегрированное случайное блуждание, которое является дифференцируемой функцией.2. Потрясающе, спасибо! Это работает как для динамики напряжения, так и для динамики восстановления. Динамика напряжения теперь выглядит действительно хорошо. Динамика восстановления происходит в другом масштабе времени (она медленнее, чем динамика напряжения), поэтому я умножаю шум на
(dt/0.08)* eta(ii 1) - eta(ii)
и добавляю его на шаге прямого Эйлера « для ii = 1: длина (eta)-1 w (ii 1) = w (ii) dt * dw (t, V (ii), w(ii)) (dt / 0.08) * eta(ii 1) — eta(ii); V (ii 1) = V(ii) dt * dV(t, V(ii), w(ii)); конец « Это правильно? Могу ли я это сделать?