В этом разделе показано, как ограничить решение ОДУ неотрицательным. Навязывание неотрицательности не всегда тривиально, но иногда это необходимо из-за физической интерпретации уравнений или из-за природы решения. Это ограничение следует накладывать только на решение, когда это необходимо, например, в тех случаях, когда интеграция завершается неуспешно или когда решение неприменимо.
Если определенные компоненты решения должны быть неотрицательными, используйте odeset для установки NonNegative для индексов этих компонентов. Этот параметр недоступен для ode23s, ode15iили для неявных решателей (ode15s, ode23t, ode23tb) применяется к проблемам с массовой матрицей. В частности, нельзя накладывать ограничения неотрицательности на проблему дисковой полки, которая обязательно имеет матрицу массы в единственном числе.
Рассмотрим проблему с начальным значением
решается на интервале с начальным условием = 1. Раствор этого ОДУ распадается до нуля. Если решатель выдает отрицательное значение решения, то он начинает отслеживать решение ОДУ через это значение, и вычисление в конечном итоге терпит неудачу, так как вычисленное решение расходится - ∞. Использование NonNegative предотвращает этот сбой интеграции.
Сравните аналитический раствор e-t с раствором ОДУ с помощьюode45 без дополнительных опций и до одного с NonNegative набор опций.
ode = @(t,y) -abs(y); % Standard solution with |ode45| options1 = odeset('Refine',1); [t0,y0] = ode45(ode,[0 40],1,options1); % Solution with nonnegative constraint options2 = odeset(options1,'NonNegative',1); [t1,y1] = ode45(ode,[0 40],1,options2); % Analytic solution t = linspace(0,40,1000); y = exp(-t);
Постройте график трех решений для сравнения. Навязывание неотрицательности имеет решающее значение, чтобы удержать решение от отхода к ∞.
plot(t,y,'b-',t0,y0,'ro',t1,y1,'k*'); legend('Exact solution','No constraints','Nonnegativity', ... 'Location','SouthWest')

Другим примером проблемы, требующей неотрицательного решения, является проблема с коленом, закодированная в файле примера. kneeode. Уравнение:
y-y2,
решается на интервале с начальным условием = 1. Параметр ϵ обычно принимается для 0<ϵ≪1, и эта проблема ϵ=1×10-6. Решение этой ОДУ = 1-x для x < и y 0 для x > 1. Однако вычисление численного решения с допусками по умолчанию показывает, что решение следует за изоклинией y = 1-x для всего интервала интегрирования. Наложение ограничений неотрицательности приводит к правильному решению.
Решите проблему коленного сустава с ограничениями, связанными с неотрицательностью, и без них.
epsilon = 1e-6; y0 = 1; xspan = [0 2]; odefcn = @(x,y,epsilon) ((1-x)*y - y^2)/epsilon; % Solve without imposing constraints [x1,y1] = ode15s(@(x,y) odefcn(x,y,epsilon), xspan, y0); % Impose a nonnegativity constraint options = odeset('NonNegative',1); [x2,y2] = ode15s(@(x,y) odefcn(x,y,epsilon), xspan, y0, options);
Постройте график решений для сравнения.
plot(x1,y1,'ro',x2,y2,'b*') axis([0,2,-1,1]) title('The "knee problem"') legend('No constraints','Non-negativity') xlabel('x') ylabel('y')

[1] Шампин, Л. Ф., С. Томпсон, Дж. А. Кирзенка и Г. Д. Бирн, «Неотрицательные решения ОДУ», Прикладная математика и вычисления том 170, 2005, стр. 556-569.