# Solving an ODE and simplifying the result

I'm interested in solving the differential equation $$3 h' + 3 h^2 = c_1,$$ where $c_1$ is a positive real number.

var('t')
var('c1', latex_name=r'c_1')
h = function('h')(t)
eq = -3*h^2 + c1 - 3*diff(h, t)
eq_sol = desolve(eq, h, ivar=t, contrib_ode=True)


The above code works, but it's not solved explicitly for $h$, so

h_sol = solve(eq_sol, h)
h_sol = h_sol[0]
h_sol


This gives something like $$h\left(t\right) = \frac{\sqrt{3} \sqrt{c_{1}} {\left(e^{\left(\frac{2}{3} \, \sqrt{3} C \sqrt{c_{1}} + \frac{2}{3} \, \sqrt{3} \sqrt{c_{1}} t\right)} + 1\right)}}{3 \, {\left(e^{\left(\frac{2}{3} \, \sqrt{3} C \sqrt{c_{1}} + \frac{2}{3} \, \sqrt{3} \sqrt{c_{1}} t\right)} - 1\right)}},$$

in sage notation (non-LaTeX) it starts like

h(t) == 1/3*sqrt(3)*sqrt(c1)* ...


Question 1: Is there a way to allocate to the solution (i.e. h_sol) the RHS of the above? without the h(t) == part.

I had to set by hand (it is ease, but it would be nice to automatize the allocation)

var('C')    # the integration constant introduced above
h_sol = 1/3*sqrt(3)*sqrt(c1)* ...


Then, by simply looking at the solution it is clear that it can be simplified. I tried things like

h_sol = h_sol.canonicalize_radical()
h_sol = h_sol.collect_common_factors()
h_sol = h_sol.simplify_rectform(complexity_measure = None)


but none of them returns the expected result, which could be obtained from Mathematica's kernel

mathematica("DSolve[3*h'[t] + 3*h[t]^2 == C[1], h[t], t]//FullSimplify")


$$\sqrt{\frac{c_1}{3}} \tanh\left( \sqrt{\frac{c_1}{3}} (t - 3 c_2) \right)$$

Question 2: How could the expression h_sol be manipulated to obtain the hyperbolic tangent?

edit retag close merge delete

Sort by » oldest newest most voted

(1) One can use either solution_dict=True... or the rhs method...

sage: h_sol = solve(eq_sol, h, solution_dict=True)[0][ h(t) ]
sage: h_sol
1/3*sqrt(3)*sqrt(c1)*(e^(2/3*sqrt(3)*_C*sqrt(c1) + 2/3*sqrt(3)*sqrt(c1)*t) + 1)/(e^(2/3*sqrt(3)*_C*sqrt(c1) + 2/3*sqrt(3)*sqrt(c1)*t) - 1)

sage: h_sol = solve(eq_sol, h)[0].rhs()
sage: h_sol
1/3*sqrt(3)*sqrt(c1)*(e^(2/3*sqrt(3)*_C*sqrt(c1) + 2/3*sqrt(3)*sqrt(c1)*t) + 1)/(e^(2/3*sqrt(3)*_C*sqrt(c1) + 2/3*sqrt(3)*sqrt(c1)*t) - 1)


(2) The human eye can do this better, just divide by the exponential of the half exponent. For me, the delivered form is acceptable, rational function composed with exponential function. (No simplify.... method gave me an other expression.)

more