在MATLAB中求解4个耦合微分方程

在MATLAB中求解4个耦合微分方程,matlab,Matlab,我有一组耦合的ODE,我想用MATLAB解决。方程式如下所示 我有4个边界条件:x(0),y(0),v(0),θ(0)。如果我尝试用dsolve解决这个问题,我会得到一个警告,即无法找到显式解决方案。 这是我使用的代码 syms x(t) y(t) v(t) theta(t) % params m = 80; %kg g = 9.81; %m/s^2 c = 0.72; % s = 0.5; %m^2 th

我有一组耦合的ODE,我想用MATLAB解决。方程式如下所示

我有4个边界条件:x(0),y(0),v(0),θ(0)。如果我尝试用
dsolve
解决这个问题,我会得到一个警告,即无法找到显式解决方案。 这是我使用的代码

syms x(t) y(t) v(t) theta(t)

% params
m = 80;             %kg
g = 9.81;           %m/s^2
c = 0.72;           %
s = 0.5;            %m^2
theta0 = pi/8;      %rad
y0 = 0;             %m
rho = 0.94;         %kg/m^3


% component velocities
xd = diff(x,t) == v*cos(theta);
yd = diff(y,t) == v*sin(theta);

% Drag component
D = c*rho*s/2*(xd^2+yd^2);

% Acceleration
vd = diff(v,t) == -D/m-g*sin(theta);

% Angular velocity
thetad = diff(theta,t) == -g/v*cos(theta);

cond = [v(0) == 10,y(0) == 0, x(0) == 0, theta(0) == theta0];
dsolve([xd yd vd thetad],cond)

这看起来有点像某种钟摆

你的方程中有

dθ(t)/dt = C·cos(θ(t)) 
这类似于钟摆的常微分方程,至少它有相同的问题:这个方程的闭式解是未知的。我相信它甚至被证明不存在,但我不是100%确定

无论如何,从数字上来说,这是小菜一碟。下面是如何使用
ode45
执行此操作的示例:

function my_ode()

    % parameters
    m   = 80;     % kg
    g   = 9.81;   % m/s² 
    c   = 0.72;   % -
    s   = 0.5;    % m²
    rho = 0.94;   % kg/m³ 

    theta0 = pi/8; % rad
    v0     = 10;   % m/s
    x0     = 0;    % m
    y0     = 0;    % m

    tspan = [0 10]; % s


    % function to compute derivative of
    % Z = [x, y, th, v]
    function dZdt = odefcn(~,Z)

        % rename for clarity (NOTE: x and y are not used)
        th = Z(3);   cth = cos(th);
        v  = Z(4);   sth = sin(th);

        % Compute derivatives
        dxdt  = v * cth;
        dydt  = v * sth;
        dthdt = -g/v * cth;        
        dvdt  = -c*rho*s*v^2/(2*m) - g*sth;

        % assign to ouptut respecting either row or columnvector inputs
        dZdt = Z;
        dZdt(:) = [dxdt dydt dthdt dvdt];        

    end

    % Integrate the ODE
    Z0 = [x0 y0 theta0 v0];    
    [t,Z] = ode45(@odefcn, tspan, Z0);



    % Example outputs
    x  = Z(:,1);   th = Z(:,3);
    y  = Z(:,2);   v  = Z(:,4);

    F = figure; hold on
    P = get(F, 'position');    
    set(F, 'position', [P(1:2) 3*P(3) P(4)]);    

    subplot(1,3,1)
    plot(x,y, 'b'), grid on
    xlabel('x [m]'), ylabel('y [m]')

    subplot(1,3,2)
    plot(t,v, 'b'), grid on
    xlabel('t'), ylabel('v [m/s]')

    subplot(1,3,3)
    plot(t,th, 'b'), grid on
    xlabel('t'), ylabel('\theta [rad]')

end
请注意,与精确的解决方案不同,您必须指定开始和结束时间(在变量
tspan
中捕获)。还要注意,我使用了标识
cosθ+sinθ=1
来简化
D

示例输出:


不是专家,但:你确定能找到明确的解决方案吗?@AnderBiguri我不确定是否能找到。不幸的是,我不知道如何使用
odeXX
实现这一点。我只有使用非耦合方程的经验,并且使用
ode23
的方程最多只有两个。所以任何关于这方面的帮助都是非常受欢迎的。那么你想用数字来解决这个问题吗?我的意思是,现在看这个问题,而不是作为一个数学家,我会说你有你的答案:你不能象征性地解决这个问题。在数字上,这是一个不同的问题…@Ortix92如果我可以问的话,这些方程描述了什么?这是本书中的一个问题:(关于ODE的章节,问题7.19)。这些方程式描述了基于初始速度和跳远运动员离开地面的角度的跳远运动员的运动。我一直在努力学习如何使用数值方法来求解耦合方程组。这说明了很多。你能告诉我你为什么用
ode45
而不是
ode23
?这些方程最多是二阶的。@Ortix92
ode45
在许多方面都是一个很好的折衷方案
ode23
通常精度不够,而
ode113
可能相对较慢。这完全取决于你的问题,哪一个是最好的,但是
ode45
通常是一个好的开始。@Ortix92…顺便说一下,这些数字指的是特定解算器的顺序,而不是问题的顺序…所有解算器只处理一阶ODE。你知道,对吧?@Ortix92…你还知道如何将二阶方程简化为一阶方程?