Решить систему дифференциальных уравнений с ODE45 в Matlab - PullRequest
0 голосов
/ 11 ноября 2019

Мне нужно решить систему дифференциальных уравнений за выбранный промежуток времени, но уравнения зависят от некоторых переменных, которые меняются со временем. Я пытаюсь написать функцию «odefun» для использования в ode45, и когда я запускаю код с промежутком времени и начальными условиями, он, кажется, работает, но я не уверен, действительно ли код выполняет то, что я хочу.

function [dX]=gauss(t,X)
mu_S=1.327*10^11; T=0.06; %constants
a=X(1); e=X(2);
n=sqrt(mu_S/a^3); M=n*t; %need to change with every iteration
[E] = KeplerPicard(M,e,0.5*10^-4);
dX(1)=2/n*sqrt((1+e*cos(E))/(1-e*cos(E)))*T; %da/dt
dX(2)=2*(1-e^2)*cos(E)/(a*n*sqrt(1-e^2*(cos(E))^2))*T; %de/dt
dX=dX(:);
end

dX (1) - это производная от a, которая является моим X (1), а dX (2) - это производная от e, X (2). Функция Кеплера Пикара определяется следующим образом:

function [E] = KeplerPicard(M,e,eps)
E=M;
err=1;
while err>eps
    En=e*sin(E)+M;
    err=abs(En-E);
    E=En;
end 

Я хочу, чтобы переменная 'n' менялась во времени и использовала новое значение 'a + da' (или, альтернативно, 'X (1) + dX (1) '), но я не знаю, делает ли это код. Следует отметить, что таким образом код выполняется без ошибок, но я не знаю, верны ли результаты (если код видит n как константу, они определенно ошибочны). Есть что-то, что мне нужно изменить? Спасибо!

...