Решение ОДУ с сильно зависящими от состояния Большими матрицами

Этот пример показывает, как решить уравнение Бургерса с помощью метода движущейся сетки [1]. Задача включает большую матрицу, и опции заданы, чтобы принять во внимание сильную зависимость состояния и разреженность большой матрицы, что делает процесс решения более эффективным.

Setup задачи

Уравнение Бургера является конвекционно-диффузионным уравнением, заданным УЧП

ut=ϵ2ux2-x(u22),0<x<1,t>0,ϵ=1×10-4.

Применение преобразования координат (Eq. 18 в [1]) приводит к дополнительному термину с левой стороны:

ut-uxxt=ϵ2ux2-x(u22).

Преобразование PDE в ОДУ одной переменной достигается с помощью конечных различий, чтобы аппроксимировать частные производные, взятые относительно x. Если конечные различия записаны как Δ, тогда УЧП может быть переписана как ОДУ, которая содержит только производные, взятые относительно t:

dudt-Δudxdt=ϵΔ2u-Δ(u22).

В этой форме можно использовать решатель ОДУ, такой как ode15s для решения u и x со временем.

В данном примере задача сформулирована на движущемся mesh из N точки и метод подвижной сетки, описанный в [1], позиционирует mesh на каждом временном шаге так, что они концентрируются в областях изменения. Контур и начальные условия

u(0,t)=u(1,t)=0,u(x,0)=sin(2πx)+12sin(πx).

Для заданного начального mesh N точки, есть 2N уравнения для решения: N уравнения, соответствующие уравнению Бургерса, и N уравнения, определяющие движение каждой точки сетки. Итак, конечная система уравнений:

du1dt-Δu1dx1dt=ϵΔ2u1-Δ(u122),duNdt-ΔuNdxNdt=ϵΔ2uN-Δ(uN22),d2x1˙dt2=1τddt(B(x1,t)dx1dt),d2xN˙dt2=1τddt(B(xN,t)dxNdt).

Условия для движущегося mesh соответствуют MMPDE6 в [1]. Параметр τ представляет собой шкалу времени для принуждения mesh к равнораспределению. Термин B(x,t) - функция монитора, заданная Eq. 21 в [1]:

B(x,t)=1+(duidxi)2.

Подход, используемый в этом примере для решения уравнения Бургерса с движущимися сетчатый точек, демонстрирует несколько методов:

  • Система уравнений выражена с помощью большой матрицы, My=f(t,y). Большая матрица предоставляется в ode15s решатель как функция.

  • Производная функция не только включает уравнения для уравнения Бургерса, но и набор уравнений, регулирующих выбор движущейся сетки.

  • Разреженные шаблоны якобиан dF/dy и производная большой матрицы, умноженная на вектор d(Mv)/dy передаются в решатель как функции. Подача этих шаблонов разреженности помогает решателю работать более эффективно.

  • Конечные различия используются для аппроксимации нескольких частных производных.

Чтобы решить это уравнение в MATLAB ®, запишите производную функцию, большую матрицу, функцию для шаблона разреженности якобианаdF/dy, и функцию для шаблона разреженности d(Mv)/dy. Можно либо включить необходимые функции в качестве локальных функций в конец файла (как это сделано здесь), либо сохранить их как отдельные именованные файлы в директории по пути MATLAB.

Кодовая Большая матрица

Левая сторона системы уравнений включает линейные комбинации первых производных, поэтому для представления всех членов требуется большая матрица. Установите левую сторону системы уравнений равной My для извлечения формы большой матрицы. Большая матрица состоит из четырех блоков, каждый из которых является квадратной матрицей порядка N:

[u1t-u1x1x1tuNt-uNxNxNt2x1˙t22xN˙t2]=My=[M1M2M3M4][u1˙uN˙x1˙xN˙].

Эта формулировка показывает, что M1 и M2 сформировать левую сторону уравнений Бургерса (первая N уравнения в системе), в то время как M3 и M4 сформировать левую сторону сетки уравнений (последняя N уравнения в системе). Матрицы блоков:

M1=IN,M2=-uixiIN,M3=0N,M4=2t2IN.

IN является N×N единичная матрица. Частные производные в M2 оцениваются с использованием конечных различий, в то время как частная производная в M4 использует матрицу Лапласа. Заметьте, что M3 содержит только нули, потому что ни одно из уравнений для движения сетки не зависит от u˙.

Теперь можно записать функцию, которая вычисляет большую матрицу. Функция должна принять два входов для времени t и вектор решения y. Поскольку вектор решения y содержит половину u˙ компоненты и половина x˙ компоненты, функция извлекает их первыми. Затем функция формирует все блочные матрицы (принимая во внимание краевые значения задачи) и собирает большую матрицу, используя четыре блока.

function M = mass(t,y)
% Extract the components of y for the solution u and mesh x
N = length(y)/2; 
u = y(1:N);
x = y(N+1:end);

% Boundary values of solution u and mesh x
u0 = 0;
uNP1 = 0;
x0 = 0;
xNP1 = 1;

% M1 and M2 are the portions of the mass matrix for Burgers' equation. 
% The derivative du/dx is approximated with finite differences, using 
% single-sided differences on the edges and centered differences in between.
M1 = speye(N);
M2 = sparse(N,N);
M2(1,1) = - (u(2) - u0)/(x(2) - x0);
for i = 2:N-1
    M2(i,i) = - (u(i+1) - u(i-1))/(x(i+1) - x(i-1));
end
M2(N,N) = - (uNP1 - u(N-1))/(xNP1 - x(N-1));

% M3 and M4 define the equations for mesh point evolution, corresponding to 
% MMPDE6 in the reference paper. Since the mesh functions only involve d/dt(dx/dt), 
% the M3 portion of the mass matrix is all zeros. The second derivative in M4 is 
% approximated using a finite difference Laplacian matrix. 
M3 = sparse(N,N);
e = ones(N,1);
M4 = spdiags([e -2*e e],-1:1,N,N);

% Assemble mass matrix
M = [M1 M2
     M3 M4];
end

Примечание.Все функции включены в качестве локальных функций в конце примера.

Производная по коду функция

Производная функция для этой задачи возвращает вектор с 2N элементы. Первое N элементы соответствуют уравнениям Бургерса, в то время как последние N элементы предназначены для движущихся сетчатых уравнений. Функция movingMeshODE проходит через эти шаги, чтобы вычислить правые стороны всех уравнений в системе:

  1. Оцените уравнения Бургерса, используя конечные различия (сначала N элементы).

  2. Оцените функцию монитора (последняя N элементы).

  3. Применить пространственное сглаживание для мониторинга функции и вычисления движущихся сетчатых уравнений.

Первое N уравнения в производной функции кодируют правую сторону уравнений Бургерса. Уравнения Бургера могут быть рассмотрены как дифференциальный оператор, включающий пространственные производные вида:

f(u)=ϵ2ux2-x(u22).

В ссылку статье [1] описывается процесс аппроксимации дифференциального оператора f использование центрированных конечных различий

fi=ϵ[(ui+1-uixi+1-xi)-(ui-ui-1xi-xi-1)12(xi+1-xi-1)]-12(ui+12-ui-12xi+1-xi-1).

По краям mesh (для которой i=1 и i=N), вместо этого используются только односторонние различия. Этот пример использует ϵ=1×10-4.

Уравнения, управляющие mesh (содержащие последнюю N уравнения в производной функции) являются

2x˙t2=1τt(B(x,t)xt).

Так же, как и с уравнениями Бургерса, можно использовать конечные различия для аппроксимации функции монитора B(x,t):

B(x,t)=1+(uixi)2=1+(ui+1-ui-1xi+1-xi-1)2.

После оценки функции монитора применяется пространственное сглаживание (уравнения 14 и 15 в [1]). Этот пример использует γ=2 и p=2 для пространственных параметров сглаживания.

Функция, кодирующая систему уравнений,

function g = movingMeshODE(t,y)
% Extract the components of y for the solution u and mesh x
N = length(y)/2;
u = y(1:N);
x = y(N+1:end);

% Boundary values of solution u and mesh x
u0 = 0;
uNP1 = 0;
x0 = 0;
xNP1 = 1;

% Preallocate g vector of derivative values.
g = zeros(2*N,1);

% Use centered finite differences to approximate the RHS of Burgers'
% equations (with single-sided differences on the edges). The first N
% elements in g correspond to Burgers' equations.
for i = 2:N-1
    delx = x(i+1) - x(i-1);
    g(i) = 1e-4*((u(i+1) - u(i))/(x(i+1) - x(i)) - ...
        (u(i) - u(i-1))/(x(i) - x(i-1)))/(0.5*delx) ...
        - 0.5*(u(i+1)^2 - u(i-1)^2)/delx;
end
delx = x(2) - x0;
g(1) = 1e-4*((u(2) - u(1))/(x(2) - x(1)) - (u(1) - u0)/(x(1) - x0))/(0.5*delx) ...
    - 0.5*(u(2)^2 - u0^2)/delx;
delx = xNP1 - x(N-1);
g(N) = 1e-4*((uNP1 - u(N))/(xNP1 - x(N)) - ...
    (u(N) - u(N-1))/(x(N) - x(N-1)))/delx - ...
    0.5*(uNP1^2 - u(N-1)^2)/delx;

% Evaluate the monitor function values (Eq. 21 in reference paper), used in
% RHS of mesh equations. Centered finite differences are used for interior
% points, and single-sided differences are used on the edges.
M = zeros(N,1);
for i = 2:N-1
    M(i) = sqrt(1 + ((u(i+1) - u(i-1))/(x(i+1) - x(i-1)))^2);
end
M0 = sqrt(1 + ((u(1) - u0)/(x(1) - x0))^2);
M(1) = sqrt(1 + ((u(2) - u0)/(x(2) - x0))^2);
M(N) = sqrt(1 + ((uNP1 - u(N-1))/(xNP1 - x(N-1)))^2);
MNP1 = sqrt(1 + ((uNP1 - u(N))/(xNP1 - x(N)))^2);

% Apply spatial smoothing (Eqns. 14 and 15) with gamma = 2, p = 2.
SM = zeros(N,1);
for i = 3:N-2
    SM(i) = sqrt((4*M(i-2)^2 + 6*M(i-1)^2 + 9*M(i)^2 + ...
        6*M(i+1)^2 + 4*M(i+2)^2)/29);
end
SM0 = sqrt((9*M0^2 + 6*M(1)^2 + 4*M(2)^2)/19);
SM(1) = sqrt((6*M0^2 + 9*M(1)^2 + 6*M(2)^2 + 4*M(3)^2)/25);
SM(2) = sqrt((4*M0^2 + 6*M(1)^2 + 9*M(2)^2 + 6*M(3)^2 + 4*M(4)^2)/29);
SM(N-1) = sqrt((4*M(N-3)^2 + 6*M(N-2)^2 + 9*M(N-1)^2 + 6*M(N)^2 + 4*MNP1^2)/29);
SM(N) = sqrt((4*M(N-2)^2 + 6*M(N-1)^2 + 9*M(N)^2 + 6*MNP1^2)/25);
SMNP1 = sqrt((4*M(N-1)^2 + 6*M(N)^2 + 9*MNP1^2)/19);
for i = 2:N-1
    g(i+N) = (SM(i+1) + SM(i))*(x(i+1) - x(i)) - ...
        (SM(i) + SM(i-1))*(x(i) - x(i-1));
end
g(1+N) = (SM(2) + SM(1))*(x(2) - x(1)) - (SM(1) + SM0)*(x(1) - x0);
g(N+N) = (SMNP1 + SM(N))*(xNP1 - x(N)) - (SM(N) + SM(N-1))*(x(N) - x(N-1));

% Form final discrete approximation for Eq. 12 in reference paper, the equation governing
% the mesh points.
tau = 1e-3;
g(1+N:end) = - g(1+N:end)/(2*tau);
end

Функции кода для шаблонов разреженности

Якобиан dF/dy для производной функции является a 2N×2N матрица, содержащая все частные производные производной функции, movingMeshODE. ode15s оценивает якобиан, используя конечные различия, когда матрица не задана в структуре опций. Вы можете предоставить разреженный шаблон якобиана, чтобы помочь ode15s вычислите его быстрее.

Функция для разреженного шаблона якобиана

function out = JPat(N)
S1 = spdiags(ones(N,3),-1:1,N,N);
S2 = spdiags(ones(N,9),-4:4,N,N);
out = [S1 S1
       S2 S2];
end

Постройте график шаблона разреженности dF/dy для N=80 использование spy.

spy(JPat(80))

Figure contains an axes. The axes contains an object of type line.

Другой способ сделать вычисление более эффективным - предоставить шаблон разреженности d(Mv)/dy. Вы можете найти этот шаблон разреженности, исследуя, какие условия ui и xi присутствуют в конечных различиях, вычисленных в функции большой матрицы.

Функция для шаблона разреженности d(Mv)/dy является

function S = MvPat(N)
S = sparse(2*N,2*N);
S(1,2) = 1;
S(1,2+N) = 1;
for i = 2:N-1
    S(i,i-1) = 1;
    S(i,i+1) = 1;
    S(i,i-1+N) = 1;
    S(i,i+1+N) = 1;
end
S(N,N-1) = 1;
S(N,N-1+N) = 1;
end

Постройте график шаблона разреженности d(Mv)/dy для N=80 использование spy.

spy(MvPat(80))

Figure contains an axes. The axes contains an object of type line.

Решающая система уравнений

Решить систему со значением N=80. Для начальных условий инициализируйте x с однородной сеткой и оценить u(x,0) на сетке.

N = 80;
h = 1/(N+1);
xinit = h*(1:N);
uinit = sin(2*pi*xinit) + 0.5*sin(pi*xinit);
y0 = [uinit xinit];

Использование odeset чтобы создать структуру опций, которая устанавливает несколько значений:

  • Указатель на функцию для большой матрицы

  • Зависимость состояния большой матрицы, которая для этой задачи 'strong' поскольку большая матрица является функцией обеих t и y

  • Указатель на функцию, который вычисляет якобианский шаблон разреженности

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

  • Абсолютные и относительные допуски

opts = odeset('Mass',@mass,'MStateDependence','strong','JPattern',JPat(N),...
   'MvPattern',MvPat(N),'RelTol',1e-5,'AbsTol',1e-4);

Наконец, позвоните ode15s чтобы решить систему на интервале [0,1] использование movingMeshODE производная функция, временной интервал, начальные условия и структура опций.

tspan = [0 1];
sol = ode15s(@movingMeshODE,tspan,y0,opts);

Графическое изображение результатов

Результатом интегрирования является структура sol который содержит временные шаги t, точки mesh x(t), и решение u(x,t). Извлеките эти значения из структуры.

t = sol.x;
x = sol.y(N+1:end,:);
u = sol.y(1:N,:);

Постройте график перемещения mesh с течением времени. График показывает, что точки mesh сохраняют достаточно равномерный интервал с течением времени (из-за функции монитора), но они способны кластеризоваться вблизи разрыва в решении, когда оно движется.

plot(x,t)
xlabel('t')
ylabel('x(t)')
title('Burgers'' equation: Trajectories of grid points')

Figure contains an axes. The axes with title Burgers' equation: Trajectories of grid points contains 80 objects of type line.

Теперь, выборка u(x,t) при нескольких значениях t и постройте график эволюции решения с течением времени. Mesh в концах интервала фиксированы, так что x(0) = 0 и x(N+1) = 1. Граничные значения u(t,0) = 0 и u(t,1) = 0, который необходимо добавить к известным значениям, вычисленным для рисунка.

tint = 0:0.2:1;
yint = deval(sol,tint);
figure
labels = {};
for j = 1:length(tint)
   solution = [0; yint(1:N,j); 0];
   location = [0; yint(N+1:end,j); 1];
   labels{j} = ['t = ' num2str(tint(j))];
   plot(location,solution,'-o')
   hold on
end
xlabel('x')
ylabel('solution u(x,t)')
legend(labels{:},'Location','SouthWest')
title('Burgers equation on moving mesh')
hold off

Figure contains an axes. The axes with title Burgers equation on moving mesh contains 6 objects of type line. These objects represent t = 0, t = 0.2, t = 0.4, t = 0.6, t = 0.8, t = 1.

График показывает, что u(x,0) - это гладкая волна, которая развивает крутой градиент с течением времени, когда она движется к x=1. Mesh отслеживают перемещение разрыва, так что дополнительные точки оценки находятся в соответствующем положении на каждом временном шаге.

Ссылки

[1] Huang, Weizhang, et al. Методы скользящей сетки, основанные на движущихся дифференциальных уравнениях с частными производными сетки. Журнал вычислительной физики, том 113, № 2, август 1994, стр. 279-90. https://doi.org/10.1006/jcph.1994.1135.

Локальные функции

Здесь перечислены локальные вспомогательные функции, которые решатель ode15s вызывается для вычисления решения. Также можно сохранить эти функции как собственные файлы в директории по пути MATLAB.

function g = movingMeshODE(t,y)
% Extract the components of y for the solution u and mesh x
N = length(y)/2;
u = y(1:N);
x = y(N+1:end);

% Boundary values of solution u and mesh x
u0 = 0;
uNP1 = 0;
x0 = 0;
xNP1 = 1;

% Preallocate g vector of derivative values.
g = zeros(2*N,1);

% Use centered finite differences to approximate the RHS of Burgers'
% equations (with single-sided differences on the edges). The first N
% elements in g correspond to Burgers' equations.
for i = 2:N-1
    delx = x(i+1) - x(i-1);
    g(i) = 1e-4*((u(i+1) - u(i))/(x(i+1) - x(i)) - ...
        (u(i) - u(i-1))/(x(i) - x(i-1)))/(0.5*delx) ...
        - 0.5*(u(i+1)^2 - u(i-1)^2)/delx;
end
delx = x(2) - x0;
g(1) = 1e-4*((u(2) - u(1))/(x(2) - x(1)) - (u(1) - u0)/(x(1) - x0))/(0.5*delx) ...
    - 0.5*(u(2)^2 - u0^2)/delx;
delx = xNP1 - x(N-1);
g(N) = 1e-4*((uNP1 - u(N))/(xNP1 - x(N)) - ...
    (u(N) - u(N-1))/(x(N) - x(N-1)))/delx - ...
    0.5*(uNP1^2 - u(N-1)^2)/delx;

% Evaluate the monitor function values (Eq. 21 in reference paper), used in
% RHS of mesh equations. Centered finite differences are used for interior
% points, and single-sided differences are used on the edges.
M = zeros(N,1);
for i = 2:N-1
    M(i) = sqrt(1 + ((u(i+1) - u(i-1))/(x(i+1) - x(i-1)))^2);
end
M0 = sqrt(1 + ((u(1) - u0)/(x(1) - x0))^2);
M(1) = sqrt(1 + ((u(2) - u0)/(x(2) - x0))^2);
M(N) = sqrt(1 + ((uNP1 - u(N-1))/(xNP1 - x(N-1)))^2);
MNP1 = sqrt(1 + ((uNP1 - u(N))/(xNP1 - x(N)))^2);

% Apply spatial smoothing (Eqns. 14 and 15) with gamma = 2, p = 2.
SM = zeros(N,1);
for i = 3:N-2
    SM(i) = sqrt((4*M(i-2)^2 + 6*M(i-1)^2 + 9*M(i)^2 + ...
        6*M(i+1)^2 + 4*M(i+2)^2)/29);
end
SM0 = sqrt((9*M0^2 + 6*M(1)^2 + 4*M(2)^2)/19);
SM(1) = sqrt((6*M0^2 + 9*M(1)^2 + 6*M(2)^2 + 4*M(3)^2)/25);
SM(2) = sqrt((4*M0^2 + 6*M(1)^2 + 9*M(2)^2 + 6*M(3)^2 + 4*M(4)^2)/29);
SM(N-1) = sqrt((4*M(N-3)^2 + 6*M(N-2)^2 + 9*M(N-1)^2 + 6*M(N)^2 + 4*MNP1^2)/29);
SM(N) = sqrt((4*M(N-2)^2 + 6*M(N-1)^2 + 9*M(N)^2 + 6*MNP1^2)/25);
SMNP1 = sqrt((4*M(N-1)^2 + 6*M(N)^2 + 9*MNP1^2)/19);
for i = 2:N-1
    g(i+N) = (SM(i+1) + SM(i))*(x(i+1) - x(i)) - ...
        (SM(i) + SM(i-1))*(x(i) - x(i-1));
end
g(1+N) = (SM(2) + SM(1))*(x(2) - x(1)) - (SM(1) + SM0)*(x(1) - x0);
g(N+N) = (SMNP1 + SM(N))*(xNP1 - x(N)) - (SM(N) + SM(N-1))*(x(N) - x(N-1));

% Form final discrete approximation for Eq. 12 in reference paper, the equation governing
% the mesh points.
tau = 1e-3;
g(1+N:end) = - g(1+N:end)/(2*tau);
end

% -----------------------------------------------------------------------
function M = mass(t,y)
% Extract the components of y for the solution u and mesh x
N = length(y)/2; 
u = y(1:N);
x = y(N+1:end);

% Boundary values of solution u and mesh x
u0 = 0;
uNP1 = 0;
x0 = 0;
xNP1 = 1;

% M1 and M2 are the portions of the mass matrix for Burgers' equation. 
% The derivative du/dx is approximated with finite differences, using 
% single-sided differences on the edges and centered differences in between.
M1 = speye(N);
M2 = sparse(N,N);
M2(1,1) = - (u(2) - u0)/(x(2) - x0);
for i = 2:N-1
    M2(i,i) = - (u(i+1) - u(i-1))/(x(i+1) - x(i-1));
end
M2(N,N) = - (uNP1 - u(N-1))/(xNP1 - x(N-1));

% M3 and M4 define the equations for mesh point evolution, corresponding to 
% MMPDE6 in the reference paper. Since the mesh functions only involve d/dt(dx/dt), 
% the M3 portion of the mass matrix is all zeros. The second derivative in M4 is 
% approximated using a finite difference Laplacian matrix. 
M3 = sparse(N,N);
e = ones(N,1);
M4 = spdiags([e -2*e e],-1:1,N,N);

% Assemble mass matrix
M = [M1 M2
     M3 M4];
end

% -------------------------------------------------------------------------
function out = JPat(N)  % Jacobian sparsity pattern
S1 = spdiags(ones(N,3),-1:1,N,N);
S2 = spdiags(ones(N,9),-4:4,N,N);
out = [S1 S1
    S2 S2];
end

% -------------------------------------------------------------------------
function S = MvPat(N)  % Sparsity pattern for the derivative of the Mass matrix times a vector
S = sparse(2*N,2*N);
S(1,2) = 1;
S(1,2+N) = 1;
for i = 2:N-1
    S(i,i-1) = 1;
    S(i,i+1) = 1;
    S(i,i-1+N) = 1;
    S(i,i+1+N) = 1;
end
S(N,N-1) = 1;
S(N,N-1+N) = 1;
end
% -------------------------------------------------------------------------

См. также

|

Похожие темы