Решение жестких ОДУ

Эта страница содержит два примера решения жестких обыкновенных дифференциальных уравнений с помощью ode15s. MATLAB® имеет четыре решателя, разработанные для жестких ОДУ.

  • ode15s

  • ode23s

  • ode23t

  • ode23tb

Для самых жестких проблем ode15s выполняет лучше всего. Однако ode23s, ode23t и ode23tb могут быть более эффективными, если проблема разрешает допуск грубой ошибки.

Что такое Жесткое ОДУ?

Для некоторых проблем ОДУ размер шага, взятый решателем, захлопнут к необоснованно небольшому уровню по сравнению с интервалом интегрирования, даже в области, где кривая решения сглаженна. Эти размеры шага могут быть настолько небольшими, что пересечение кратковременного интервала может потребовать миллионов оценок. Это может привести к решателю, приведя интегрирование к сбою, но даже если это успешно выполнится, то потребуется очень долгое время, чтобы сделать так.

Уравнения, которые вызывают это поведение в решателях ОДУ, как говорят, жестки. Проблема, которая жесткое положение ОДУ - то, что явные решатели (такие как ode45) являются ненадежно медленными в достижении решения. Поэтому ode45 классифицируется как нежесткий решатель наряду с ode23 и ode113.

Решатели, которые разработаны для жестких ОДУ, известных как жесткие решатели, обычно больше работают на шаг. Выплата - то, что они могут сделать намного большие шаги и улучшили числовую устойчивость по сравнению с нежесткими решателями.

Опции решателя

Для жестких проблем, задавая якобиевскую матрицу с помощью odeset особенно важно. Жесткие решатели используют якобиевскую матрицу, чтобы оценить локальное поведение ОДУ, в то время как интегрирование продолжает, таким образом предоставляя якобиевскую матрицу (или, для больших разреженных систем, ее шаблон разреженности) очень важно для эффективности и надежности. Используйте Jacobian, JPattern или опции Vectorized odeset, чтобы указать информацию о якобиане. Если вы не предоставляете якобиан затем, решатель оценивает его численно использующий конечные разности.

Смотрите odeset для полного списка других опций решателя.

Пример: Жесткое уравнение Ван дер Поля

Уравнение Ван дер Поля является ОДУ второго порядка

где скалярный параметр. Когда, получившаяся система ОДУ является нежестким и легко решенным использованием ode45. Однако, если вы увеличиваетесь до 1 000, затем решение изменяется существенно и показывает колебание на намного более длительном масштабе времени. Приближение решения задачи с начальными значениями становится более трудным. Поскольку эта конкретная проблема жестка, решатель, предназначенный для нежестких проблем, такова как ode45, слишком неэффективно, чтобы быть практичным. Используйте жесткий решатель, такой как ode15s для этой проблемы вместо этого.

Перепишите уравнение Ван дер Поля как систему ОДУ первого порядка путем создания замены. Получившаяся система ОДУ первого порядка

Функция vdp1000 оценивает использование уравнения Ван дер Поля.

function dydt = vdp1000(t,y)
%VDP1000  Evaluate the van der Pol ODEs for mu = 1000.
%
%   See also ODE15S, ODE23S, ODE23T, ODE23TB.

%   Jacek Kierzenka and Lawrence F. Shampine
%   Copyright 1984-2014 The MathWorks, Inc.

dydt = [y(2); 1000*(1-y(1)^2)*y(2)-y(1)];

Используйте функцию ode15s, чтобы решить проблему с вектором начальных условий [2; 0] по временному интервалу [0 3000]. Для масштабирования причин постройте только первый компонент решения.

[t,y] = ode15s(@vdp1000,[0 3000],[2; 0]);
plot(t,y(:,1),'-o');
title('Solution of van der Pol Equation, \mu = 1000');
xlabel('Time t');
ylabel('Solution y_1');

Функция vdpode также решает ту же проблему, но это принимает пользовательское заданное значение для. Уравнения становятся все больше жесткими как увеличения.

Пример: Разреженная система Brusselator

Классическая система уравнений Brusselator является потенциально большой, жесткой, и разреженной. Диффузия системных моделей Brusselator в химической реакции, и представлена включением системы уравнений, и.

Файл функции brussode решает эту систему уравнений на временном интервале [0,10] с. Начальные условия

где для. Поэтому в системе существуют уравнения, но якобиан является ленточной матрицей с постоянной шириной 5, если уравнения упорядочены как. Как увеличения, проблема становится все больше жесткой, и якобиан становится все больше разреженным.

Вызов функции brussode(N), поскольку, задает значение для N в системе уравнений, соответствуя количеству узлов решетки. По умолчанию, использование brussode.

brussode содержит несколько подфункций:

  • Вложенная функция f(t,y) кодирует систему уравнений для проблемы Brusselator, возвращая вектор.

  • Локальная функция jpattern(N) возвращает разреженную матрицу 1 с и 0s, показывающего местоположения ненулей в якобиане. Эта матрица присвоена полю JPattern структуры опций. Решатель ОДУ использует этот шаблон разреженности, чтобы сгенерировать якобиан численно как разреженную матрицу. Предоставление этого шаблона разреженности в проблеме значительно сокращает количество функциональных оценок, требуемых сгенерировать 2N-by-2N якобиан от оценок на 2 Н всего до 4.

function brussode(N)
%BRUSSODE  Stiff problem modelling a chemical reaction (the Brusselator).
%   The parameter N >= 2 is used to specify the number of grid points; the
%   resulting system consists of 2N equations. By default, N is 20.  The
%   problem becomes increasingly stiff and increasingly sparse as N is
%   increased.  The Jacobian for this problem is a sparse constant matrix
%   (banded with bandwidth 5).
%
%   The property 'JPattern' is used to provide the solver with a sparse
%   matrix of 1's and 0's showing the locations of nonzeros in the Jacobian
%   df/dy.  By default, the stiff solvers of the ODE Suite generate Jacobians
%   numerically as full matrices.  However, when a sparsity pattern is
%   provided, the solver uses it to generate the Jacobian numerically as a
%   sparse matrix.  Providing a sparsity pattern can significantly reduce the
%   number of function evaluations required to generate the Jacobian and can
%   accelerate integration.  For the BRUSSODE problem, only 4 evaluations of
%   the function are needed to compute the 2N x 2N Jacobian matrix.
%
%   Setting the 'Vectorized' property indicates the function f is
%   vectorized.
%
%   E. Hairer and G. Wanner, Solving Ordinary Differential Equations II,
%   Stiff and Differential-Algebraic Problems, Springer-Verlag, Berlin,
%   1991, pp. 5-8.
%
%   See also ODE15S, ODE23S, ODE23T, ODE23TB, ODESET, FUNCTION_HANDLE.

%   Mark W. Reichelt and Lawrence F. Shampine, 8-30-94
%   Copyright 1984-2014 The MathWorks, Inc.

% Problem parameter, shared with the nested function.
if nargin<1
   N = 20;
end

tspan = [0; 10];
y0 = [1+sin((2*pi/(N+1))*(1:N)); repmat(3,1,N)];

options = odeset('Vectorized','on','JPattern',jpattern(N));

[t,y] = ode15s(@f,tspan,y0,options);

u = y(:,1:2:end);
x = (1:N)/(N+1);
figure;
surf(x,t,u);
view(-40,30);
xlabel('space');
ylabel('time');
zlabel('solution u');
title(['The Brusselator for N = ' num2str(N)]);

% -------------------------------------------------------------------------
% Nested function -- N is provided by the outer function.
%

   function dydt = f(t,y)
      % Derivative function
      c = 0.02 * (N+1)^2;
      dydt = zeros(2*N,size(y,2));      % preallocate dy/dt
      
      % Evaluate the 2 components of the function at one edge of the grid
      % (with edge conditions).
      i = 1;
      dydt(i,:) = 1 + y(i+1,:).*y(i,:).^2 - 4*y(i,:) + c*(1-2*y(i,:)+y(i+2,:));
      dydt(i+1,:) = 3*y(i,:) - y(i+1,:).*y(i,:).^2 + c*(3-2*y(i+1,:)+y(i+3,:));
      
      % Evaluate the 2 components of the function at all interior grid points.
      i = 3:2:2*N-3;
      dydt(i,:) = 1 + y(i+1,:).*y(i,:).^2 - 4*y(i,:) + ...
         c*(y(i-2,:)-2*y(i,:)+y(i+2,:));
      dydt(i+1,:) = 3*y(i,:) - y(i+1,:).*y(i,:).^2 + ...
         c*(y(i-1,:)-2*y(i+1,:)+y(i+3,:));
      
      % Evaluate the 2 components of the function at the other edge of the grid
      % (with edge conditions).
      i = 2*N-1;
      dydt(i,:) = 1 + y(i+1,:).*y(i,:).^2 - 4*y(i,:) + c*(y(i-2,:)-2*y(i,:)+1);
      dydt(i+1,:) = 3*y(i,:) - y(i+1,:).*y(i,:).^2 + c*(y(i-1,:)-2*y(i+1,:)+3);
   end
% -------------------------------------------------------------------------

end  % brussode

% ---------------------------------------------------------------------------
% Subfunction -- the sparsity pattern
%

function S = jpattern(N)
% Jacobian sparsity pattern
B = ones(2*N,5);
B(2:2:2*N,2) = zeros(N,1);
B(1:2:2*N-1,4) = zeros(N,1);
S = spdiags(B,-2:2,2*N,2*N);
end
% ---------------------------------------------------------------------------

Решите систему Brusselator для путем выполнения функционального brussode.

brussode

Решите систему для путем определения входа к brussode.

brussode(50)

Смотрите также

| | |

Похожие темы