Установка условия на выходе MATLAB ode45 (во время работы)

Я решаю систему ОДУ с ode45 для многих различных параметров (эти параметры являются коэффициентами дифференциальных уравнений), и я хочу найти параметры, для которых решение меньше (не больше), чем заданное значение.

Как я могу установить условие на ode45, чтобы «обнаружить» автоматически, если решение (для некоторых из этих параметров) становится больше, чем это (заданное) значение при решении системы и остановить решение для дальнейшие шаги?

Ян предложил поставить следующее условие в определение входной функции, чтобы int. Я пробовал это, но это не работает: после нескольких шагов (и хотя условие еще не верно) итерация вскоре заканчивается, а вывод остается постоянным на каком-то числе. (неправильный вывод)

(qm, U, V и т. д. являются константами, а X имеет 4 столбца)

[T,X]=ode45(@acceleration,tspan,x0);


function xprime=acceleration(T,X)
   size_X=length(X);
    xprime=zeros (4,1);
        if X(size_X,1)>threshold

  xprime(1)=0;
  xprime(2)=0;
  xprime(3)=0;
  xprime(4)=0;

        else

  xprime(1)=X(3);
  xprime(2)=X(4);
  xprime(3)=X(1)*X(4)^2 - 2*qm*(U+V*(cos(w*T)))*F1(num,X(1),X(2));
  xprime(4)= -2*X(3)*X(4)/X(1) - qm*((U+V*(cos(w*T)))/(X(1)))*F2(num,X(1),X(2));

        end
  end
  • В чем проблема с приведенным выше кодом?
  • Кто-то предложил приделать к ode45 функцию мониторинга. (здесь). Кто-нибудь знает как это сделать? Спасибо

person Mostafa    schedule 28.03.2013    source источник


Ответы (2)


Я не вижу встроенных опций в решателях Matlab ODE, которые могут быть (неправильно) использованы для ваших целей.

Но вы можете соответствующим образом изменить правую часть в y' = f(t,y). я могу подумать о

  • IF y > threshold THEN f(t,y) = 0 -- это должно привести к быстрому завершению итерации из-за контроля размера шага в ODE45.
  • Или создание исключения, которое отменяет только текущую итерацию (не знаю, как это сделать;)
person Jan    schedule 28.03.2013
comment
Спасибо за вашу помощь. Я задавал этот вопрос ранее на scicomp.stackexchange, и там кто-то предложил прикрепить функцию мониторинга к ode45. здесь: ссылка. Вы знаете, как это сделать? - person Mostafa; 28.03.2013
comment
Я попробовал ваше предложение (как я написал в вопросе). но это не работает (как указано выше), в чем проблема с этим? - person Mostafa; 30.03.2013
comment
Поведение ожидаемое. Возможно, у вас неправильное условие переключения. Вы хотите проверить 4-й компонент? Попробуйте проверить, делает ли size_X то, что вы хотите... - person Jan; 30.03.2013

Вы решаете набор уравнений или пытаетесь интегрировать их во времени? Без дополнительной информации кажется, что вы должны использовать fsolve или fmincon?

Если вы действительно интегрируетесь, я думаю, вы можете использовать функцию событий, чтобы указать ode45, что вы хотите остановить. Пример с баллодой может быть полезен.

person janh    schedule 29.03.2013