Флаг итерации в Matlab ODE Solvers

Я решаю ODE, как

y''(t) + a y(t) + b = 0

с матлабом ode45 решатель. Он повторяется до тех пор, пока не будет найдено решение, которое удовлетворяет критериям ошибки. Я хочу прочитать предыдущее значение y на каждом этапе для сравнения.

Каков был бы лучший способ сделать это?

Мой основной файл

[t,y] = ode45(@odefnc,tspan,[0 0]',options);

и odefnc является

function dx=odefnc(t,x)

...

if history(end)<13
    dx=[x(2),-a*x(1)-b]'
else
    dx=[x(2),-c*x(1)-d]'
end


if flag==1
   history(end+1)=dx;
end

1 ответ

Вы пытаетесь изменить ODE из функции интеграции, добавляя большие разрывы (if заявления). Это плохая практика и может привести к всевозможным проблемам. Не делай этого. Вместо этого вам нужно позвонить ode45 несколько раз и измените функцию ODE - или параметры, которые вы ей даете. Смотрите мой ответ здесь для более подробной информации и некоторых примеров.

Вы также, кажется, пытаетесь записать "историю" оцененного решения. Вы не можете сделать это. Вы не можете полагаться на порядок вызова вашей функции ODE ode45 или сколько раз он вызывается за шаг по времени (может быть, много раз в случае неудачного шага). То, что вы пытаетесь сделать, просто невозможно ode45 и другие функции ODE Suite. Тем не менее, вполне вероятно, что все, что вы хотите сделать, может быть достигнуто более лучшим, более естественным способом. Или вам может потребоваться реализовать собственную схему интеграции - но это редко требуется.

Если все, что вы пытаетесь сделать, записав значение предыдущего шага, это определить, когда переключаться между параметрами a и параметр cто вам нужен способ точного определения этой точки (ваш if заявления, даже если они работают, не будут точными). Если переключение происходит в определенный момент времени, то это просто: просто выполните два интегрирования за необходимые промежутки времени, как показано на ссылке выше. Если переключение происходит в состоянии, которое зависит от состояния x, тогда вам нужно будет узнать о функциях событий. Вы можете прочитать о них в справке и документации, этой статье на MathWorks, а также в моих ответах на этот вопрос и на этот вопрос.

Другие вопросы по тегам