# Coaxing DSolve to produce an implicit solution

I try to solve the differential equation

  DSolve[{3*y[x] + 2*x*y[x]^2 + (2*x + 3*x^2*y[x])*y'[x] == 0, y[1] == 1/2}, y[x], x]


This produces some error messages as

DSolve::bvnul: For some branches of the general solution, the given boundary conditions lead to an empty solution.

It also produces:

$$y(x)\to \text{Root}\left[-8 \text{\#1}^5+\frac{40 \text{\#1}^4}{x}-\frac{80 \text{\#1}^3}{x^2}+\text{\#1}^2 \left(\frac{80}{x^3}-\frac{1}{x^2}\right)-\frac{40 \text{\#1}}{x^4}+\frac{8}{x^5}\&,1\right]$$

I know this DEQ is solvable because I did it by hand (see implicit solution: https://math.stackexchange.com/questions/2140226/exact-de-y2xy3dxx3xy2dy-0/2140279#2140279) and verified it using WA.

Is there any way to coax Mathematica to produce that result using DSolve in spite of that nasty IC?

I am using Windows 7, MMA version $11.0.1.0$.

• The solution shown on WA has y(x) in three of the log terms. Are you sure there is a solution for this ODE? – Anjan Kumar Feb 12 '17 at 3:57

# Update

Seems that DSolve is further improved after v11.0, the simplification below is no longer needed now. See Carl's answer for more details.

This is another improvement of DSolve after v9. In v9 DSolve will give the implicit form as the output. Still, it's possible to dig out the implicit solution in v11:

mid = Trace[
DSolve[{3 y[x] + 2 x y[x]^2 + (2 x + 3 x^2 y[x]) y'[x] == 0, y[1] == 1/2}, y[x], x],
Solve[_, y[x]], TraceInternal -> True] // Flatten // Union


It's not hard to find the second to last element of mid is the general implicit solution:

mid[[-2]]

(*
HoldForm[Solve[45 (3 C[1] +
28 RootSum[-28 + 57 7^(1/3) #1 - 28 #1^3 &,
Log[-#1 + (-16 + 21 x y[x])/(2 7^(1/3) (2 + 3 x y[x]))]/(19 7^(1/3) -
28 #1^2) &]) == 2 7^(2/3) Log[x], y[x]]]
*)


Let's simplify it a bit:

generaleq = mid[[-2]][[1, 1]] // ToRadicals // FullSimplify
(* 135 C[1] ==
2 7^(2/3) (Log[3125/108] + Log[x] + 3 Log[1/(-2 - 3 x y[x])] +
2 Log[(x y[x])/(2 + 3 x y[x])] - 5 Log[(-1 + x y[x])/(2 + 3 x y[x])]) *)


And eliminate C[1] with the constraint y[1] == 1/2:

const = Solve[generaleq /. y[x] -> 1/2 /. x -> 1, C[1]][[1]];
eq = generaleq /. const // Simplify
(* -2 I π + Log[8] + 5 Log[(-1 + x y[x])/(2 + 3 x y[x])] ==
Log[x] + 3 Log[1/(-2 - 3 x y[x])] + 2 Log[(x y[x])/(2 + 3 x y[x])] *)


OK, we find the implicit solution.

BTW, despite the warning, the solution given by DSolve in v11 is correct:

Select[Solve[eq, y[x]], y[x] == 1/2 /. # /. x -> 1 &]
(* {{y[x] -> Root[
8/x^5 - (40 #1)/x^4 + (80/x^3 - 1/x^2) #1^2 - (80 #1^3)/x^2 + (40 #1^4)/x - 8 #1^5&,
1]}} *)

• Improvement? Seems like this is a regression. :-) Even in WA, they are able to produce a result and it looks like V9 did that. I am going to have start keeping those older versions around. Thanks! – Moo Feb 12 '17 at 7:00
• @moo A regression for people who just want the implicit solution :) . It would be good if an option or so can be added for DSolve to switch the behavior. – xzczd Feb 12 '17 at 7:06
• That is an excellent idea or maybe it gives the implicit solution without trying to figure out the constant, but tells you that the result branches. Thanks. – Moo Feb 12 '17 at 7:10
• I fail to understand one thing, why we need to do so much to get the same thing, which we can get directly from DSolve? – zhk Feb 12 '17 at 8:33
• @mmm There's no doubt that your response helps :) , it tells us that, though some warning is generated when calculating, the answer outputed by Mathematica is probably correct, given Maple gives the same solution. Actually it's after reading your answer that I noticed I have misundersood the question (I thought OP thinks DSolve missed a solution or so). – xzczd Feb 12 '17 at 9:20

Here is a refinement of @xzczd's Trace idea (originally posted as an answer to question (174383)):

Quiet @ Trace[
DSolve[{3*y[x]+2*x*y[x]^2+(2*x+3*x^2*y[x])*y'[x]==0,y[1]==1/2},y[x],x],
Solve[e_, y[x]] -> (eqn = e),
TraceInternal->True
];
eqn


3 Log[x] + 2 Log[y[x]] - 5 Log[1 - x y[x]] == C[1]

This produces the implicit equation that the OP referenced in his linked question.

• Very clean (+1). – Moo Jun 2 '18 at 15:23
• Seems that DSolve is further improved after my answer is posted. I vaguely remembered that in I only found the complicated equation involving RootSum in 2017.2.12. (Probably in v11.0? ) – xzczd Jun 2 '18 at 15:52

Maple

I tried the same ode in Maple and it also produces the solution in terms of RootOf, the maple routine "a placeholder for representing all the roots of an equation in one variable". But there is also an option which is self explanatory remove_RootOf.

Thus, maple was able to produce an implicit solution to the problem in a much more simplified form.

restart:with(plots):
ode:=3*y(x) + 2*x*y(x)^2 + (2*x + 3*x^2*y(x))*diff(y(x),x)= 0;
sol:=dsolve({ode,y(1)=1/2});


Now to get rid of the RootOf we need to load the package DEtools first,

DEtools:-remove_RootOf(sol);


Now comparing the two different forms of the same solution,

p1:=plot(rhs(sol),x=1..10,color=green,axes=boxed,linestyle=3):
p2:=implicitplot(-8+8*(y)^5*x^5-40*(y)^4*x^4+80*(y)^3*x^3+(x-80)*(y)^2*x^2+40*y*x=0,x=1..10,y=0..1,color=red,axes=boxed,linestyle=1):
display({p1,p2});


Mathematica

You can get the desired result in MMA too.

Now plugin y[x] for #1

-(8/x) + 40 y[x] - 80 x y[x]^2 + x^2 y[x]^2 + 80 x^2 y[x]^3 - 40 x^3 y[x]^4 + 8 x^4 y[x]^5 == 0

• Try in Maple dsolve({ode, y(1) = 1/2}, implicit) no need remove RootOf or with Integrals: dsolve({ode, y(1) = 1/2}, useInt, implicit) – Mariusz Iwaniuk Jun 2 '18 at 15:57