Coaxing DSolve to produce an implicit solution

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.


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.


Original Answer

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]}} *)

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});

enter image description here

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

DEtools:-remove_RootOf(sol);

enter image description here

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});

enter image description here

Mathematica

You can get the desired result in MMA too.

enter image description here

Now plugin y[x] for #1 enter image description here

-(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