Численное решение дифференциальных уравнений в частных производных 

Для численного решения дифференциальных уравнений в частных производных используется функция pdsolve с параметром numeric. Рассмотрим следующую задачу. 

Струна длиной l кругового поперечного сечения радиусом r = `+`(`*`(`/`(1, 400), `*`(l))) с жестко закрепленными концами в начальный момент времени имела форму квадратичной параболы, симметричной относительно перпендикуляра к середине струны, а затем отпущена без толчка. Натяжение струны T = 50 H. Длина струны l = 0,78 м. Плотность материала струны ρ = 6200 кг/`*`(`^`(<, 3)). Определить процесс поперечных колебаний струны, если максимальное начальное отклонение струны составляло . 

Граничные условия определяют условия закрепления струны. В нашем случае струна закреплена на концах, т.е. u(0, t) = 0 и u(l, t) = 0. 

Начальные условия определяют форму и скорость струны в начальный момент времени. В нашем случае f(x) – квадратичная парабола, определение коэффициентов которой является тривиальной задачей, а с учетом того, что струна отпущена без толчка – скорость всех ее точек в начальный момент времени равна нулю, т.е. u(x, 0) = `+`(`-`(`/`(`*`(4, `*`(h, `*`(`^`(x, 2)))), `*`(`^`(l, 2)))), `/`(`*`(4, `*`(h, `*`(x))), `*`(l))) и  

Граничные условия вместе с начальными условиями называют краевыми условиями. 

Поперечные колебания струны описываются волновым уравнением. 

> restart:
PDE:=diff(u(x,t),t,t)=a^2*diff(u(x,t),x,x);
 

diff(diff(u(x, t), t), t) = `*`(`^`(a, 2), `*`(diff(diff(u(x, t), x), x)))
 

 

> a:=sqrt(T/rho[l]);
rho[l]:=rho[c]*S;
S:=Pi*r^2;
 

 

 

`*`(`^`(`/`(`*`(T), `*`(rho[l])), `/`(1, 2)))
`*`(rho[c], `*`(S))
`*`(Pi, `*`(`^`(r, 2)))
 

Введем исходные данные. 

> T:=50;L:=0.78;r:=L/400;rho[c]:=6200;h:=L/100;
 

 

 

 

 

50
.78
0.1950000000e-2
6200
0.7800000000e-2
 

Форма струны в начальный момент времени. 

> f:=-4*h/L^2*x^2+4*h/L*x;
 

`+`(`-`(`*`(0.5128205128e-1, `*`(`^`(x, 2)))), `*`(0.4000000000e-1, `*`(x)))
 

Запишем краевые условия. 

> BC:={u(0,t)=0,u(L,t)=0,u(x,0)=f,D[2](u)(x,0)=0};
 

{u(0, t) = 0, u(.78, t) = 0, u(x, 0) = `+`(`-`(`*`(0.5128205128e-1, `*`(`^`(x, 2)))), `*`(0.4000000000e-1, `*`(x))), (D[2](u))(x, 0) = 0}
 

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

> SOL:=pdsolve(PDE,BC,numeric,timestep=1/2000, spacestep=1/2000);
 

module () local INFO; export plot, plot3d, animate, value, settings; option `Copyright (c) 2001 by Waterloo Maple Inc. All rights reserved.`; end module
 

Параметры timestep и spacestep задают шаги по времени и пространству, используемые при интегрировании уравнений в частных производных. 

Покажем положение струны в момент времени t = 0,1 с , используя полученный модуль с параметром plot. 

> SOL:-plot(t=0.1,title="Время = 0.1 секунды");
 

Plot_2d
 

Визуализируем процесс колебаний струны, используя полученный модуль с параметром animate. 

> SOL:-animate(t=0..0.5,frames=300,title="Время = %f");
 

Plot_2d
 

Задача о поперечных колебаниях струны может быть решена методом Фурье. 

Метод Фурье является классическим методом решения уравнений в частных производных. Применительно к  рассматриваемой задаче решение представляется в виде 

 

Ограничимся первыми двумястами членами бесконечной суммы и запишем решение.  

> u:=(x,t)->32*h*(sum((sin(Pi*(2*k+1)*x/L)*cos(a*Pi*(2*k+1)*t/L)/(2*k+1)^3), k = 0..200))/Pi^3;
 

proc (x, t) options operator, arrow; `+`(`/`(`*`(32, `*`(h, `*`(sum(`/`(`*`(sin(`/`(`*`(Pi, `*`(`+`(`*`(2, `*`(k)), 1), `*`(x))), `*`(L))), `*`(cos(`/`(`*`(a, `*`(Pi, `*`(`+`(`*`(2, `*`(k)), 1), `*`(t...
 

Визуализируем процесс колебаний струны. 

> plots[animate](plot,[(evalf(u(x,t)),x=0..L)],t=0..0.5,frames=300);
 

Plot_2d
 

Совместим два решения задачи. 

> SOL_n:=SOL:-animate(t=0.5,frames=300,title="Время = %f",legend=["численный метод"]):
SOL_a:=plots[animate](evalf(u(x,t)),x=0..L,t=0..0.5,frames=300,color=blue,legend=["метод Фурье"]):
plots[display](SOL_a, SOL_n);
 

Plot_2d
 

Наблюдается отличное совпадение результатов, полученных разными методами.