Этот пример показывает, как сформулировать, вычислить и построить график решения для одного УЧП.
Рассмотрим дифференциальное уравнение с частными производными
Уравнение определяется интервалом для раз . В , решение удовлетворяет начальному условию
Кроме того, в и , решение удовлетворяет граничным условиям
Чтобы решить это уравнение в MATLAB, необходимо кодировать уравнение, начальные условия и граничные условия, затем выбрать подходящий mesh решения перед вызовом решателя pdepe
. Можно либо включить необходимые функции в качестве локальных функций в конце файла (как это сделано здесь), либо сохранить их как отдельные, именованные файлы в директории по пути MATLAB.
Прежде чем вы сможете кодировать уравнение, необходимо переписать его в форме, которую pdepe
решатель ожидает. Стандартная форма, которая pdepe
ожидает, что
.
Написанный в этой форме, УЧП становится
.
С помощью уравнения в надлежащей форме можно считать релевантные условия:
Теперь можно создать функцию, чтобы кодировать уравнение. Функция должна иметь подпись [c,f,s] = pdex1pde(x,t,u,dudx)
:
x
- независимая пространственная переменная.
t
- независимая временная переменная.
u
- зависимая переменная, дифференцируемая по отношению к x
и t
.
dudx
- частная пространственная производная .
Выходные выходы c
, f
, и s
соответствуют коэффициентам в стандартной форме уравнения УЧП, ожидаемым по pdepe
. Эти коэффициенты кодируются в терминах входных переменных x
, t
, u
, и dudx
.
В результате уравнение в этом примере может быть представлено функцией:
function [c,f,s] = pdex1pde(x,t,u,dudx) c = pi^2; f = dudx; s = 0; end
(Примечание. Все функции включены в качестве локальных функций в конце примера.)
Затем напишите функцию, которая возвращает начальное условие. Начальное условие применяется при первом временном значении tspan(1)
. Функция должна иметь подпись u0 = pdex1ic(x)
.
Соответствующая функция является
function u0 = pdex1ic(x) u0 = sin(pi*x); end
Теперь напишите функцию, которая оценивает граничные условия. Для задач, поставленных на интервале , граничные условия применяются для всех и либо или . Стандартная форма для граничных условий, ожидаемых решателем,
Перепишите граничные условия в этой стандартной форме и считайте значения коэффициентов.
Для , уравнение
Коэффициенты:
Для , уравнение
Коэффициенты:
Поскольку функция граничного условия выражена в терминах , и этот термин уже определен в основной функции PDE, вам не нужно задавать эту часть уравнения в функции граничных условий. Вам нужно только задать значения и на каждом контуре.
Граничная функция должна использовать сигнатуру функции [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t)
:
Входы xl
и ul
соответствуют и для левого контура.
Входы xr
и ur
соответствуют и для правого контура.
t
- независимая временная переменная.
Выходные выходы pl
и ql
соответствуют и для левого контура ( для этой задачи).
Выходные выходы pr
и qr
соответствуют и для правого контура ( для этой задачи).
Граничные условия в этом примере представлены функцией:
function [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t) pl = ul; ql = 0; pr = pi * exp(-t); qr = 1; end
Перед решением уравнения необходимо задать точки mesh при котором вы хотите pdepe
для оценки решения. Задайте точки как векторы t
и x
. Векторы t
и x
играть различные роли в решателе. В частности, стоимость и точность решения сильно зависят от длины вектора x
. Однако расчет намного менее чувствительно к значениям в векторе t
.
Для этой задачи используйте mesh с 20 равномерно разнесенными точками в пространственном интервале [0,1] и пятью значениями t
из временного интервала [0,2].
x = linspace(0,1,20); t = linspace(0,2,5);
Наконец, решить уравнение используя симметрию m
, уравнение УЧП, начальные условия, граничные условия и сетки для x
и t
.
m = 0; sol = pdepe(m,@pdex1pde,@pdex1ic,@pdex1bc,x,t);
pdepe
возвращает решение в трехмерный массив sol
, где sol(i,j,k)
аппроксимирует k
первый компонент решения оценивается в t(i)
и x(j)
. Размер sol
является length(t)
-by- length(x)
-by- length(u0)
, с u0
задает начальное условие для каждого компонента решения. Для этой задачи u
имеет только один компонент, так что sol
является матрицей 5 на 20, но в целом можно извлечь k
компонент решения с командой u = sol(:,:,k)
.
Извлеките первый компонент решения из sol
.
u = sol(:,:,1);
Создать объемную поверхностную диаграмму решения.
surf(x,t,u) title('Numerical solution computed with 20 mesh points') xlabel('Distance x') ylabel('Time t')
Начальное условие и краевые условия этой задачи были выбраны так, чтобы было аналитическое решение, заданное как
Постройте график аналитического решения с теми же точками mesh.
surf(x,t,exp(-t)'*sin(pi*x)) title('True solution plotted with 20 mesh points') xlabel('Distance x') ylabel('Time t')
Теперь сравните числовые и аналитические решения в , окончательное значение . В этом примере .
plot(x,u(end,:),'o',x,exp(-t(end))*sin(pi*x)) title('Solution at t = 2') legend('Numerical, 20 mesh points','Analytical','Location','South') xlabel('Distance x') ylabel('u(x,2)')
Здесь перечислены локальные вспомогательные функции, которые УЧП решателя pdepe вызывает для вычисления решения. Также можно сохранить эти функции как собственные файлы в директории по пути MATLAB.
function [c,f,s] = pdex1pde(x,t,u,dudx) % Equation to solve c = pi^2; f = dudx; s = 0; end %---------------------------------------------- function u0 = pdex1ic(x) % Initial conditions u0 = sin(pi*x); end %---------------------------------------------- function [pl,ql,pr,qr] = pdex1bc(xl,ul,xr,ur,t) % Boundary conditions pl = ul; ql = 0; pr = pi * exp(-t); qr = 1; end %----------------------------------------------