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