У меня есть ODE для расчета изменения кислотности. Все работает нормально, только хотелось бы менять константу всякий раз, когда кислотность достигает критической точки. Предполагается, что это какой-то необратимый эффект, который я хочу смоделировать.
Мои константы берутся из файла структуры (c), который я загружаю один раз в функции ODE.
[Time,Results] = ode15s(@(x, c) f1(x, c),[0 c.length],x0,options);
Основная проблема, с которой я столкнулся, заключается не в том, чтобы сказать Matlab изменить константу, а в том, чтобы запомнить, если это уже произошло во время симуляции один раз. поэтому Matlab должен взять необратимо измененную константу, а не ту, которую я указал в начале.
Я хотел бы написать флаг, который сохраняется во время работы ODE, и условие if
«если флаг существует, измените константу». Как это сделать?
ОБНОВЛЕНИЕ I: ПРОБЛЕМА РЕШЕНА
Здесь первое собственное решение, оно не отшлифовано и требует подхода к структурному файлу. Это означает, что константы, которые должны внезапно измениться при событии, должны быть структурными файлами, которые передаются функцией ODE в функцию, которая должна быть оценена (см. выше синтаксис ODE). Функция принимает такие входные данные:
function [OUTPUT] = f1(t, x, c)
% So here, the constants all start with c. followed by the variable name. (because they are structs instead of globals)
%% write a flag when that event happens
if c.someODEevent <= 999 && exist ('flag.txt') == 0
dlmwrite ('flag.txt',1);
end
%% next iteration will either write the flag again or not. more importantly, if it exists, the constant will change because of this.
if exist ('flag.txt') == 2
c.changingconstant = c.changingconstant/2;
end
end
Пожалуйста, ознакомьтесь с любезным ответом Horchler, где вы должны позаботиться о том, чтобы такой шаг мог привести к неточностям, и вы должны быть осторожны, чтобы проверить, делает ли ваш код то, что он должен делать.