Новая
версия программы Maple "способна" решать
аналитически некоторые классы дифференциальных
уравнений в частных производных. Для этого
введена команда pdesolve ( уравнения,
переменные).
Приведем примеры.
> restart;pdesolve(
diff(f(x,y),x,x)+5*diff(f(x,y),x,y)=3, f(x,y) );
В решении этого уравнения присутствуют
произвольные функции _F1, _F2.
> pdesolve(
3*diff(g(x,y),x)+7*diff(g(x,y),x,y)=x*y, g(x,y) );
Maple находит решение некоторых видов
уравнений с непостоянными коэффициентами,
например
> pdesolve(y*diff(U(x,y),x)+x*diff(U(x,y),y)=0,
U(x,y) );
Неоднородное уравнение для функции U от
трех независимых переменных
> pdesolve( diff(U(x, y, z),
x)+2*diff(U(x, y, z), y)+5*diff(U(x, y, z),
z)=13*x*y*z, U(x, y, z) );
Следующие два примера уравнений
математической физики.
Уравнение теплопроводности
> restart;heat:=diff(u(x,t),t)-k*diff(u(x,t),x,x)=0;
Команда pdesolve "в лоб" не решает
это уравнение, действительно
> pdesolve(heat,u(x,t));
Применим известный прием разделения
переменных. Для этого вначале сделаем
подстановку
> eq:=subs(u(x,t)=X(x)*T(t),heat);
Теперь разделим обе части уравнения на
X(x)*T(t)
> expand(eq/X(x)/T(t));
Разделим переменные
> sep:=(%)+(k*diff(X(x),x,x)/X(x)=k*diff(X(x),x,x)/X(x));
Так как в левой и правой частях
полученного равенства стоят функции от разных
переменных, то правая и левая части являются
постоянными величинами.
> lhs(sep)=C;
Теперь мы получили обыкновенное
дифференциальное уравнение и его решение
> T_sol:=dsolve(%,T(t));
Аналогично приравняем константе правую
часть равенства
> rhs(sep)=C;
Решение полученного обыкновенного
дифференциального уравнения
> X_sol:=dsolve(%,X(x),explicit=true);
> map(subs,[X_sol],T_sol,X(x)*T(t));
> sol:=map(simplify,%);
Для упрощения выполним подстановку
конкретных значений для произвольных постоянных
> subs(C=k,k=1,_C1=1,_C2=1,sol);
> evalc(%);
Преобразуем к тригонометрическому виду
> convert(%,trig);
и упростим
> S:=evalc(%);
Теперь можно построить график первого
решения (рис. 9).
> plot3d(op(S),x=-5..5,t=0..5);
рис. 9
Проверим правильность первого решения
> simplify(subs(u(x,t)=sol[1],heat));
В качестве еще одного примера
рассмотрим волновое уравнение
> restart;wave:=diff(u(x,t),t,t)-c^2*diff(u(x,t),x,x);
Найдем решение для u(x,t).
> sol:=pdesolve(wave,u(x,t));
Здесь _F1 и _F2 - произвольные функции.
Заменим их конкретными функциями f1 и f2
> f1:=xi -> sech(-xi^2);
> f2:=xi -> piecewise(-1/2<xi
and xi<1/2,1,0);
Заменим наименования функций в решении
на f1 и f2, а также положим с=1.
> subs(_F1=f1, _F2=f2, c=1, sol);
Теперь подставим значения f1 и f2 в u(x,t),
чтобы получить конкретное решение.
> subs(%,u(x,t));
Применим функцию unapply, чтобы превратить
полученное выражение в функцию от x и t
> f:=unapply(%,x,t);
Теперь мы можем построить график
решения (рис. 10).
> plot3d(f,
-10..10, 0..10, grid=[60,60]);
рис. 10
На графике мы видем две волны, которые
представляют решение волнового уравнения.
|