运行 matlab 代码表明没有提供足够的输入,并且我们的 RHS 函数有问题

问题描述

代码的目标是在数值上模拟三个 三个维度的身体。所有的物体都有一个恒定的质量。 我们将确定物体相对于时间的位置的演变。然而,当我们运行代码时,RHS 函数出现故障,因为“没有提供足够的输入”,我们无法弄清楚原因。

    % initial conditions and parameters
    clc; 
    clear all; 

    M1=1;   %mass of body 1
    M2=2;   %mass of body 2 
    M3=0.5; %mass of body 3 


    % the position of the three bodies in the initial conditions 

    P1_0=[0,0];
    P2_0=[1,0];
    P3_0=[0,1];

    P1=P1_0;
    P2=P2_0;
    P3=P3_0;

    % the initial speed of the three bodies

    a=0.05;
    V1_0=[a,a,a];
    V2_0=[-a,a];
    V3_0=[-a,-a,-a];

    V1=V1_0;
    V2=V2_0;
    V3=V3_0;

    X0=[P1_0,V1_0,P2_0,V2_0,P3_0,V3_0]'; % the initial positions and speeds of the three bodies in 
    one column vector.

    [t,X]= ode45(@(t,X) RHS(t,X),[0 3],X0);


    h=0.1;
    K1=(h*RHS(X0));
    K2=h*(RHS(X0+0.5*K1));
    K3=h*(RHS(X0-K1+(2*K2)));
    X1=X0+(1/6)*(K1+4*K2+K3);

    function Y=RHS(t,X)
    V1=X(4:6);
    V2=X(10:12);
    V3=X(16:18);
    P1=X(1:3);
    P2=X(7:9);
    P3=X(13:15);
    M1=1;
    M2=2;
    M3=0.5;
    Y=[V1;Force(P1,M1,P2,M2,P3,M3)/M1;V2;Force(P2,P1,M3)/M2;V3;Force(P3,M3,M2)/M3];
    end 


    function F=Force(P,M,Pa,Ma,Pb,Mb)

    F=(-M*Ma*(P-Pa))/(norm(P-Pa)^3)-(M*Mb*(P-Pb))/(norm(P-Pb)^3);
    end 

解决方法

托马斯:

我只是在我这边运行了您的代码,它运行完美,包括对 ode45 的标注。但是,我确实遇到了您在问题中声称的相同错误。该错误由行 K1=(h*RHS(X0)) 触发,我相信这是您尝试设置 Runge-Kutta 方法的块的开始。您收到错误的原因是在该行中您只给 RHS 函数一个输入,但是,您已定义 RHS 接受两个输入(t 和 {{ 1}}):

X

由于 function Y=RHS(t,X) V1=X(4:6); V2=X(10:12); V3=X(16:18); P1=X(1:3); P2=X(7:9); P3=X(13:15); M1=1; M2=2; M3=0.5; Y=[V1;Force(P1,M1,P2,M2,P3,M3)/M1;V2;Force(P2,P1,M3)/M2;V3;Force(P3,M3,M2)/M3]; end 函数根本不使用 RHS(ODE 的自治系统),以下将规避错误:

t

MATLAB 只是在寻找额外的输入,仅此而已。 注意: 输入空向量 h=0.1; K1=(h*RHS([],X0)); K2=h*(RHS([],X0+0.5*K1)); K3=h*(RHS([],X0-K1+(2*K2))); X1=X0+(1/6)*(K1+4*K2+K3); 没有什么特别之处,实际上这个“修复”适用于任何输入(包括 [] 或复数)。诀窍是占用占位符输入。

,

另一个变体不是用虚拟参数扩展,而是减少到

function Y=RHS(X)

那么RK3步骤可以保持原样,而ode45调用需要适应

[t,X]= ode45(@(t,X) RHS(X),[0 3],X0);