Matlab ode45输出向量和初始条件向量

Matlab ode45输出向量和初始条件向量,matlab,function,vector,ode,Matlab,Function,Vector,Ode,以下是我在运行代码时收到的错误消息: Error using odearguments (line 92) @(T,Y,P)THREE_BODY_GRAV(T,Y,[4*PI^2,1,3.0135E-6,3.693E-8]) returns a vector of length 12, but the length of initial conditions vector is 8. The vector returned by @(T,Y,P)THREE_BODY_GRAV(T,Y,[4*PI

以下是我在运行代码时收到的错误消息:

Error using odearguments (line 92)
@(T,Y,P)THREE_BODY_GRAV(T,Y,[4*PI^2,1,3.0135E-6,3.693E-8]) returns a vector of length
12, but the length of initial conditions vector is 8. The vector returned by
@(T,Y,P)THREE_BODY_GRAV(T,Y,[4*PI^2,1,3.0135E-6,3.693E-8]) and the initial conditions
vector must have the same number of elements.
我不明白为什么输出向量的长度是12。我试图解决的问题是三体引力系统,地球和月球围绕静止的太阳运行。以下是我的初步工作(定义功能等):

回顾这一点,我现在意识到我对变量的命名很糟糕;但让我试着描述每一个
r_SE
是从太阳指向地球的矢量
r_SM
是指向太阳和月亮之间的向量
r_EM
是从地球指向月球的矢量
eqs1
eqs4
是地球和月球在x和y方向上的加速度;而
eqs
只是存储这些未知函数的列向量
v_Ex
v_Ey
是地球的x和y方向速度

然后我使用
matlabFunction
来定义,它似乎做得很好。然而,一旦我达到了我想要近似未知函数的点,这样我就可以得到作为时间函数的位置,我收到了上面提到的错误。以下是我的跑步记录:

[tout,yout] = ode45(@(t,Y,P)three_body_grav(t,Y,[4*pi^2,1,3.0135e-6,3.693e-8]),...
                    [0,1],[0;1;1;0;0;1;1;0],myoptions);
据我所知,应该只有八个初始条件:一个是地球的初始x速度,
x\u-SE(地球的初始位置),
v\u-Ey
(地球的初始y速度)
y_SE
(地球的初始y位置),
v_Mx
(月球的初始x速度),
x_SM
(月球的初始x位置),
v_My
(月球的初始y速度),
y_SM
(月球的初始y位置)

有什么可能解释我的错误吗

编辑:我能够修复它。以下是更新的代码:

syms x_E y_E x_M y_M x_EM y_EM v_Ex v_Ey v_Mx v_My Ms Me Mm G t

r_E = [x_E;y_E]

mag_r_E = sqrt(r_E.'*r_E)

r_M = [x_M;y_M]

mag_r_M = sqrt(r_M.'*r_M)

r_EM = r_E - r_M

mag_r_EM = sqrt(r_EM.'*r_EM)

eqs_1 = -(Ms*G*x_E)./(mag_r_E).^3-(Mm*G*(x_E-x_M))./(mag_r_EM).^3

eqs_2 = -(Ms*G*y_E)./(mag_r_E).^3-(Mm*G*(y_E-y_M))./(mag_r_EM).^3

eqs_3 = -(Ms*G*x_M)./(mag_r_M).^3-(Me*G*(x_E-x_M))./(mag_r_EM).^3

eqs_4 = -(Ms*G*y_M)./(mag_r_M).^3-(Me*G*(y_E-y_M))./(mag_r_EM).^3

eqs = [eqs_1;v_Ex;eqs_2;v_Ey;eqs_3;v_Mx;eqs_4;v_My]

matlabFunction(eqs,'vars',{t,[v_Ex;x_E;v_Ey;y_E;v_Mx;x_M;v_My;y_M],[G,Ms,Me,Mm]},'file','three_body_grav')
问题是我在除以一个向量;在牛顿引力定律中,我们应该除以距离向量的大小

然而,现在我有另一个困难。当我使用

[tout,yout] = ode45(@(t,Y,P) three_body_grav(t,Y,[4*pi^2,1,3.0135e-6,3.693e-8]),[0,1],[0;1;1;0;0;1;1;0],myoptions);
要求解未知函数,除了输出向量中的第一个元素外,其他所有元素都是“NaN”。例如

 yout(:,1)

ans =

     0
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN

请包括使用
syms
创建变量以使代码可运行的行。我推荐一些简单的调试:打印并比较
eqs
[v_-Ex;x_-SE;v_-Ey;y_-SE;v_-Mx;x_-SM;v_-My;y_-SM]
的维度,我刚刚编辑了我的帖子。我刚刚比较了维度,eqs是12x1,而[v_-Ex;x_-SE;v_-Ey;y_-SE;v_-Mx;x_-SM;v_-My;y-SM]是8x1。所以,我回顾了eqs的内容,eqs_1是一个2x1矩阵。为什么会这样?我不希望它是2x1,我希望它是eqs_1,只是作为一个变量。另外,我研究了eqs_1的每个元素,这就是我得到的:eqs_1(1,1)=-(GMm)/(x_SE-x_SM)^2-(GMs)/x_SE^2…和。。。eqs_1(2,1)=-(GMsx_SE)/y_SE^3-(G*Mm*(x_SE-x_SM))/(y_SE-y_SM)^3So,如何重新定义这些变量,使eqs_1成为2x1向量?是什么定义了一个新的变量,它的大小是R_SE、R_SM和R_EM?那么,
NaN
是如何产生的呢?常用的方法是
0/0
Inf/Inf
,或
Inf-Inf
。在你的情况下,第一个似乎是可能的。我会确保你的初始条件是正确的,并且符合正确的方程式。运行
y0=[0;1;1;0;0;1;1;0]
p=[4*pi^2,1,3.0135e-6,3.693e-8]
在初始条件下评估您的系统。学习如何编写自己的集成函数,而不是使用
matlabFunction
,这可能是一个好主意,因为这似乎会让您感到困惑。
 yout(:,1)

ans =

     0
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN