Эта страница содержит два примера решения жестких обыкновенных дифференциальных уравнений с помощью ode15s
. MATLAB ® имеет четыре решателя, предназначенных для жестких ОДУ.
ode15s
ode23s
ode23t
ode23tb
Для большинства жестких задач ode15s
работает лучше всего. Однако ode23s
, ode23t
, и ode23tb
может быть более эффективным, если проблема позволяет допускать грубую ошибку.
Для некоторых задач ОДУ размер шага, взятый решателем, принуждается к необоснованно малому уровню по сравнению с интервалом интегрирования, даже в области, где кривая решения гладкая. Эти размеры шага могут быть настолько маленькими, что для прохождения короткого временного интервала могут потребоваться миллионы оценок. Это может привести к тому, что решатель не справится с интегрированием, но даже если он преуспеет, это займет очень много времени.
Уравнения, которые вызывают такое поведение в решателях ОДУ, считаются жесткими. Проблема, которую ставят жесткие ОДУ, заключается в том, что явные решатели (такие как ode45
) несостоятельно медленны в достижении решения. Вот почему ode45
классифицируется как нежесткий решатель наряду с ode23
и ode113
.
Решатели, которые разработаны для жестких ОДУ, известных как жесткие решатели, обычно выполняют больше работы на шаг. Окупаемость заключается в том, что они способны делать гораздо большие шаги и имеют улучшенную числовую стабильность по сравнению с нежесткими решателями.
Для жестких задач установка матрицы Якобия с помощью odeset
особенно важно. Жесткие решатели используют матрицу Якобиана, чтобы оценить локальное поведение ОДУ по мере начала интегрирования, поэтому предоставление якобиевой матрицы (или, для больших разреженных систем, её шаблона разреженности) очень важно для эффективности и надежности. Используйте Jacobian
, JPattern
, или Vectorized
опции odeset
для указания сведений о якобиане. Если вы не поставляете якобиан, то решатель оценивает его численно, используя конечные различия.
См. odeset
полный список других опций решателя.
Уравнение Ван дер Поля является ОДУ второго порядка
где является скалярным параметром. Когда, полученная система ОДУ является нежесткой и легко решается с помощью ode45
. Однако, если вы увеличиваетесь до 1000, то решение резко меняется и демонстрирует колебания на гораздо более длительной временной шкале. Аппроксимация решения задачи начального значения становится более трудной. Поскольку эта конкретная задача является жесткой, решатель, предназначенный для нежестких задач, таких как ode45
, слишком неэффективно, чтобы быть практичным. Используйте жесткий решатель, такой как ode15s
вместо этого для этой задачи.
Переписать уравнение Ван дер Поля как систему ОДУ первого порядка путем замены. Получившаяся система ОДУ первого порядка
The 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');
The vdpode
функция также решает ту же задачу, но принимает заданное пользователем значение для. Уравнения становятся все более жесткими по мере увеличения.
Классическая брюссельская система уравнений потенциально большая, жесткая и разреженная. Система Брюсселя моделирует диффузию в химической реакции и представлена системой уравнений с включением,,, и.
Файл функции brussode
решает этот набор уравнений на временном интервале [0,10]
с. Начальные условия
где для. Поэтому в системе существуют уравнения, но Якобиан является перемычкой с постоянной шириной 5, если уравнения упорядочены как. По мере увеличения проблема становится все более жесткой, и якобиан становится все более скудным.
Вызов функции brussode(N)
, for, задает значение для N в системе уравнений, соответствующих количеству точек сетки. По умолчанию
brussode
использует.
brussode
содержит несколько подфункций:
Вложенная функция f(t,y)
кодирует систему уравнений для задачи Брюсселатора, возвращая вектор.
Локальная функция jpattern(N)
возвращает разреженную матрицу 1s и 0s, показывающую местоположения ненули в якобиане. Эта матрица присвоена JPattern
поле структуры опций. Решатель ОДУ использует этот шаблон разреженности, чтобы сгенерировать якобиан численно как разреженную матрицу. Предоставление этого шаблона разреженности в задаче значительно сокращает количество вычислений функции, необходимых для генерации 2N-by-2N якобиана, с 2N вычислений до всего 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 % ---------------------------------------------------------------------------
Решите систему Брюсселатора для, запустив функцию brussode
.
brussode
Решить систему для, задав вход для brussode
.
brussode(50)
ode15s
| ode23s
| ode23t
| ode23tb