在Matlab中用ODE45求解微分方程组

在Matlab中用ODE45求解微分方程组,matlab,ode,ode45,Matlab,Ode,Ode45,我需要在选定的时间跨度内解一个微分方程组,但方程依赖于一些随时间变化的变量。我试图编写在ode45中使用的函数'odefun',当我使用时间跨度和初始条件运行代码时,它似乎可以工作,但我不确定代码是否真的在做我想要的事情 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

我需要在选定的时间跨度内解一个微分方程组,但方程依赖于一些随时间变化的变量。我试图编写在ode45中使用的函数'odefun',当我使用时间跨度和初始条件运行代码时,它似乎可以工作,但我不确定代码是否真的在做我想要的事情

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的导数,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”视为常量,那么它们肯定是错误的)。
有什么我需要改变的吗?谢谢

如果你想验证物理,最好在物理论坛上提问只要
| e |好的,谢谢。我的主要问题是,在这段代码中,一个变量在很短的时间内变得不切实际地大,但在这一点上,我相信这是因为我选择了错误的函数来解微分方程。你有没有一个来源,这些方程是从开普勒定律或牛顿引力推导出来的?很抱歉,我的回答太晚了。我使用了第7章中的方程,使用了一个有分量(Ft,Fn,W)=(T,0,0)的力