Дифференциальное уравнение второго порядка с ode45 в Matlab

Поэтому мне нужно решить x '' (t) = -x (t) ^ p с начальными условиями x (0) = 0 и v (0) = x '(0) = v_o = 1. Значение параметра p равно 1.

Вот что у меня есть:

function [t, velocity, x] = ode_oscilation(p)

y=[0;0;0];
    % transform system to the canonical form

    function y = oscilation_equation(x,p)
        y=zeros(2,1);
        y(1)=y(2);
        y(2)=-(x)^p;
        %  to make matlab happy we need to return a column vector
        % so we transpose (note the dot in .')
        y=y.'; 
    end

    tspan=[0, 30]; % time interval of interest

    [t,velocity,x] = ode45(@oscilation_equation, tspan, 1); 

    t = y(:,1);
    xposition=y(:,3);
    velocity=y(:,2); 

end 

и это сообщение об ошибке, которое я получаю:

ode_oscillation (1) Ошибка при использовании аргументов odearguments (строка 91) ODE_OSCILLATION / OSCILATION_EQUATION должен возвращать вектор-столбец.

Ошибка в ode45 (строка 114) [neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

Ошибка в ode_oscillation (строка 17) [t, скорость, x] = ode45 (@oscilation_equation, tspan, 1);


person Erica    schedule 05.11.2012    source источник


Ответы (1)


Здесь кое-что идет не так. Во-первых, от help ode45:

ode45 Решение нежестких дифференциальных уравнений методом среднего порядка.

[TOUT,YOUT] = ode45(ODEFUN,TSPAN,Y0) with TSPAN = [T0 TFINAL] integrates 
the system of differential equations y' = f(t,y) from time T0 to TFINAL 
with initial conditions Y0. 

Обратите внимание, что ode45 ожидает функцию f(t,y), где size(t) == [1 1] для времени и size(y) == [1 N] или [N 1] для значений решения. Ваш oscilation_equation имеет инвертированный порядок входных аргументов, и вы вводите постоянный параметр p вместо времени t.

Кроме того, начальные условия Y0 должны иметь тот же размер, что и y; итак size(y0) == [N 1] или [1 N]. У вас просто 1, что явно вызывает ошибки.

Кроме того, ваши выходные аргументы t, xposition и velocity будут полностью проигнорированы и ошибочны, поскольку y не задан как выходной аргумент из ode45, и, самое главное, их имена не соответствуют выходным аргументам ode_oscilation. Кроме того, их порядок извлечения из столбцов y неверен.

Итак, вкратце, измените все на это:

function [t, v, x] = ode_oscilation(p)

    % initial values
    y0 = [0 1];           

    % time interval of interest
    tspan =[0 30]; 

    % solve system 
    [t,y] = ode45(@(t,y) [y(2); -y(1)^p], tspan, y0);

    % and return values of interest
    x = y(:,1);
    v = y(:,2);

end
person Rody Oldenhuis    schedule 05.11.2012