restart;
with(PDETools);
# Задаем наше ДУ и начальные, граничные условия
pde := diff(u(x, t), t, t) = a^2*diff(u(x, t), x, x);
ic := u(x, 0) = 0, D[2](u)(x, 0) = psi(x)
bc := u(0, t) = 0, u(l, t) = 0
psi := piecewise(0 <= x and x <= l/2, x, l/2 <= x and x <= l, l - x)
# Разделяем переменные методом Фурье
res := pdsolve(pde, HINT = T(t)*X(x));
ode1 := op(1, op(1, op(2, res)))
ode2 := op(2, op(1, op(2, res)))
ode2 := subs(_c[1] = -lambda, ode2)
# Решаем два дифференциальных уравнения с учетом начальных условий
# уравнение относительно X(x)
dsolve({ode2, X(0) = 0}, X(x));
sin(sqrt(lambda)*l) = 0
solve(%, lambda, allsolutions)
lambda := (Pi*n/l)^2
X := (x, n) -> sin(Pi*n*x/l)
# уравнение относительно T(t)
ode1 := subs(_c[1] = -lambda, ode1);
dsolve({%, T(0) = 0}, T(t))
T := (t, n) -> C1[n]*sin(Pi*n*a*t/l)
# Записываем решение как сумму частных решений
Un := (x, t, n) -> T(t, n)*X(x, n);
u := (x, t) -> Sum(Un(x, t, n), n = 1 .. infinity);
'u(x, t)' = u(x, t);
# Определяем коэффициенты разложения исходя из начальных условий
simplify(subs(t = 0, diff(u(x, t), t)) = psi);
# В данном случае коэффициентами разложения функции psi(x) будут являться числа Pi*n*a*С1_n/l
((2/l)*l/(Pi*n*a)*int(psi*X(x, n), x = 0 .. l) assuming (x < l))
simplify(%) assuming n::posint;
combine(%);
C1[n] := factor(%);