Проблемы с решателем ode в matlab

Рейтинг: 0Ответов: 2Опубликовано: 12.08.2023

Использую решатель ode45 для системы ОДУ(использовал и другие решатели, проблема не исчезала). В m-файле, где записана функция, используется interp1 для нахождения коэффициентов на каждый шаг решения. В общем, саму систему решить пока не удалось, но проблема в том, что решатель в определённые моменты времени зачем-то делает 2 решения на одном временном шаге, либо вообще откатывается на несколько временных шагов назад и сразу же вперёд.Первый столбец время на шаге решения, отметил когда решатель стоит 2 решения на одном времени и непонятные скачки сначала 91 потом 89, а потом 95

Сам решатель

[t,y] = ode45(@(t,y) Fito(t,y,Massiv(:,3,1),Ice,Massiv(:,18,1),Ligth,Massiv(:,12,1),Massiv(:,11,1),Massiv(:,10,1),Massiv(:,8,1)),...
   tspan, [0.05 0.005]) 

Интерполяция в m-файле функции делаю так.

function dFdt = Fito(t,y,Temp,Ice,W,I0,NH4,NO3,NO2,P)
%% интерполяция значений параметров для каждого шага
    Temp1 = interp1(Temp,t,'pchip');

Если кто-то сталкивался с такой проблемой, буду благодарен советам.

Ответы

▲ 0

Хорошо было бы, если бы вы ещё задачу привели, которую решаете. А то, возможно, сам подход к решению неверный. Зачем вы для функции сделали так много входных аргументов, если в функции используются только два: Temp и t?

▲ 0

Проблема решилась довольно банально. Надо уменьшить максимальный шаг решателя ode. Например, через odeset('MaxStep', размер шага).