К основному контенту

Параболическое + эллиптическое уравнения в MATLAB

То ли MATLAB неправильно считает, то ли я чего-то не понимаю.
Попробуем решить в MATLAB вот такую простенькую систему одномерных дифференциальных уравнений:
с краевыми условиями 3-го рода
и однородными начальными условиями
Фактически начальное условие для функции v определяется по начальному условию для функции u.
Первое уравнение параболического типа, второе — эллиптического.
Применим встроенный решатель MATLAB, а именно функцию pdepe. В документации сказано, что эта функция может решать системы уравнений параболического и эллиптического типа, в которых есть по крайней мере одно параболическое уравнение.
Но оказывается, что эта функция считает абсолютно неправильно.
Вот исходный код (файл a.m):
function a

tt = 1;

m = 0;
x = linspace(0,1,100);
t = linspace(0,tt,100);

sol = pdepe(m,@apde,@aic,@abc,x,t);
u1 = sol(:,:,1);
u2 = sol(:,:,2);

figure;
surf(x,t,u1);
title('u1(x,t)');
xlabel('Distance x');
ylabel('Time t');
shading interp
colorbar
set(gca,'YDir','reverse');

figure;
surf(x,t,u2);
title('u2(x,t)');
xlabel('Distance x');
ylabel('Time t');
shading interp
colorbar
set(gca,'YDir','reverse');

figure
plot(x,u1(end,:))
title('u1 at t = tt')
xlabel('Distance x')
ylabel('u1(x,tt)')

figure
plot(x,u2(end,:))
title('u2 at t = tt')
xlabel('Distance x')
ylabel('u2(x,tt)')

figure
plot(x,tt*(1+x-x.^2))
title('TRUE u2 at t = tt')
xlabel('Distance x')
ylabel('u2(x,tt)')

% --------------------------------------------------------------

function [c,f,s] = apde(x,t,u,DuDx)
c = [1; 0];                                 
f = [1; 1] .* DuDx;                  
s = [2; u(1)];

% --------------------------------------------------------------

function u0 = aic(x)
u0 = [0; 0];                                

% --------------------------------------------------------------

function [pl,ql,pr,qr] = abc(xl,ul,xr,ur,t)
pl = [ul(1)-2*t; ul(2)];                              
ql = [-1; -1];                                 
pr = [ur(1)-2*t; ur(2)];                           
qr = [1; 1];                                 


Точное решение:
Функцию u MATLAB считает правильно.
Вот что должно получиться для функции v в момент времени t = 1:
Вот что выдает MATLAB:
Можно заметить, что эта функция не удовлетворяет краевым условиям, так как на левом конце значения функции и её производной должны быть одного знака, а на рисунке производная положительна, а функция отрицательна.
Вот график v(x,t):
Но если сделать 2-е уравнение вместо эллиптического параболическим, взяв вместо вектора
c = [1; 0];
вот такой вектор:
c = [1; 1e-100];
(т.е. прибавили ко 2-му уравнению производную по времени с очень маленьким коэффициентом), то MATLAB выдаёт правильный результат. Вот график:
То есть вместо того, чтобы идти вверх, решение, посчитанное Матлабом, идёт вниз.
Важно отметить, что если вместо краевых условий 3-го рода для 2-го уравнения поставить условия Дирихле
то всё считается правильно.
Таким образом, данный пример демонстрирует, что встроенный решатель Матлаба pdepe неправильно решает систему параболических и эллиптических уравнений с краевыми условиями 3-го рода.

Комментарии

Глеб Гренкин написал(а)…
Вопрос на StackExchange: http://math.stackexchange.com/questions/829402/matlab-incorrect-computation-with-pdepe-for-parabolic-elliptic-system