MatLab ODE45 求解中的重复方程

Duplicate Equation in MatLab ODE45 Solve

我正在尝试编写一个 MatLab 代码,它可以扩展要求解的 ODE 的数量。这是我目前拥有的代码,为简单起见,我从 spring 质量阻尼器系统开始。

    clear;clc;close all;
    tspan=[0:0.01:1];
    x0=[1;0;-1;0;7;0;-7;0;5;0;-5;0;10;0;-10;0];
    [t,x] = ode45(@Spring_Mass_Damper,tspan,x0);
    figure(1)
    plot(t,x(:,1));
    hold on
    plot(t,x(:,3));
    hold on
    plot(t,x(:,5));
    hold on
    plot(t,x(:,7));
    hold on
    plot(t,x(:,9));
    hold on
    plot(t,x(:,11));
    hold on
    plot(t,x(:,13));
    hold on
    plot(t,x(:,15));
    grid on
    xlabel('Time')
    ylabel('Displacement(x)')
    title('Displacement Vs Time')

function xp = Spring_Mass_Damper(t,x)
c1=10;
G=9.81;
m1=1;
k1=2000;


xp=[[x(2)];(-(c1/m1).*[x(2)]-(k1/m1).*[x(1)])-(G.*m1);
    [x(4)];(-(c1/m1).*[x(4)]-(k1/m1).*[x(3)])-(G.*m1);
    [x(6)];(-(c1/m1).*[x(6)]-(k1/m1).*[x(5)])-(G.*m1);
    [x(8)];(-(c1/m1).*[x(8)]-(k1/m1).*[x(7)])-(G.*m1);
    [x(10)];(-(c1/m1).*[x(10)]-(k1/m1).*[x(9)])-(G.*m1);
    [x(12)];(-(c1/m1).*[x(12)]-(k1/m1).*[x(11)])-(G.*m1);
    [x(14)];(-(c1/m1).*[x(14)]-(k1/m1).*[x(13)])-(G.*m1);
    [x(16)];(-(c1/m1).*[x(16)]-(k1/m1).*[x(15)])-(G.*m1)];
end

我对这部分代码的主要问题:

xp=[[x(2)];(-(c1/m1).*[x(2)]-(k1/m1).*[x(1)])-(G.*m1);
    [x(4)];(-(c1/m1).*[x(4)]-(k1/m1).*[x(3)])-(G.*m1);
    [x(6)];(-(c1/m1).*[x(6)]-(k1/m1).*[x(5)])-(G.*m1);
    [x(8)];(-(c1/m1).*[x(8)]-(k1/m1).*[x(7)])-(G.*m1);
    [x(10)];(-(c1/m1).*[x(10)]-(k1/m1).*[x(9)])-(G.*m1);
    [x(12)];(-(c1/m1).*[x(12)]-(k1/m1).*[x(11)])-(G.*m1);
    [x(14)];(-(c1/m1).*[x(14)]-(k1/m1).*[x(13)])-(G.*m1);
    [x(16)];(-(c1/m1).*[x(16)]-(k1/m1).*[x(15)])-(G.*m1)];

有没有一种简单的方法可以实现相同数量的系统 (ODE),而无需复制和粘贴块中的第一个方程并手动更改 x 索引?

如果x长度是偶数,那么下面的代码可以替代xp

xp = zeros(length(x), 1);
xp(1:2:end-1) = x(2:2:end);
xp(2:2:end) = -(c1/m1).*(x(2:2:end))-(k1/m1).*(x(1:2:end-1))-G.*m1;

这也应该有效:

xp = zeros(size(x,1),1)
for idx=1:size(x,1)
    if mod(idx,2) == 0
        xp(idx) = (-(c1/m1).*[x(idx)]-(k1/m1).*[x(idx-1)])-(G.*m1);
    else
        xp(idx) = x(idx);
    end
end

绘图例程可以用类似的方式简化,如下所示:

figure(1)
hold on
for idx=1:2:size(x,2)
    plot(t,x(:,idx));
end
grid on
xlabel('Time')
ylabel('Displacement(x)')
title('Displacement Vs Time')