Ordinary & Partial Differential Equations - New Features in Maple 2020 - Maplesoft

What's New in Maple 2020

Ordinary and Partial Differential Equations

Maple is the world leader in finding exact solutions to ordinary and partial differential equations. Maple 2020 extends that lead even further with new algorithms and techniques for solving more ODEs and PDEs, including general solutions, and solutions with initial conditions and/or boundary conditions.

For Maple 2020, there are significant improvements both in dsolve and in pdsolve for the exact solution of ODEs and PDEs, with and without initial or boundary conditions.

For ODEs, a new algorithm for computing hypergeometric solutions to 2nd order linear ODEs is capable of solving new classes of problems that were previously out of reach.


Hypergeometric solutions for second-order linear ODEs

 

Previous Maple releases already have algorithms for computing hypergeometric solutions for linear ODEs. The new algorithms implemented in Maple 2020, however, are more general. Suppose an ODE admits solutions of the form 

 

 

 

where r__0(x); and r__1(x); are rational functions of x, and Y(x); is the solution of some other linear ODE. Then the new algorithm can compute that other linear ODE and solve it, provided that it admits solutions of the form 

 

Y(x) = `*`(exp(int(r(x), x)), `*`(hypergeom([a, b], [c], f(x))));  

 

where r(x); and f(x); are rational functions of x, `#mscripts(mi( is the hypergeomtric function and a, b, and c are arbitrary constants. The new algorithms use modular reduction, Hensel lifting, rational function reconstruction, and rational number reconstruction.  

 

This algorithm is more general than previous algorithms in that it has no restrictions neither on the degree of the pullback function f(x); nor the number of singularities of the input equation. The implementation follows the presentation by Imamoglu, E. and van Hoeij, M. "Computing Hypergeometric Solutions of Second Order Linear Differential Equations using Quotients of Formal Solutions and Integral Bases", Journal of Symbolic Computation, 83, (2017): 254-271. 

 

Examples 

A problem that admits solutions of the form Y(x) = `*`(exp(int(r(x), x)), `*`(hypergeom([a, b], [c], f(x))));  

> restart; 1
 

> ode__1 := `+`(diff(y(x), x, x), `/`(`*`(4, `*`(`+`(`*`(24, `*`(`^`(x, 2))), `-`(1)), `*`(diff(y(x), x)))), `*`(x, `*`(`+`(`*`(16, `*`(`^`(x, 2))), `-`(1))))), `/`(`*`(2, `*`(`+`(`*`(192, `*`(`^`(x, 3)...
 

> dsolve(ode__1);
 

y(x) = `+`(`/`(`*`(_C1, `*`(hypergeom([-`/`(1, 2), `/`(1, 2)], [1], `/`(`*`(`^`(`+`(`*`(4, `*`(x)), 1), 2)), `*`(`^`(`+`(`*`(4, `*`(x)), `-`(1)), 2)))))), `*`(`^`(x, 2))), `/`(`*`(_C2, `*`(hypergeom([... (1)
 

An example where the solutions are of the form  


> ode__2 := `+`(diff(y(x), x, x), `/`(`*`(2, `*`(`+`(`*`(112, `*`(`^`(x, 3))), `-`(`*`(168, `*`(`^`(x, 2)))), `*`(73, `*`(x)), `-`(9)), `*`(diff(y(x), x)))), `*`(x, `*`(`+`(`-`(1), `*`(2, `*`(x))), `*`(...
 

> dsolve(ode__2);
 

y(x) = `+`(`*`(_C1, `*`(`+`(`-`(`/`(`*`(`+`(`*`(4, `*`(x)), 1), `*`(hypergeom([`/`(1, 2), `/`(1, 2)], [1], `+`(`*`(16, `*`(`^`(x, 2))))))), `*`(`+`(`*`(2, `*`(x)), `-`(1)), `*`(`^`(x, 2))))), `/`(`*`(...
y(x) = `+`(`*`(_C1, `*`(`+`(`-`(`/`(`*`(`+`(`*`(4, `*`(x)), 1), `*`(hypergeom([`/`(1, 2), `/`(1, 2)], [1], `+`(`*`(16, `*`(`^`(x, 2))))))), `*`(`+`(`*`(2, `*`(x)), `-`(1)), `*`(`^`(x, 2))))), `/`(`*`(...
(2)
 

An example with a parameter a in the coefficients
 

> ode__3 := `+`(`*`(`+`(`*`(a, `*`(x)), 1), `*`(diff(y(x), x, x))), `/`(`*`(`+`(`*`(288, `*`(a, `*`(`^`(x, 4)))), `-`(18), `*`(`+`(`-`(`*`(432, `*`(a))), 224), `*`(`^`(x, 3))), `*`(`+`(`*`(190, `*`(a)),...
ode__3 := `+`(`*`(`+`(`*`(a, `*`(x)), 1), `*`(diff(y(x), x, x))), `/`(`*`(`+`(`*`(288, `*`(a, `*`(`^`(x, 4)))), `-`(18), `*`(`+`(`-`(`*`(432, `*`(a))), 224), `*`(`^`(x, 3))), `*`(`+`(`*`(190, `*`(a)),...
 

> dsolve(ode__3);
 

y(x) = `+`(`/`(`*`(_C1, `*`(`^`(`+`(`*`(4, `*`(x)), `-`(3)), `/`(1, 2)), `*`(`+`(`*`(4, `*`(hypergeom([`/`(3, 2), `/`(3, 2)], [2], `+`(`*`(16, `*`(`^`(x, 2))))), `*`(x))), `-`(hypergeom([`/`(3, 2), `/...
y(x) = `+`(`/`(`*`(_C1, `*`(`^`(`+`(`*`(4, `*`(x)), `-`(3)), `/`(1, 2)), `*`(`+`(`*`(4, `*`(hypergeom([`/`(3, 2), `/`(3, 2)], [2], `+`(`*`(16, `*`(`^`(x, 2))))), `*`(x))), `-`(hypergeom([`/`(3, 2), `/...
(3)
 

Verify this solution 

 

> odetest(y(x) = `+`(`/`(`*`(_C1, `*`(`^`(`+`(`*`(4, `*`(x)), `-`(3)), `/`(1, 2)), `*`(`+`(`*`(4, `*`(hypergeom([`/`(3, 2), `/`(3, 2)], [2], `+`(`*`(16, `*`(`^`(x, 2))))), `*`(x))), `-`(hypergeom([`/`(3...
 

0 (4)
 

Some ODEs with 4 regular singular points that can be solved in terms of HeunG functions can also be solved using the new algorithm. This is possible whenever through a gauge transformation one of the singularities can be removed. The following ODE is of that kind, and the default solution returned by dsolve is in terms of HeunG 

> ode__4 := `+`(diff(y(x), x, x), `/`(`*`(`/`(1, 4), `*`(`+`(`*`(`^`(x, 4)), `-`(`*`(44, `*`(`^`(x, 3)))), `*`(1206, `*`(`^`(x, 2))), `-`(`*`(44, `*`(x))), 1), `*`(y(x)))), `*`(`^`(`+`(`*`(`^`(x, 2)), `...
 

> dsolve(ode__4);
 

y(x) = `+`(`*`(_C1, `*`(`^`(x, `/`(1, 2)), `*`(`^`(`+`(`-`(`*`(`^`(x, 2))), `*`(34, `*`(x)), `-`(1)), `/`(3, 4)), `*`(HeunG(`+`(`/`(`*`(24, `*`(`^`(2, `/`(1, 2)))), `*`(`+`(`-`(17), `*`(12, `*`(`^`(2,...
y(x) = `+`(`*`(_C1, `*`(`^`(x, `/`(1, 2)), `*`(`^`(`+`(`-`(`*`(`^`(x, 2))), `*`(34, `*`(x)), `-`(1)), `/`(3, 4)), `*`(HeunG(`+`(`/`(`*`(24, `*`(`^`(2, `/`(1, 2)))), `*`(`+`(`-`(17), `*`(12, `*`(`^`(2,...
y(x) = `+`(`*`(_C1, `*`(`^`(x, `/`(1, 2)), `*`(`^`(`+`(`-`(`*`(`^`(x, 2))), `*`(34, `*`(x)), `-`(1)), `/`(3, 4)), `*`(HeunG(`+`(`/`(`*`(24, `*`(`^`(2, `/`(1, 2)))), `*`(`+`(`-`(17), `*`(12, `*`(`^`(2,...
(5)
 

To get a solution in terms of hypergeometric functions you can indicate the method to be used, in this case the new method hypergeometricsols 

 

> dsolve(ode__4, [hypergeometricsols]);
 

Typesetting:-mprintslash([y(x) = `+`(`*`(_C1, `*`(exp(`+`(`-`(`*`(`/`(1, 2), `*`(Int(`/`(`*`(`+`(`-`(`*`(`^`(x, 3))), `*`(6, `*`(`^`(`+`(`*`(`^`(x, 2)), `-`(`*`(34, `*`(x))), 1), `/`(1, 2)), `*`(x))),...
Typesetting:-mprintslash([y(x) = `+`(`*`(_C1, `*`(exp(`+`(`-`(`*`(`/`(1, 2), `*`(Int(`/`(`*`(`+`(`-`(`*`(`^`(x, 3))), `*`(6, `*`(`^`(`+`(`*`(`^`(x, 2)), `-`(`*`(34, `*`(x))), 1), `/`(1, 2)), `*`(x))),...
(6)
 

The integrals can actually be computed 

 

> value(y(x) = `+`(`*`(_C1, `*`(exp(`+`(`-`(`*`(`/`(1, 2), `*`(Int(`/`(`*`(`+`(`-`(`*`(`^`(x, 3))), `*`(6, `*`(`^`(`+`(`*`(`^`(x, 2)), `-`(`*`(34, `*`(x))), 1), `/`(1, 2)), `*`(x))), `*`(15, `*`(`^`(x, ...
 

y(x) = `+`(`*`(_C1, `*`(exp(`+`(`*`(`/`(1, 2), `*`(arctanh(`+`(`/`(`*`(`/`(1, 12), `*`(`+`(36, `-`(`*`(36, `*`(x)))))), `*`(`^`(`+`(`*`(`^`(`+`(x, 1), 2)), `-`(`*`(36, `*`(x)))), `/`(1, 2)))))))), `*`...
y(x) = `+`(`*`(_C1, `*`(exp(`+`(`*`(`/`(1, 2), `*`(arctanh(`+`(`/`(`*`(`/`(1, 12), `*`(`+`(36, `-`(`*`(36, `*`(x)))))), `*`(`^`(`+`(`*`(`^`(`+`(x, 1), 2)), `-`(`*`(36, `*`(x)))), `/`(1, 2)))))))), `*`...
y(x) = `+`(`*`(_C1, `*`(exp(`+`(`*`(`/`(1, 2), `*`(arctanh(`+`(`/`(`*`(`/`(1, 12), `*`(`+`(36, `-`(`*`(36, `*`(x)))))), `*`(`^`(`+`(`*`(`^`(`+`(x, 1), 2)), `-`(`*`(36, `*`(x)))), `/`(1, 2)))))))), `*`...
(7)
 

Verify this solution 

 

> odetest(y(x) = `+`(`*`(_C1, `*`(exp(`+`(`*`(`/`(1, 2), `*`(arctanh(`+`(`/`(`*`(`/`(1, 12), `*`(`+`(36, `-`(`*`(36, `*`(x)))))), `*`(`^`(`+`(`*`(`^`(`+`(x, 1), 2)), `-`(`*`(36, `*`(x)))), `/`(1, 2)))))...
 

0 (8)
 

Exact solutions to PDEs with Boundary / Initial conditions

Maple 2019 included a significant leap in the computation of exact solutions for PDE with Boundary / Initial conditions. For Maple 2020, another jump ahead in the solving capabilities happened. The examples below belong to different classes of problems out of reach of the Maple 2019 developments. 


Examples

An example where the solution involves products of Bessel and Hankel functions 

> pde__1 := diff(u(r, t), t) = `+`(diff(u(r, t), r, r), `/`(`*`(diff(u(r, t), r)), `*`(r))); -1
 

> iv__1 := u(r, 0) = `+`(1, `-`(r)), u(1, t) = 0; -1
 

> pdsolve([pde__1, iv__1]);
 

u(r, t) = `casesplit/ans`(Sum(`+`(`-`(`/`(`*`(BesselJ(0, `*`(lambda[n], `*`(r))), `*`(Pi, `*`(`+`(`*`(BesselJ(1, lambda[n]), `*`(StruveH(0, lambda[n]))), `-`(`*`(BesselJ(0, lambda[n]), `*`(StruveH(1, ... (9)
 


A similar problem but in three variables; the solution is a double infinite sum 

> pde__2 := diff(u(r, z, t), t) = `+`(diff(u(r, z, t), r, r), `/`(`*`(diff(u(r, z, t), r)), `*`(r)), diff(u(r, z, t), z, z)); -1
 

> iv__2 := u(r, 0, t) = 0, u(r, 1, t) = 0, u(1, z, t) = 0, u(r, z, 0) = f(r, z); -1
 

> pdsolve([pde__2, iv__2]);
 

u(r, z, t) = `casesplit/ans`(Sum(Sum(`+`(`/`(`*`(4, `*`(BesselJ(0, `*`(lambda[n1], `*`(r))), `*`(sin(`*`(n, `*`(Pi, `*`(z)))), `*`(exp(`+`(`-`(`*`(t, `*`(`+`(`*`(`^`(Pi, 2), `*`(`^`(n, 2))), `*`(`^`(l...
u(r, z, t) = `casesplit/ans`(Sum(Sum(`+`(`/`(`*`(4, `*`(BesselJ(0, `*`(lambda[n1], `*`(r))), `*`(sin(`*`(n, `*`(Pi, `*`(z)))), `*`(exp(`+`(`-`(`*`(t, `*`(`+`(`*`(`^`(Pi, 2), `*`(`^`(n, 2))), `*`(`^`(l...
(10)
 

A large number of new infinite series solutions are now computable for different classes of problems (the number of boundary or initial conditions, whether they are periodic or involve derivatives of the unknown, etc.) 

 

> pde__3 := diff(u(x, t), t, t) = `+`(`*`(4, `*`(diff(u(x, t), x, x)))); -1
 

> iv__3 := u(x, 0) = 0, (D[2](u))(x, 0) = `*`(`^`(sin(x), 2)), u(`+`(`-`(Pi)), t) = 0, u(Pi, t) = 0; -1
 

> pdsolve([pde__3, iv__3]);
 

(11)
 

> pde__4 := `+`(diff(u(x, y), x, x), diff(u(x, y), y, y)) = 0; -1
 

> iv__4 := u(0, y) = 0, u(x, 1) = A, u(x, 0) = 0; -1
 

> `assuming`([pdsolve([pde__4, iv__4], HINT = boundedseries(x = infinity))], [`<`(0, x), `<`(0, y)]);
 

(12)
 

> pde__5 := diff(u(t, x), t) = diff(u(t, x), x, x); -1
 

> iv__5 := u(0, x) = 1, u(t, -1) = 0, u(t, 1) = 0; -1
 

> pdsolve([pde__5, iv__5]);
 

(13)
 

An example with periodic conditions in both the unknown and its first derivative, where different methods combine resulting in a solution involving an arbitrary function of x

> pde__6 := diff(u(x, t), t) = diff(u(x, t), x, x); -1
 

> iv__6 := u(`+`(`-`(Pi)), t) = u(Pi, t), (D[1](u))(`+`(`-`(Pi)), t) = (D[1](u))(Pi, t); -1
 

> pdsolve([pde__6, iv__6]);
 

(14)
 

The detection of particular values of the summation index for which the solution branches with a different expression is now better:

> pde__7 := `+`(diff(u(x, t), t, t), `*`(2, `*`(diff(u(x, t), t)))) = diff(u(x, t), x, x); -1
 

> iv__7 := (D[2](u))(x, 0) = 0, u(x, 0) = f(x), u(0, t) = 0, u(Pi, t) = 0; -1
 

> `assuming`([pdsolve([pde__7, iv__7], u(x, t))], [`<`(0, t)]);
 

(15)
 

A problem with two boundary and two initial conditions, all for the unknown u(r, t); , where the solution method consists of splitting the problem into two PDE & BC problems and the solution is the sum of those two solutions 

 

> pde__8 := `+`(diff(u(r, t), r, r), `/`(`*`(diff(u(r, t), r)), `*`(r)), `/`(`*`(diff(u(r, t), t, t)), `*`(`^`(r, 2)))) = 0; -1
 

> iv__8 := u(r, `+`(`*`(`/`(1, 6), `*`(Pi)))) = `+`(`*`(`/`(1, 6), `*`(Pi))), u(r, `+`(`*`(`/`(1, 2), `*`(Pi)))) = 0, u(1, t) = 0, u(2, t) = t; -1
 

> pdsolve([pde__8, iv__8]);
 

(16)
 

Similar example, but involving conditions for the two first derivatives of the unknown u(r, t);  

 

> pde__9 := `+`(diff(u(r, t), r, r), `/`(`*`(diff(u(r, t), r)), `*`(r)), `/`(`*`(diff(u(r, t), t, t)), `*`(`^`(r, 2)))) = 0; -1
 

> iv__9 := u(r, `+`(`*`(`/`(1, 6), `*`(Pi)))) = `+`(`*`(`/`(1, 6), `*`(Pi))), (D[2](u))(r, `+`(`*`(`/`(1, 2), `*`(Pi)))) = 0, u(1, t) = 0, (D[1](u))(2, t) = t; -1
 

> pdsolve([pde__9, iv__9]);
 

(17)
 

 

A problem with initial conditions involving arbitrary functions evaluated at algebraic expressions, as f(x, `+`(`-`(`*`(`/`(1, 2), `*`(a))), `-`(`*`(`/`(1, 2), `*`(b))))); , and boundary conditions that are periodic as u(a, t) = u(b, t);  

 

> pde__10 := diff(u(x, t), t) = `*`(k, `*`(diff(u(x, t), x, x))); -1
 

> iv__10 := u(x, 0) = f(x, `+`(`-`(`*`(`/`(1, 2), `*`(a))), `-`(`*`(`/`(1, 2), `*`(b))))), u(a, t) = u(b, t), diff(u(a, t), a) = diff(u(b, t), b); -1
 

> `assuming`([pdsolve([pde__10, iv__10], u(x, t))], [`<`(a, b)]);
 

(18)


Similar problem involving an arbitrary function in the initial conditions

> pde__11 := diff(upsilon(xi, t), t) = `*`(k, `*`(diff(upsilon(xi, t), xi, xi))); -1
 

> iv__11 := (D[1](upsilon))(a, t) = 0, upsilon(`+`(l, a), t) = 0, upsilon(xi, 0) = f(xi, a); -1
 

> `assuming`([pdsolve([pde__11, iv__11], upsilon(xi, t))], [`<`(0, a), `<`(0, l)]);
 

(19)
 

 

Some simple, however tricky problems with nonlinear boundary conditions

> pde__12 := `+`(`-`(diff(u(r, t), r, r))); -1
 

> iv__12 := `+`((D[1](u))(0, t), `*`((D[1](u))(0, t), `*`(u(0, t)))) = 0; -1
 

> pdsolve([pde__12, iv__12]);
 

(20)
 

 

Problems with more than one evaluation point for the same variable, periodic, or involving piecewise initial conditions

> pde__13 := diff(upsilon(xi, y, t), t, t) = `+`(diff(upsilon(xi, y, t), xi, xi), diff(upsilon(xi, y, t), y, y)); -1
 

> iv__13 := upsilon(`+`(`*`(`/`(1, 3), `*`(Pi))), y, t) = 0, upsilon(`+`(`*`(`/`(4, 3), `*`(Pi))), y, t) = 0, upsilon(xi, 0, t) = 0, upsilon(xi, Pi, t) = 0, (D[3](upsilon))(xi, y, 0) = 0, upsilon(xi, y,...
 

> pdsolve([pde__13, iv__13]);
 

(21)
 

> pde__14 := `+`(diff(u(x, t), t, t), `*`(`/`(4, 3), `*`(Pi, `*`(diff(u(x, t), t))))) = `+`(`*`(16, `*`(diff(u(x, t), x, x)))); -1
 

> iv__14 := u(0, t) = 0, (D[1](u))(3, t) = 0, (D[2](u))(x, 0) = 0, u(x, 0) = piecewise(`and`(`<=`(0, x), `<=`(x, 1)), `+`(`*`(`/`(1, 10), `*`(x))), `and`(`<`(1, x), `<=`(x, 3)), `/`(1, 10)); -1
 

> pdsolve([pde__14, iv__14]);


(22)

Mellin and Hankel transform solutions for PDE with Boundary Conditions

In previous Maple releases, the Fourier and Laplace transforms were used to compute exact solutions to PDE problems with boundary conditions. Now, Mellin and Hankel transforms are also used for that same purpose.

Examples: 

> restart; 1
 

> pde__1 := `+`(`*`(`^`(x, 2), `*`(diff(u(x, y), x, x))), `*`(x, `*`(diff(u(x, y), x))), diff(u(x, y), y, y)) = 0; -1iv__1 := u(x, 0) = 0, u(x, 1) = piecewise(`and`(`<=`(0, x), `<`(x, 1)), 1, `<`(1, x), 0); -1
 

> sol := pdsolve([pde__1, iv__1]);
 

Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mi( (23)
 


As usual, you can let pdsolve choose the solving method, or indicate the method yourself:
 

> pde__2 := `+`(diff(u(r, t), r, r), `/`(`*`(diff(u(r, t), r)), `*`(r)), diff(u(r, t), t, t)) = `+`(`-`(`*`(Q__0, `*`(q(r))))); -1iv__2 := u(r, 0) = 0; -1
 

> pdsolve([pde__2, iv__2]);
 

Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mi( (24)
 

It is sometimes preferable to see these solutions in terms of more familiar integrals. For that purpose, use 

> convert(u(r, t) = `*`(Q__0, `*`(`+`(`-`(hankel(`/`(`*`(exp(`+`(`-`(`*`(s, `*`(t))))), `*`(hankel(q(r), r, s, 0))), `*`(`^`(s, 2))), s, r, 0)), hankel(`/`(`*`(hankel(q(r), r, s, 0)), `*`(`^`(s, 2))), s...
 

Typesetting:-mprintslash([u(r, t) = `*`(Q__0, `*`(`+`(`-`(Int(`/`(`*`(exp(`+`(`-`(`*`(s, `*`(t))))), `*`(Int(`*`(q(r), `*`(r, `*`(BesselJ(0, `*`(r, `*`(s)))))), r = 0 .. infinity), `*`(BesselJ(0, `*`(... (25)
 

An example where the hankel transform is computed: 

> pde__3 := `*`(`^`(c, 2), `*`(`+`(diff(u(r, t), r, r), `/`(`*`(diff(u(r, t), r)), `*`(r))))) = diff(u(r, t), t, t); -1iv__3 := u(r, 0) = `/`(`*`(A, `*`(a)), `*`(`^`(`+`(`*`(`^`(a, 2)), `*`(`^`(r, 2))), `/`(1, 2)))), (D[2](u))(r, 0) = 0; -1
 

> `assuming`([pdsolve([pde__3, iv__3], method = Hankel)], [`>`(r, 0), `>`(t, 0), `>`(a, 0)]);
 

u(r, t) = `+`(`/`(`*`(`/`(1, 2), `*`(A, `*`(a, `*`(`+`(`*`(`^`(`+`(`-`(`*`(`^`(c, 2), `*`(`^`(t, 2)))), `*`(`*`(2, `*`(I)), `*`(a, `*`(c, `*`(t)))), `*`(`^`(a, 2)), `*`(`^`(r, 2))), `/`(1, 2))), `*`(`... (26)
 

A general solution to a PDE calculated via rewriting the PDE as an ODE with arbitrary auxiliary functions

Under certain conditions, it is possible to rewrite a PDE as an ODE for one unknown and some auxiliary arbitrary functions. When that is possible, the solving process involves as many steps as there are independent variables in the PDE. Each step consists of solving only a single intermediate ODE (and no PDEs). In this way, a general solution is obtained for the original PDE.

Below are four examples, all of them nonlinear. For the `^`(4, th); one the solving method is shown step by step. 

Example 1: 

> restart; 1
 

> pde__1 := `+`(diff(w(t, x), t, x), `-`(`/`(`*`(a, `*`(`^`(diff(w(t, x), x), 2))), `*`(w(t, x)))), `-`(`*`(`+`(`/`(`*`(diff(w(t, x), t)), `*`(w(t, x))), b, `/`(`*`(c), `*`(w(t, x)))), `*`(diff(w(t, x),...
pde__1 := `+`(diff(w(t, x), t, x), `-`(`/`(`*`(a, `*`(`^`(diff(w(t, x), x), 2))), `*`(w(t, x)))), `-`(`*`(`+`(`/`(`*`(diff(w(t, x), t)), `*`(w(t, x))), b, `/`(`*`(c), `*`(w(t, x)))), `*`(diff(w(t, x),...
 

> pdsolve(pde__1); 1
 

Typesetting:-mprintslash([w(t, x) = `*`(`+`(Int(`+`(`-`(`/`(`*`(`/`(1, 2), `*`(c, `*`(exp(`+`(`*`(2, `*`(k, `*`(Int(`/`(`*`(`+`(`*`(_F1(x), `*`(`^`(`+`(`-`(`*`(4, `*`(a, `*`(k)))), `*`(`^`(b, 2))), `/...
Typesetting:-mprintslash([w(t, x) = `*`(`+`(Int(`+`(`-`(`/`(`*`(`/`(1, 2), `*`(c, `*`(exp(`+`(`*`(2, `*`(k, `*`(Int(`/`(`*`(`+`(`*`(_F1(x), `*`(`^`(`+`(`-`(`*`(4, `*`(a, `*`(k)))), `*`(`^`(b, 2))), `/...
(27)
 

Example 2: 

> pde__2 := `+`(`*`(`^`(w(t, x), 3), `*`(diff(w(t, x), t, t, x, x))), `-`(`*`(2, `*`(`^`(w(t, x), 2), `*`(`+`(`*`(diff(w(t, x), t), `*`(diff(w(t, x), t, x, x))), `*`(diff(w(t, x), x), `*`(diff(w(t, x), ...
pde__2 := `+`(`*`(`^`(w(t, x), 3), `*`(diff(w(t, x), t, t, x, x))), `-`(`*`(2, `*`(`^`(w(t, x), 2), `*`(`+`(`*`(diff(w(t, x), t), `*`(diff(w(t, x), t, x, x))), `*`(diff(w(t, x), x), `*`(diff(w(t, x), ...
pde__2 := `+`(`*`(`^`(w(t, x), 3), `*`(diff(w(t, x), t, t, x, x))), `-`(`*`(2, `*`(`^`(w(t, x), 2), `*`(`+`(`*`(diff(w(t, x), t), `*`(diff(w(t, x), t, x, x))), `*`(diff(w(t, x), x), `*`(diff(w(t, x), ...
 

> pdsolve(pde__2); 1
 

w(t, x) = `*`(_F4(t), `*`(exp(`+`(`*`(_F1(x), `*`(t)), `-`(_F2(x)), `-`(`*`(_F3(t), `*`(x))))))) (28)
 

Example 3: 

> pde__3 := `+`(`*`(4, `*`(diff(y(x, t), t, t, t, x, x), `*`(diff(y(x, t), t)))), `*`(6, `*`(diff(y(x, t), t, t, x, x), `*`(diff(y(x, t), t, t)))), `*`(4, `*`(diff(y(x, t), t, x, x), `*`(diff(y(x, t), t...
pde__3 := `+`(`*`(4, `*`(diff(y(x, t), t, t, t, x, x), `*`(diff(y(x, t), t)))), `*`(6, `*`(diff(y(x, t), t, t, x, x), `*`(diff(y(x, t), t, t)))), `*`(4, `*`(diff(y(x, t), t, x, x), `*`(diff(y(x, t), t...
 

> pdsolve(pde__3); 1
 

y(x, t) = RootOf(`+`(`*`(_F1(x), `*`(`^`(t, 3))), `-`(`*`(6, `*`(_F2(x), `*`(`^`(t, 2))))), `-`(`*`(6, `*`(_F3(x), `*`(t)))), `*`(6, `*`(_F5(t), `*`(x))), `*`(3, `*`(`^`(_Z, 2))), `-`(`*`(6, `*`(_F4(x... (29)
 

Example 4 

> pde__4 := `+`(`/`(`*`(diff(E(t, x, z), t, x, z)), `*`(E(t, x, z))), `-`(`/`(`*`(diff(E(t, x, z), x, z), `*`(diff(E(t, x, z), t))), `*`(`^`(E(t, x, z), 2)))), `-`(`/`(`*`(diff(E(t, x, z), t, x), `*`(di...
pde__4 := `+`(`/`(`*`(diff(E(t, x, z), t, x, z)), `*`(E(t, x, z))), `-`(`/`(`*`(diff(E(t, x, z), x, z), `*`(diff(E(t, x, z), t))), `*`(`^`(E(t, x, z), 2)))), `-`(`/`(`*`(diff(E(t, x, z), t, x), `*`(di...
 

Step-by-step solving process for pde__4;

Step 1. pde__4; can be written as an ODE with respect to t by taking the derivatives of E(t, x, z); with respect to x and z as auxiliary arbitrary functions of t according to 

> auxiliary_functions := [A__x(t) = diff(E(t, x, z), x), A__z(t) = diff(E(t, x, z), z), A__xz(t) = diff(E(t, x, z), x, z), E__0(t) = E(t, x, z)]; -1


The resulting ODE is 

> ODE__t := `+`(`/`(`*`(diff(A__xz(t), t)), `*`(E__0(t))), `-`(`/`(`*`(A__xz(t), `*`(diff(E__0(t), t))), `*`(`^`(E__0(t), 2)))), `-`(`/`(`*`(diff(A__x(t), t), `*`(A__z(t))), `*`(`^`(E__0(t), 2)))), `/`(...
 

Despite the presence of the auxiliary arbitrary functions A__x(t); , A__z(t); and A__xz(t); , the problem is in reach of dsolve's algorithms, so solve this ODE__t; for E__0(t);  

> dsolve(ODE__t, E__0(t));
 

E__0(t) = `+`(`-`(`/`(`*`(`/`(1, 2), `*`(`+`(A__xz(t), `-`(`*`(`^`(`+`(`*`(`^`(A__xz(t), 2)), `*`(4, `*`(_C1, `*`(A__x(t), `*`(A__z(t)))))), `/`(1, 2))))))), `*`(_C1)))), E__0(t) = `+`(`-`(`/`(`*`(`/`... (30)
 

The solution above reduced the order of the original problem pde__4; by one. Depending on the problem, more than one reduction of order may occur.

Step 2. We need to express the integration constant with respect to t in the context of a problem in t, x, and z, that is, _C1 is an arbitrary function of x and z. For illustration purposes take for instance the first solution 

> _C1 = solve((E__0(t) = `+`(`-`(`/`(`*`(`/`(1, 2), `*`(`+`(A__xz(t), `-`(`*`(`^`(`+`(`*`(`^`(A__xz(t), 2)), `*`(4, `*`(_C1, `*`(A__x(t), `*`(A__z(t)))))), `/`(1, 2))))))), `*`(_C1)))), E__0(t) = `+`(`-...
 

_C1 = `+`(`-`(`/`(`*`(`+`(`*`(A__xz(t), `*`(E__0(t))), `-`(`*`(A__x(t), `*`(A__z(t)))))), `*`(`^`(E__0(t), 2))))) (31)
 

 

> subs(_C1 = _F1(x, t), _C1 = `+`(`-`(`/`(`*`(`+`(`*`(A__xz(t), `*`(E__0(t))), `-`(`*`(A__x(t), `*`(A__z(t)))))), `*`(`^`(E__0(t), 2))))));
 

_F1(x, t) = `+`(`-`(`/`(`*`(`+`(`*`(A__xz(t), `*`(E__0(t))), `-`(`*`(A__x(t), `*`(A__z(t)))))), `*`(`^`(E__0(t), 2))))) (32)
 

Restoring the original functions, we get 

> subs(auxiliary_functions, _F1(x, t) = `+`(`-`(`/`(`*`(`+`(`*`(A__xz(t), `*`(E__0(t))), `-`(`*`(A__x(t), `*`(A__z(t)))))), `*`(`^`(E__0(t), 2))))));
 

Typesetting:-mprintslash([_F1(x, t) = `+`(`-`(`/`(`*`(`+`(`*`(diff(E(t, x, z), x, z), `*`(E(t, x, z))), `-`(`*`(diff(E(t, x, z), x), `*`(diff(E(t, x, z), z)))))), `*`(`^`(E(t, x, z), 2)))))], [_F1(x, ... (33)
 

This pde in t, x, and z can now be written in terms of two auxiliary functions just of x as 

> auxiliary_functions := [A__z(x) = diff(E(t, x, z), z), E__0(x) = E(t, x, z)]; -1
 

Resulting in 

> ODE__x := _F1(x, z) = `+`(`-`(`/`(`*`(`+`(`*`(diff(A__z(x), x), `*`(E__0(x))), `-`(`*`(diff(E__0(x), x), `*`(A__z(x)))))), `*`(`^`(E__0(x), 2)))));
 

Typesetting:-mprintslash([ODE__x := _F1(x, z) = `+`(`-`(`/`(`*`(`+`(`*`(diff(A__z(x), x), `*`(E__0(x))), `-`(`*`(diff(E__0(x), x), `*`(A__z(x)))))), `*`(`^`(E__0(x), 2)))))], [_F1(x, z) = `+`(`-`(`/`(... (34)
 

Solve this ODE 

> dsolve(ODE__x, E__0(x));
 

Typesetting:-mprintslash([E__0(x) = `/`(`*`(A__z(x)), `*`(`+`(Int(`+`(`-`(_F1(x, z))), x), _C1)))], [E__0(x) = `/`(`*`(A__z(x)), `*`(`+`(Int(`+`(`-`(_F1(x, z))), x), _C1)))]) (35)
 

Step 3. Proceed as in the previous step, isolating _C1 , rewriting it as an arbitrary function of z and t and restoring the original functions 

> _C1 = solve(E__0(x) = `/`(`*`(A__z(x)), `*`(`+`(Int(`+`(`-`(_F1(x, z))), x), _C1))), _C1); 1
 

Typesetting:-mprintslash([_C1 = `+`(`-`(`/`(`*`(`+`(`*`(E__0(x), `*`(Int(`+`(`-`(_F1(x, z))), x))), `-`(A__z(x)))), `*`(E__0(x)))))], [_C1 = `+`(`-`(`/`(`*`(`+`(`*`(E__0(x), `*`(Int(`+`(`-`(_F1(x, z))... (36)
 

 

> subs(_C1 = _F2(t, z), _C1 = `+`(`-`(`/`(`*`(`+`(`*`(E__0(x), `*`(Int(`+`(`-`(_F1(x, z))), x))), `-`(A__z(x)))), `*`(E__0(x))))));
 

Typesetting:-mprintslash([_F2(t, z) = `+`(`-`(`/`(`*`(`+`(`*`(E__0(x), `*`(Int(`+`(`-`(_F1(x, z))), x))), `-`(A__z(x)))), `*`(E__0(x)))))], [_F2(t, z) = `+`(`-`(`/`(`*`(`+`(`*`(E__0(x), `*`(Int(`+`(`-... (37)
 

Although not necessary, a simplification is possible in that the integral of an arbitrary function is also an arbitrary function, so we can remove the integration by redefining proc (_F1) options operator, arrow; D[1](_F1) end proc;  

> eval(_F2(t, z) = `+`(`-`(`/`(`*`(`+`(`*`(E__0(x), `*`(Int(`+`(`-`(_F1(x, z))), x))), `-`(A__z(x)))), `*`(E__0(x))))), [Int = int, _F1 = D[1](_F1)]);
 

_F2(t, z) = `+`(`-`(`/`(`*`(`+`(`-`(`*`(E__0(x), `*`(_F1(x, z)))), `-`(A__z(x)))), `*`(E__0(x))))) (38)
 

Restore the original variables 

> subs(auxiliary_functions, _F2(t, z) = `+`(`-`(`/`(`*`(`+`(`-`(`*`(E__0(x), `*`(_F1(x, z)))), `-`(A__z(x)))), `*`(E__0(x))))));
 

Typesetting:-mprintslash([_F2(t, z) = `+`(`-`(`/`(`*`(`+`(`-`(`*`(E(t, x, z), `*`(_F1(x, z)))), `-`(diff(E(t, x, z), z)))), `*`(E(t, x, z)))))], [_F2(t, z) = `+`(`-`(`/`(`*`(`+`(`-`(`*`(E(t, x, z), `*... (39)
 

 

This resulting pde is already an ODE in disguise, from where the general solution to the original problem pde__4; is 

> pdsolve(_F2(t, z) = `+`(`-`(`/`(`*`(`+`(`-`(`*`(E(t, x, z), `*`(_F1(x, z)))), `-`(diff(E(t, x, z), z)))), `*`(E(t, x, z))))));
 

Typesetting:-mprintslash([E(t, x, z) = `*`(_F3(t, x), `*`(exp(Int(`+`(_F2(t, z), `-`(_F1(x, z))), z))))], [E(t, x, z) = `*`(_F3(t, x), `*`(exp(Int(`+`(_F2(t, z), `-`(_F1(x, z))), z))))]) (40)
 

This solution can be simplified further by redefining proc (_F2) options operator, arrow; D[2](_F2) end proc; and proc (_F1) options operator, arrow; D[2](_F1) end proc;  

> eval(E(t, x, z) = `*`(_F3(t, x), `*`(exp(Int(`+`(_F2(t, z), `-`(_F1(x, z))), z)))), [Int = int, _F2 = D[2](_F2), _F1 = D[2](_F1)]);
 

E(t, x, z) = `*`(_F3(t, x), `*`(exp(`+`(_F2(t, z), `-`(_F1(x, z)))))) (41)
 

Verify this solution with the original pde__4;  

> pdetest(E(t, x, z) = `*`(_F3(t, x), `*`(exp(Int(`+`(_F2(t, z), `-`(_F1(x, z))), z)))), pde__4);
 

0 (42)
 

Doing all these steps in one go 

> pdsolve(pde__4);
 

E(t, x, z) = `*`(_F3(t, x), `*`(exp(`+`(_F2(t, z), `-`(_F1(x, z)))))) (43)
 

Solving a PDE by making use of first integrals

Any PDE can be solved iterating the two steps below related to its first integrals, when they can be computed.

Step 1: Write the differential equation for a first integral - a function Phi; of the PDE's jet space - by equating to 0 its total derivative with respect to (any) one of the independent variables of the original problem. The resulting PDE is of first order and can be tackled using the characteristic strip method. 

Step 2: When the PDE for Phi; can be solved, the solution is an arbitrary function of the differential invariants of the PDE for Phi; .  Equate one such differential invariant to an arbitrary function of the remaining independent variables of the problem, resulting in a pde of reduced order with respect to the original PDE problem, a first integral. At this point one can either repeat the process to calculate more first integrals in order to attempt an algebraic elimination (multiple reduction of order) or move again to Step 1 with the reduced order PDE. 

Examples

> restart; 1

> with(PDEtools); -1

> pde__1 := diff(`+`(u(x, y), `-`(diff(u(x, y), y))), x);
 

Typesetting:-mprintslash([pde__1 := `+`(diff(u(x, y), x), `-`(diff(u(x, y), x, y)))], [`+`(diff(u(x, y), x), `-`(diff(diff(u(x, y), x), y)))]) (44)
 

> FirstIntegralSolver(pde__1, u(x, y)); 1
 

Typesetting:-mprintslash([u(x, y) = `*`(`+`(Int(`*`(_F1(y), `*`(exp(`+`(`-`(y))))), y), _F2(x)), `*`(exp(y)))], [u(x, y) = `*`(`+`(Int(`*`(_F1(y), `*`(exp(`+`(`-`(y))))), y), _F2(x)), `*`(exp(y)))]) (45)
 

> pdetest(u(x, y) = `*`(`+`(Int(`*`(_F1(y), `*`(exp(`+`(`-`(y))))), y), _F2(x)), `*`(exp(y))), `+`(diff(u(x, y), x), `-`(diff(diff(u(x, y), x), y))));
 

0 (46)
 

The solving process step-by-step 

Construct an expression for the first integral Phi(Q); , where Q = (x, y, u, u[x], u[y]); , the jet space of pde__1;

> Q := x, y, u, u[x], u[y];

Typesetting:-mprintslash([Q := x, y, u, u[x], u[y]], [x, y, u, u[x], u[y]]) (47)
 

> declare(Phi(Q));
 

`*`(` Phi`(x, y, u, u[x], u[y]), `*`(`will now be displayed as`, `*`(Phi))) (48)
 

Take the total derivative of Phi(Q); with respect to x 

> D_Dx(Phi(Q), x, u(x, y)) = 0;
 

Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mi( (49)
 

Take this PDE modulo pde__1; , and that is all the formulation of the problem 

> isolate(ToJet(pde__1, u(x, y)), u[x, y]);
 

u[x, y] = u[x] (50)
 

> `PDE__Φ` := subs(u[x, y] = u[x], `+`(diff(Phi(x, y, u, u[x], u[y]), x), `*`(diff(Phi(x, y, u, u[x], u[y]), u), `*`(u[x])), `*`(diff(Phi(x, y, u, u[x], u[y]), u[x]), `*`(u[x, x])), `*`(diff(Phi(x, ...
 

Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mi( (51)
 

Solve PDE__Phi; , and in doing so, the solution cannot depend on u[x, x]; (it can only depend on . You can achieve that using the ivars option of pdsolve 

> pdsolve(`PDE__Φ`, ivars = u[x, x]);

Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mi( (52)

 

Since Phi; is a first integral, the arguments of the arbitrary function entering this solution are also first integrals. Take the second one, which involves 1st order derivatives, and equate it to an arbitrary function all the independent variables but x (the variable used when taking the total derivative of . In this case, there is only one other variable, y. 

> op([1, 2, 2], {Phi(x, y, u, u[x], u[y]) = _F1(y, `+`(`-`(u), u[y]))}) = _F1(y);
 

`+`(`-`(u), u[y]) = _F1(y) (53)
 

Rewrite this result in function notation 

> FromJet(`+`(`-`(u), u[y]) = _F1(y), u(x, y));
 

Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mo( (54)
 

This result is already an ODE in disguise; solve it to arrive at the general solution of pde__1;  

> pdsolve(`+`(`-`(u(x, y)), diff(u(x, y), y)) = _F1(y));
 

Typesetting:-mprintslash([u(x, y) = `*`(`+`(Int(`*`(_F1(y), `*`(exp(`+`(`-`(y))))), y), _F2(x)), `*`(exp(y)))], [u(x, y) = `*`(`+`(Int(`*`(_F1(y), `*`(exp(`+`(`-`(y))))), y), _F2(x)), `*`(exp(y)))]) (55)
 

 

A more involved example: 

> pde__2 := `+`(`*`(A__1, `*`(diff(w(x__1, x__2, x__3, x__4), x__4, x__1))), `*`(A__2, `*`(diff(w(x__1, x__2, x__3, x__4), x__4, x__2))), `*`(A__3, `*`(diff(w(x__1, x__2, x__3, x__4), x__4, x__3))), A__...
pde__2 := `+`(`*`(A__1, `*`(diff(w(x__1, x__2, x__3, x__4), x__4, x__1))), `*`(A__2, `*`(diff(w(x__1, x__2, x__3, x__4), x__4, x__2))), `*`(A__3, `*`(diff(w(x__1, x__2, x__3, x__4), x__4, x__3))), A__...
pde__2 := `+`(`*`(A__1, `*`(diff(w(x__1, x__2, x__3, x__4), x__4, x__1))), `*`(A__2, `*`(diff(w(x__1, x__2, x__3, x__4), x__4, x__2))), `*`(A__3, `*`(diff(w(x__1, x__2, x__3, x__4), x__4, x__3))), A__...
 

 

> PDEtools:-FirstIntegralSolver(pde__2, w(x__1, x__2, x__3, x__4)); 1
 

Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mi( (56)
 

Verify this solution 

> pdetest(w(x__1, x__2, x__3, x__4) = `+`(`-`(`*`(`/`(1, 2), `*`(`+`(Intat(`/`(`*`(exp(`/`(`*`(A__5, `*`(_a)), `*`(A__1))), `*`(`+`(`*`(2, `*`(A__3, `*`(A__4, `*`(A__8)))), `*`(A__3, `*`(A__7)), `*`(tan...

0 (57)


PDE parameterized symmetries

The determination of symmetries for partial differential equation systems (PDE) is relevant in several contexts, the most obvious of which is of course the determination of the PDE solutions. For instance, generally speaking, the knowledge of a N-dimensional Lie symmetry group can be used to reduce the number of independent variables of PDE by N. So if PDE depends only on N independent variables, that amounts to completely solving it. If only N-1 symmetries are known or can be successfully used then PDE becomes an ODE; and so on. In Maple, a complete set of symmetry commands, to perform each step of the symmetry approach or several of them in one go, are part of the PDEtools package.

Besides the dependent and independent variables, PDE frequently depends on some constant parameters. One can compute the PDE symmetries for arbitrary values of those parameters, but for some particular values PDE may transform into a different problem, admitting different symmetries. The question then is: how can you determine those particular values of the parameters and the corresponding different symmetries?

In connection, in Maple 2020, the computation of parameterized symmetries, whether the parameters are taken as continuous or not, can be done automatically. In what follows, first the problems and the solving approach are presented, then it is shown how they can be tackled in one go using Infinitesimals and DeterminingPDE and their new options for handling parameterized symmetries.

Consider the family of Korteweg-de Vries equations for u(x, t); involving three constant parameters a, b, q; . For convenience (simpler input and more readable output) use the diff_table and declare commands: 

> restart; 1

> with(PDEtools); -1

> U := diff_table(u(x, t)); -1

> pde__1 := `+`(`*`(b, `*`(U[], `*`(U[x]))), `*`(a, `*`(U[x])), `*`(q, `*`(U[x, x, x])), U[t]) = 0;
 

Typesetting:-mprintslash([pde__1 := `+`(`*`(b, `*`(u(x, t), `*`(diff(u(x, t), x)))), `*`(a, `*`(diff(u(x, t), x))), `*`(q, `*`(diff(u(x, t), `$`(x, 3)))), diff(u(x, t), t)) = 0], [`+`(`*`(b, `*`(u(x, ... (58)
 

> declare(U[]);
 

`*`(` u`(x, t), `*`(`will now be displayed as`, `*`(u))) (59)
 

This pde__12; admits a 4-dimensional symmetry group, whose infinitesimals - for arbitrary values of the parameters a, b, q; - are given by 

> I__1 := Infinitesimals(pde__1, [u], specialize_Cn = false);
 

Typesetting:-mprintslash([I__1 := [_xi[x](x, t, u) = `+`(`*`(`/`(1, 3), `*`(_C1, `*`(x))), `*`(_C3, `*`(t)), _C4), _xi[t](x, t, u) = `+`(`*`(_C1, `*`(t)), _C2), _eta[u](x, t, u) = `+`(`/`(`*`(`/`(1, 3... (60)
 

Looking at pde__1; as a nonlinear problem in u, a, b and q, it splits into four cases for some particular values of the parameters:

> pde__cases := casesplit(pde__1, parameters = {a, b, q}, caseplot);

 

`========= Pivots Legend =========`
p1 = q
Typesetting:-mrow(Typesetting:-mi(
p3 = b
Plot_2d
Typesetting:-mprintslash([pde__cases := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mcomplete(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([pde__cases := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mcomplete(Typesetting:-msub(Typesetting:-mi(
(61)
 

The legend above indicates the pivots and the tree of cases, depending on whether each pivot is equal or different from 0, followed by the algebraic sequence of cases.

The first case is the general case, for which the symmetry infinitesimals were computed in (60) I__1; , but clearly the other three cases admit more general symmetries. Consider for instance the second case, use ignoreparameterizingequations; to ignore the parameterizing equation q = 0; when computing the determining PDE for the infinitesimals, and you get 

> I__2 := Infinitesimals(pde__cases[2], ignore); 1

 

`* Partial match of  'ignore' against keyword 'ignoreparameterizingequations'`
Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
(62)
 

These infinitesimals are clearly more general than I__1; , in fact so general that (62) is almost unreadable. Specialize the three arbitrary functions into something "easy" just to be able to follow - e.g. take _F1 to be the + operator, _F2 = *, and _F3 = 1; -1 

> eval(I__2, [_F1 = `+`, _F2 = `*`, _F3 = 1]);
 

Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( (63)
 

> simplify(value([_xi[x](x, t, u) = 1, _xi[t](x, t, u) = `+`(Intat(`+`(`-`(`/`(`*`(`+`(u, `/`(`*`(`+`(`*`(`+`(`*`(b, `*`(u)), a), `*`(t)), `-`(x))), `*`(`+`(`*`(b, `*`(u)), a)))), `*`(b)), `*`(`^`(`+`(`...
 

[_xi[x](x, t, u) = 1, _xi[t](x, t, u) = `/`(`*`(`+`(`*`(`^`(b, 3), `*`(t, `*`(`^`(u, 4)))), `*`(`+`(`*`(`+`(`*`(3, `*`(a, `*`(t))), `-`(x)), `*`(`^`(u, 3))), `-`(`*`(`^`(u, 2), `*`(x))), `-`(`*`(t, `*...
[_xi[x](x, t, u) = 1, _xi[t](x, t, u) = `/`(`*`(`+`(`*`(`^`(b, 3), `*`(t, `*`(`^`(u, 4)))), `*`(`+`(`*`(`+`(`*`(3, `*`(a, `*`(t))), `-`(x)), `*`(`^`(u, 3))), `-`(`*`(`^`(u, 2), `*`(x))), `-`(`*`(t, `*...
(64)
 

As expected, these infinitesimals are different than the ones computed for the general case in (60).

The symmetry (64) can be verified against pde__cases[2]; or directly against pde after substituting q = 0; . 

> SymmetryTest([_xi[x](x, t, u) = 1, _xi[t](x, t, u) = `/`(`*`(`+`(`*`(`^`(b, 3), `*`(t, `*`(`^`(u, 4)))), `*`(`+`(`*`(`+`(`*`(3, `*`(a, `*`(t))), `-`(x)), `*`(`^`(u, 3))), `-`(`*`(`^`(u, 2), `*`(x))), ...
 

`* Partial match of  'ignore' against keyword 'ignoreparameterizingequations'`
{0} (65)

> SymmetryTest([_xi[x](x, t, u) = 1, _xi[t](x, t, u) = `/`(`*`(`+`(`*`(`^`(b, 3), `*`(t, `*`(`^`(u, 4)))), `*`(`+`(`*`(`+`(`*`(3, `*`(a, `*`(t))), `-`(x)), `*`(`^`(u, 3))), `-`(`*`(`^`(u, 2), `*`(x))), ...
 

{0} (66)
 

New in Maple 2020, the computation of symmetries parameterized by a, b and q, derived step-by-step in (62), can now be performed in one go by indicating the parameters (regarding the option continuousparameters = false; , see the next section) 

> I__2 := Infinitesimals(pde__1, [u], specialize_Cn = false, parameters = {a, b, q}, continuousparameters = false);
 

Typesetting:-mprintslash([I__2 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__2 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__2 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__2 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__2 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
(67)
 

In this result, the second list is the one obtained step-by-step in (62). 

Parameter-continuous symmetry transformations

A different, however closely related question, is whether pde admits "symmetries with respect to the parameters a, b and q", so whether there exist continuous transformations of the parameters a, b and q that leave pde invariant in form.

Note that since the parameters are constants with regards to the dependent and independent variables (in this example u(x, t); ), such continuous symmetry transformations cannot be used directly to compute a solution for pde. They can, however, be used to reduce the number of parameters. And in some contexts, that is exactly what we need, for example to entirely remove the splitting into cases due to their presence, or to apply a solving method that is valid only when there are no parameters (frequently the case when computing exact solutions to PDEs with boundary conditions).

In connection, in Maple 2020, the computation of the infinitesimals that lead to parameter continuous symmetry transformations, is now automatic when you request that. As in the previous section, first the problem is presented and at the end of the section the new functionality is illustrated solving the problem in one go.

To compute such "continuous symmetry transformations of the parameters" that leave pde invariant, one can always think of these parameters as "additional independent variables of pde". In terms of formulation, that amounts to replacing the dependency in the dependent variables, in this example replacing u(x, t); by  

> pde__1;
 

Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mi( (68)
 

> pde__xtabq := subs((x, t) = (x, t, a, b, q), pde__1);
 

Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mi( (69)
 

Compute the infinitesimals for `#mi(, for readability, avoid displaying the redundant functionality x, t, a, b, q, u; on the left-hand sides 

> Infinitesimals(pde__xtabq, displayfunctionality = false);
 

[_xi[x] = `+`(`/`(`*`(`/`(1, 3), `*`(`+`(`*`(_F4(a, b, q), `*`(q)), _F3(a, b, q)), `*`(x))), `*`(q)), `*`(_F6(a, b, q), `*`(t)), _F7(a, b, q)), _xi[t] = `+`(`*`(_F4(a, b, q), `*`(t)), _F5(a, b, q)), _...
[_xi[x] = `+`(`/`(`*`(`/`(1, 3), `*`(`+`(`*`(_F4(a, b, q), `*`(q)), _F3(a, b, q)), `*`(x))), `*`(q)), `*`(_F6(a, b, q), `*`(t)), _F7(a, b, q)), _xi[t] = `+`(`*`(_F4(a, b, q), `*`(t)), _F5(a, b, q)), _...
[_xi[x] = `+`(`/`(`*`(`/`(1, 3), `*`(`+`(`*`(_F4(a, b, q), `*`(q)), _F3(a, b, q)), `*`(x))), `*`(q)), `*`(_F6(a, b, q), `*`(t)), _F7(a, b, q)), _xi[t] = `+`(`*`(_F4(a, b, q), `*`(t)), _F5(a, b, q)), _...
(70)
 

Comparing with (60), this list of infinitesimals includes three additional ones, related to continuous transformations of and q; . This result is more general than what is convenient for algebraic manipulations, so specialize the seven arbitrary functions of a, b, q; and keep only the first symmetry that results from this specialization: that suffices to illustrate the removal of any of the three parameters a, b, and q 

> S := Library:-Specialize_Fn([_xi[x] = `+`(`/`(`*`(`/`(1, 3), `*`(`+`(`*`(_F4(a, b, q), `*`(q)), _F3(a, b, q)), `*`(x))), `*`(q)), `*`(_F6(a, b, q), `*`(t)), _F7(a, b, q)), _xi[t] = `+`(`*`(_F4(a, b, q...
 

Typesetting:-mprintslash([S := [_xi[x] = 0, _xi[t] = 0, _xi[a] = 1, _xi[b] = 0, _xi[q] = 0, _eta[u] = `+`(`-`(`/`(1, `*`(b))))]], [[_xi[x] = 0, _xi[t] = 0, _xi[a] = 1, _xi[b] = 0, _xi[q] = 0, _eta[u] ... (71)
 

To remove the parameters, as is standard in the symmetry approach, compute a transformation to canonical coordinates, with respect to the parameter a. That means a transformation that changes the list of infinitesimals, or likewise its infinitesimal generator representation, 

> InfinitesimalGenerator(S, [u(x, t, a, b, q)]);
 

proc (f) options operator, arrow; `+`(diff(f, a), `-`(`/`(`*`(diff(f, u)), `*`(b)))) end proc (72)
 

into [_xi[x] = 0, _xi[t] = 0, _xi[a] = 1, _xi[b] = 0, _xi[q] = 0, _eta[u] = 0]; , or its equivalent generator representation  proc (f) options operator, arrow; diff(f, a) end proc; . That same transformation, when applied to pde__xtabq; , entirely removes the parameter a. 

 

The transformation is computed using CanonicalCoordinates and the last argument indicates the "independent variable" (in our case a parameter) that the transformation should remove. We choose to remove the parameter a: 

> CanonicalCoordinates(S, [u(x, t, a, b, q)], [upsilon(xi, tau, alpha, beta, chi)], a);
 

Typesetting:-mprintslash([{alpha = a, beta = b, chi = q, tau = t, xi = x, upsilon(xi, tau, alpha, beta, chi) = `/`(`*`(`+`(`*`(b, `*`(u(x, t, a, b, q))), a)), `*`(b))}], [{alpha = a, beta = b, chi = q... (73)
 

> declare({alpha = a, beta = b, chi = q, tau = t, xi = x, upsilon(xi, tau, alpha, beta, chi) = `/`(`*`(`+`(`*`(b, `*`(u(x, t, a, b, q))), a)), `*`(b))});
 

`*`(` u`(x, t, a, b, q), `*`(`will now be displayed as`, `*`(u)))
`*`(` upsilon`(xi, tau, alpha, beta, chi), `*`(`will now be displayed as`, `*`(upsilon))) (74)
 

Invert this transformation in order to apply it 

> solve({alpha = a, beta = b, chi = q, tau = t, xi = x, upsilon(xi, tau, alpha, beta, chi) = `/`(`*`(`+`(`*`(b, `*`(u(x, t, a, b, q))), a)), `*`(b))}, {a, b, q, t, x, u(x, t, a, b, q)});
 

Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mi( (75)
 

The next step is not necessary, but just to understand how all this works, verify the effect of this transformation on the infinitesimal generator proc (f) options operator, arrow; `+`(diff(f, a), `-`(`/`(`*`(diff(f, u)), `*`(b)))) end proc;  

> ChangeSymmetry({a = alpha, b = beta, q = chi, t = tau, x = xi, u(x, t, a, b, q) = `/`(`*`(`+`(`*`(upsilon(xi, tau, alpha, beta, chi), `*`(beta)), `-`(alpha))), `*`(beta))}, proc (f) options operator, ...
 

proc (f) options operator, arrow; diff(f, alpha) end proc (76)
 

Now that we see the transformation (75) is the one we want, use it to change variables in pde__xtabq;  

> PDEtools:-dchange({a = alpha, b = beta, q = chi, t = tau, x = xi, u(x, t, a, b, q) = `/`(`*`(`+`(`*`(upsilon(xi, tau, alpha, beta, chi), `*`(beta)), `-`(alpha))), `*`(beta))}, pde__xtabq, [upsilon(xi,...
 

Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mi( (77)
 

As expected, this result depends only on two parameters, beta; , and chi; , and the one equivalent to a (that is alpha; , see the transformation used (75)), is not present anymore.


To remove b or q we use the same steps, (73), (75) and (77), just changing the parameter to be removed, indicated as the last argument in the call to CanonicalCoordinates. For example, to eliminate b (represented in the new variables by beta; ), input 

> CanonicalCoordinates(S, [u(x, t, a, b, q)], [upsilon(xi, tau, alpha, beta, chi)], b);
 

Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mi( (78)
 

> solve({alpha = b, beta = a, chi = q, tau = t, xi = x, upsilon(xi, tau, alpha, beta, chi) = `/`(`*`(`+`(`*`(b, `*`(u(x, t, a, b, q))), a)), `*`(b))}, {a, b, q, t, x, u(x, t, a, b, q)});
 

Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mi( (79)
 

> PDEtools:-dchange({a = beta, b = alpha, q = chi, t = tau, x = xi, u(x, t, a, b, q) = `/`(`*`(`+`(`*`(upsilon(xi, tau, alpha, beta, chi), `*`(alpha)), `-`(beta))), `*`(alpha))}, pde__xtabq, [upsilon(xi...
 

Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mi( (80)
 

and as expected this result does not contain To remove a second parameter, the whole cycle is repeated starting with computing infinitesimals, for instance for (80). 

 

The computation of continuous transformations of the parameters a, b and q that leave pde invariant in form, done above step-by-step starting at equation (70), useful to remove parameters from the differential equation system, can now be performed in one go by indicating the parameters to Infinitesimals, and that these are to be taken as continuous: 

> I__3 := Infinitesimals(pde__1, [u], specialize_Cn = false, parameters = {a, b, q}, continuousparameters = true);
 

Typesetting:-mprintslash([I__3 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__3 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__3 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__3 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__3 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__3 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__3 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__3 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__3 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
Typesetting:-mprintslash([I__3 := Typesetting:-mcomplete(Typesetting:-mrow(Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi(
(81)
 

In this result, the first infinitesimal is actually that of equation (70).