У меня вопрос об использовании Matlab для вычисления решения стохастических дифференциальных уравнений. Уравнения - это 2.2a, b, стр. 3, в this paper (PDF).ode45 для уравнения Ланжевена
Мой профессор предложил использовать ode45
с небольшим шагом времени, но результаты не совпадают с результатами в статье. В частности, временные ряды и pdf. Я также сомневаюсь в определении белого шума в функции.
Вот код для функции интеграции:
function dVdt = R_Lang(t,V)
global sigma lambda alpha
W1=sigma*randn(1,1);
W2=sigma*randn(1,1);
dVdt=[alpha*V(1)+lambda*V(1)^3+1/V(1)*0.5*sigma^2+W1;
sigma/V(1)*W2];
end
Основной сценарий:
clear variables
close all
global sigma lambda alpha
sigma=sqrt(2*0.0028);
alpha=3.81;
lambda=-5604;
tspan=[0,10];
options = odeset('RelTol',1E-6,'AbsTol',1E-6,'MaxStep',0.05);
A0=random('norm',0,0.5,[2,1]);
[t,L]=ode45(@(t,L) R_Lang(t,L),tspan,A0,options);
Если у вас есть какие-либо предложения, я был бы признателен.
Здесь новый код, чтобы противостоять моему методу EM и 'sde_euler'.
lambda = -5604;
sigma=sqrt(2*0.0028) ;
Rzero = 0.03; % problem parameters
phizero=-1;
dt=1e-5;
T = 0:dt:10;
N=length(T);
Xi1 = sigma*randn(1,N); % Gaussian Noise with variance=sigma^2
Xi2 = sigma*randn(1,N);
alpha=3.81;
Rem = zeros(1,N); % preallocate for efficiency
Rtemp = Rzero;
phiem = zeros(1,N); % preallocate for efficiency
phitemp = phizero;
for j = 1:N
Rtemp = Rtemp + dt*(alpha*Rtemp+lambda*Rtemp^3+sigma^2/(2*Rtemp)) + sigma*Xi1(j);
phitemp=phitemp+sigma/Rtemp*Xi2(j);
phiem(j)=phitemp;
Rem(j) = Rtemp;
end
f = @(t,V)[alpha*V(1)+lambda*V(1)^3+0.5*sigma^2/V(1)/2;
0]; % Drift function
g = @(t,V)[sigma;
sigma/V(1)]; % Diffusion function
A0 = [0.03;0]; % 2-by-1 initial condition
opts = sdeset('RandSeed',1,'SDEType','Ito'); % Set random seed, use Ito formulation
L = sde_euler(f,g,T,A0,opts);
plot(T,Rem,'r')
hold on
plot(T,L(:,1),'b')
Еще раз спасибо за помощь!
Спасибо @horchler. Еще один вопрос. Следуя вашему предложению, я написал код E-M для вычисления решения. Но я не получаю тех же результатов, что и sde_euler. Я изменил вопрос, чтобы включить новый код. Можете ли вы сказать мне, где ошибка (я думаю, что что-то не так в определении гауссовского шума)? – GV871
@Giovanni: Ваши начальные условия не совпадают. И цикл 'for' должен быть' 2: N' - первые значения в вашем векторе решения должны быть вашими начальными условиями. Вы также не засеваете генератор случайных чисел (используйте 'rng'), и случайные значения будут упорядочены иначе, чем' sde_euler'. – horchler
Тогда, возможно, самое главное, ваша интеграция вариаций Винера неверна. 'Xi1' следует определять как' sigma * sqrt (dt) * randn (1, N); '(то же самое для' Xi2'). И в вашем цикле интеграции 'phitemp' определяется неправильно. Это функция предыдущего R и поэтому ее нужно сначала вычислить как «phitemp = phitemp + Xi2 (j)/Rtemp;» (вы также добавляли дополнительную «сигму»). Удалите лишнюю 'sigma' из расчета' sigma' (это уже в 'Xi1'). – horchler