Условия запуска/остановки MatLab ODE

У меня есть небольшая проблема. У меня есть 2 уравнения движения «ph» и «ph2». Я не знаю, как настроить ODE, чтобы прекратить вычисление «ph», когда x (1)> 0,111, а затем снова начинает вычислять «ph2» только до 0,111, после этого график «ph» + «ph2» на один график зависит от времени «w», я думаю, что мне нужно установить некоторые ограничения по времени, но не знаю, как это сделать. Я использую ПОМОЩЬ, но никакой пользы для меня.

[t,y] = ode45(@ph,[0,w_max],[0,0]);

function dx = ph(tt,x)
global F1 c m_c Ff p w s ln f_t sig dstr Ren pn Fex Fzmax xz xn l Fz mn
Fpp = F1 + c*x(1);

if pn<0
 pn=abs(pn);
end

if x(1)<ln

    pn=spline(w,p,tt)-((2*sig)/dstr*Ren);    
    Fex=3.1416.*f_t.*pn.*(ln-x(1));
end

if x(1)<42e-5
     Fz = Fzmax*(1-(1/xz)*(x(1)+l));   
end

if x(1)>44e-3
    m_c=m_c-mn;
end
dx=[x(2);((spline(w,p,tt)*s)-Fpp-Ff-Fex-Fz)./m_c];


[t2,y2] = ode45(@ph2,[0,w_max],[0,0]);

function dx=ph2(tt,x)

    global Fv m_c g f alfa Fzp c m_nbp

    Ft=m_c*g*f;
    Fv = 2*f*(Fzp/cos(alfa));

    if x(1)>0.44

    m_c=m_c+m_nbp

    end

    dx = [x(2);((x(1)*c)-Ft-Fv)/m_c];

person user2401142    schedule 27.05.2013    source источник
comment
Вы имеете в виду, что действительно хотите построить кусочную функцию в качестве ОДУ?   -  person wakjah    schedule 27.05.2013
comment
Я не знаю лучшего решения :о/   -  person user2401142    schedule 27.05.2013


Ответы (1)


Чтобы прекратить вычисление ph при x(1) > 0.111, вы можете использовать свойство местоположения события (страница руководства и пример о том, как его использовать). На практике это функция, оцениваемая на каждом временном шаге, и если возвращаемое значение равно 0, то ode45 останавливает интеграцию.

Добавьте функцию

function [value,isterminal,direction] = events(t,y)
% Locate the time when y passes through 0.111 in all 
% directions and stop integration.
value = y(1) - 0.111;  % Detect y=0.111
isterminal = 1;        % Stop the integration
direction = 0;         % All direction

И установите его на options = odeset('Events',@events) перед вызовом

[t,y] = ode45(@ph,[0,w_max],[0,0],options);

Но учитывая, что ph выводит dx=[x(2); ...], для проверки x(1) вам нужно вывести еще и эту переменную - что-то вроде dx=[x(1); x(2);...]

Надеюсь это поможет.

person Michele    schedule 27.05.2013
comment
Это может помочь взглянуть на демонстрацию ballode, включенную в Matlab. Введите edit ballode в командном окне, чтобы увидеть код. Обратите внимание, как в этом примере они заполняют последующие итерации информацией из предыдущей, что может значительно повысить эффективность: options = odeset(options,'InitialStep',t(nt)-t(nt-refine),'MaxStep',t(nt)-t(1));. - person horchler; 27.05.2013
comment
Кроме того, использование глобальных переменных не является хорошей идеей. Вы должны передавать свои параметры, используя анонимные функции. См. мой ответ на этот вопрос для примеров. о том, как передавать параметры вашим функциям интеграции и функциям обработки событий с помощью ode45. - person horchler; 27.05.2013
comment
Большое спасибо, ребята. Отлично сделано! Мне нужно работать, после этого я могу отладить и оптимизировать это. - person user2401142; 28.05.2013