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

时间:2014-03-13 14:56:39

标签: 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^2,1,3.0135E-6,3.693E-8]) and the initial conditions
vector must have the same number of elements.

我不明白为什么输出矢量的长度为12.我试图解决的问题是三体引力系统,其中地球和月球轨道围绕着静止的太阳。这是我的初步工作(定义函数等):

syms x_SE y_SE x_SM y_SM x_EM y_EM v_Ex v_Ey v_Mx v_My Ms Me Mm G t

r_SE = [x_SE;y_SE]
r_SM = [x_SM;y_SM]
x_EM = x_SE - x_SM
y_EM = y_SE - y_SM
r_EM = [x_EM;y_EM]

eqs_1 = -(Ms*G*x_SE)./(r_SE).^3-(Mm*G*x_EM)./(r_EM).^3
eqs_2 = -(Ms*G*y_SE)./(r_SE).^3-(Mm*G*y_EM)./(r_EM).^3
eqs_3 = -(Ms*G*x_SM)./(r_SM).^3-(Me*x_EM)./(r_EM).^3
eqs_4 = -(Ms*G*y_SM)./(r_SM).^3-(Me*y_EM)./(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_SE;v_Ey;y_SE;v_Mx;x_SM;v_My;y_SM],...
                   [G,Ms,Me,Mm]},'file','three_body_grav')

回过头来看,我现在意识到我对变量的命名很差;但是让我试着描述每一个。 r_SE是从太阳指向地球的向量; r_SM是指向太阳和月亮之间的向量; r_EM是从地球指向月球的矢量; eqs1eqs4是地球和月球在x和y方向上的加速度;而eqs只是存储这些未知函数的列向量。 v_Exv_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);

根据我的理解,应该只有八个初始条件:一个用于v_Ex(初始x地球速度),x_SE(地球的初始位置),v_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

0 个答案:

没有答案