Я пытаюсь смоделировать колебания Курамото в Matlab. Я попытался использовать ode45 для решения системы. Я также видел, как кто-то другой использовал метод Рунге-кутта. Я понимаю, что ode45 использует метод Рунге-кутты, однако значения, которые я получаю от каждого, подозрительно отличаются.
kuramoto= @(x,K,N,Omega)Omega+(K/N)*sum(sin(x*ones(1,N)-(ones(N,1)*x')))'
%Kuramoto is a model of N coupled ocilators (such as multiple radiowaves)
%The solution to the model is the phase of each ocilator
%[Kuramoto Equation][1]
theta(:,1) = 2*pi*randn(N,1);
t0 = theta(:,1);
[t,y] = ode45(@(t,y)kuramoto(theta(:,1),K,N,omega),tspan,t0);
%Runge-Kutta method
for j=1:iter
k1=kuramoto(theta(:,j),K,N,omega);
k2=kuramoto(theta(:,j)+0.5*h*k1,K,N,omega);
k3=kuramoto(theta(:,j)+0.5*h*k2,K,N,omega);
k4=kuramoto(theta(:,j)+h*k3,K,N,omega);
theta(:, j+1)=theta(:,j)+(h/6)*(k1+2*k2+2*k3+k4);
end
Оба метода выводят матрицу с N строками (где каждая строка представляет отдельный осциллятор) и M столбцами (где M представляет решение в данный момент времени). У меня есть ode45, обеспечивающий решения от 0 до 0,5 с интервалом 0,1. Чтобы сравнить методы, я вычитаю матрицу, полученную из Рунге-Кутты, с матрицей, полученной с помощью ode45. В идеале, оба должны иметь одинаковые значения, и результат должен быть нулевой матрицей, но вместо этого я получаю такие значения, как:
0 -0.0003 -0.0012 -0.0027 -0.0048 -0.0076
0 0.0003 0.0012 0.0027 0.0048 0.0076
%here I have only two oscillators from t = [0.0,0.5]
Существует небольшая разница между двумя матрицами (которая увеличивается с большими интервалами времени). Но необычно, что общее значение, рассчитанное в каждый момент времени (т. Е. Каждый столбец), одинаково. Это согласуется независимо от количества генераторов.
Я не уверен, является ли это математической проблемой или проблемой программирования (возможно, обе), и мне кажется, что я вызываю ode45 неправильно, но я не уверен и не смог выяснить, что не так в течение нескольких дней , Любая помощь будет оценена.