# DSolve takes too much time

I have the following problem:

DSolve[D[l[w1, w2], w1] a w2 - D[l[w1, w2], w2] a w1 ==
l[w1, w2] + w1 + a^2 w2^2, l[w1, w2], {w1, w2}]


I expect DSolve to return a complete polynomial of second degree as a solution to this differential equation. Yet it is taking an awful lot of time to solve this. Why is it?

EDIT

I expect a solution like:

l = a1 w1 + a2 w2 + a11 w1^2 + a12 w1 w2 + a22 w2^2;


Since:

h = D[l, w1] a w2 - D[l, w2] a w1 - l - w1 - a^2 w2^2;
Solve[Table[CoefficientRules[h, {w1, w2}][[i]][[2]] == 0, {i, 1, 3}]]


Outputs:

{{a1 -> -1 - a*a2, a12 -> -(a11/a), a22 -> ((1 + 2*a^2)*a11)/(2*a^2)}, {a -> 0, a1 -> -1, a11 -> 0, a12 -> 0}}


EDIT 2

In the past edit I didn't add the assumption a>0. Indeed the verification turns a trivial solution. I've corrected this, and now we have a real solution with the following code.

Solve[-a11 - a*a12 == 0 &&
2*a*a11 - a12 - 2*a*a22 == 0 && -1 - a1 - a*a2 == 0 &&
a > 0  , {a11, a12, a1, a2, a22}, Reals]

• @Feyre I still expect this equation to be solved by l(w1,w2)=a1 w1+a2 w2+a11 w1^2 +a12 w1 w2 + a22 w2^2. Nov 9, 2016 at 10:20
• Add Assumptions -> a \[Element] Reals. Nov 9, 2016 at 10:21
• @corey979 I've done as you suggested. Apparently it is still running. I previously also attempted a>0 as an assumption. Nov 9, 2016 at 10:26
• @MirkoAveta Apologies, you're correct, I didn't assume dependence. However, as far as I can see, there's no general solution which is unique to a constant, hence DSolve[]'s problems, really your best solution is what you already posted in your edit. Nov 9, 2016 at 10:54
• @MirkoAveta As I just noted in 130857, DSolve produces spurious solutions to the homogeneous part of your PDE. This, in turn, may prevent DSolve from producing a solution to your inhomogeneous PDE. Note that the clever approach given below by xzczd avoids this problem by converting the PDE to an ODE. Nov 10, 2016 at 18:16

Probably because DSolve is looking for a general solution, while a solution like l = a1 w1 + a2 w2 + a11 w1^2 + a12 w1 w2 + a22 w2^2 is far beyond general. For example, with the following code we can find another part of the general solution (The definition of DChange can be found here.):

neweqn = DChange[D[l[w1, w2], w1]*a*w2 - D[l[w1, w2], w2]*a*w1 ==
l[w1, w2] + w1 + a^2*w2^2, l[w1, w2] == L[w1*w2]]

(* (-a)*w1^2*Derivative[1][L][w1*w2] + a*w2^2*Derivative[1][L][w1*w2] ==
w1 + a^2*w2^2 + L[w1*w2] *)

DSolve[neweqn /. w1 -> W/w2, L@W, W] /. {L@W -> l[w1, w2], W -> w1 w2} // Simplify


Notice this solution is still incomplete, it only represents solutions that satisfy $l(w_1,w_2)=L(w_1 w_2)$, yet it's already much more complicated than a polynomial. One can expect the complete solution for the PDE is even more complicated and hard to obtain at least for Mathematica.

Finally, I hate to admit it, but Maple does a better job on this PDE:

pdsolve([diff(l(w1,w2),w1)*a*w2-diff(l(w1,w2),w2)*a*w1 = l(w1,w2)+w1+a^2*w2^2],l(w1,w2))

(* {l(w1,w2) = (Intat(exp(-1/a*arctan(_a/(-_a^2+w1^2+w2^2)^(1/2)))*(-_a^2*a^2+(w1^2+w2^2)*a^2+_a)/a/(-_a^2+w1^2+w2^2)^(1/2),_a = w1)+_F1(w1^2+w2^2))*exp(1/a*arctan(w1/w2))} *)


# Update

Inspired by the form of the general solution given by Maple, I figured out how to obtain it fast with DSolve. We just need to transform to polar coordinate!:

neweqn = Assuming[{r > 0, -Pi < th < Pi},
DChange[D[l[w1, w2], w1] a w2 - D[l[w1, w2], w2] a w1 ==
l[w1, w2] + w1 + a^2 w2^2, {Sqrt[w1^2 + w2^2] == r, th == ArcTan[w1, w2]}, {w1,
w2}, {r, th}, l[w1, w2]]]

(* l[r, th] + r*(Cos[th] + a^2*r*Sin[th]^2) +
a*Derivative[0, 1][l][r, th] == 0 *)

DSolve[neweqn, l[r, th], {r, th}] /. {l[r, th] -> l[w1, w2], r -> Sqrt[w1^2 + w2^2],
th -> ArcTan[w1, w2]} // Simplify

(* {{l[w1, w2] -> (1/(
2 + 10 a^2 +
8 a^4))(4 a^3 (1 + a^2) w1 w2 - (1 + 4 a^2) (2 w1 + (a^2 + a^4) w1^2 +
a w2 (2 + a w2 + a^3 w2)) + a^2 (1 + a^2) (w1^2 + w2^2) Cos[2 ArcTan[w1, w2]]) +
E^(-(ArcTan[w1, w2]/a)) C[1][Sqrt[w1^2 + w2^2]]}} *)


• Maple does a better job on DEs in general, I think. 12000.org/my_notes/kamek/kamke_differential_equations.htm Not so on integrals. Nov 10, 2016 at 12:55
• @Szabolcs I didn't know DSolve has actually made a step backward on ODE solving after the improvement for PDE solving ability in v10.3… (79.7423% -> 74.48%, Oh…) Nov 10, 2016 at 13:16
• Very interesting. Fortunately my goal was to find any solution to this PDE. Yet is there a way to ask DSolve a "first guess" solution to make things quicker? Nov 10, 2016 at 13:49
• @MirkoAveta You mean something like the HINT option of pdsolve in Maple? If so, DSolve owns no such thing as far as I can tell… Nov 10, 2016 at 13:56
Clear[l];


The differential equation is

deqn = D[l[w1, w2], w1] a w2 - D[l[w1, w2], w2] a w1 ==
l[w1, w2] + w1 + a^2 w2^2;


The assumed solution is

aSoln = l -> (a1 #1 + a2 #2 + a11 #1^2 + a12 #1 #2 + a22 #2^2 &);


Substituting the assumed solution into the differential equation

eqn = deqn /. aSoln

(*  a w2 (a1 + 2 a11 w1 + a12 w2) - a w1 (a2 + a12 w1 + 2 a22 w2) ==
w1 + a1 w1 + a11 w1^2 + a2 w2 + a12 w1 w2 + a^2 w2^2 + a22 w2^2  *)


Equating the coefficients on the LHS of eqn with those on the RHS of eqn

coefEqn = Thread[
(CoefficientList[#, {w1, w2}] // Flatten) & /@
eqn]

(*  {True, a a1 == a2, a a12 == a^2 + a22, -a a2 == 1 + a1,
2 a a11 - 2 a a22 == a12, True, -a a12 == a11, True, True}  *)


Solving for the coefficients of the assumed solution

coefSoln = Solve[
coefEqn, {a1, a2, a11, a12, a22},
Reals][[1]] // Simplify

(*  {a1 -> -(1/(1 + a^2)),
a2 -> -(a/(1 + a^2)),
a11 -> -((2*a^4)/(1 + 4*a^2)),
a12 -> (2*a^3)/(1 + 4*a^2),
a22 -> -((a^2 + 2*a^4)/
(1 + 4*a^2))}  *)


Substituting these coefficients into the assumed solution

soln = aSoln /. coefSoln

(*  l -> (-(#1/(1 + a^2)) -
(a*#2)/(1 + a^2) -
((2*a^4)*#1^2)/(1 + 4*a^2) +
((2*a^3)*#1*#2)/(1 + 4*a^2) -
((a^2 + 2*a^4)*#2^2)/
(1 + 4*a^2) & )  *)


Verifying that soln satisfies deqn

deqn /. soln // Simplify

(*  True  *)


So the solution is

l[w1_, w2_] = l[w1, w2] /. soln

(*  -(w1/(1 + a^2)) - (2*a^4*w1^2)/
(1 + 4*a^2) - (a*w2)/(1 + a^2) +
(2*a^3*w1*w2)/(1 + 4*a^2) -
((a^2 + 2*a^4)*w2^2)/(1 + 4*a^2)  *)

• Thanks for answering. You have more or less proceeded in demonstrating that the assumed solution is indeed the right solution. Yet you haven't answered really my question. I've asked why DSolve doesn't do this. Nov 9, 2016 at 18:22