Функция события Matlab не останавливает интеграцию - PullRequest
0 голосов
/ 17 октября 2018

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

Но иногда решатель не останавливается, даже если критерийДостигнут.Например, если вы решите следующую систему с помощью x0 = 10, решатель остановится до 2000 года, но с x0 = 0.0001 не будет.

Функция события (eventfun_t.m)

function [x,isterm,dir] = eventfun_t(t,y)
    dy = test_systeme(t,y);
    x = norm(dy) - 1e-3;

    isterm = 1;
    dir = 0;  %or -1, doesn't matter
end

Система (test_systeme.m)

function dx = test_systeme(t,x)
    v = x./(x+1);
    dx = -v;
end

Решить систему

x0 = 10;
eventfonction = @(t,y) eventfun_t(t,y);
optionsode=odeset('Events',eventfonction);
[t x]=ode15s(@(t,x) test_systeme(t,x),[0 2000],x0,optionsode);

Я полагаю, это потому, что с x0 = 0.0001 norm(dy) уже ниже, чем 1e-3, но вВ таком случае, как я могу остановить решатель без проверки самостоятельно?

1 Ответ

0 голосов
/ 07 марта 2019

Функция событий проверяет изменения знака в значении.Таким образом, если значение (t = 0) <0 и значение (0 <t <t_end) <0, то оно никогда не сработает. </p>

Способ, который я нашел, - использовать условные операторы:

value = 1;
if norm(dy)<1e-3&&t~=0
   value = -1;
end

Оператор t ~ = 0 позволяет значению менять знак после первого шага, если он уже меньше, чем theshold.

...