The posted code:
( b, r, y0 ) = ( 30, 8/10, 3/2 )
var( 'x' );
y = function('y')(x)
de = diff( y, x ) == r*y*(1-y)/b
sol = desolve( de, y, ics=[0,y0] )
already leads to the solution (using implicit functions of y and x):
sage: sol
-75/2*log(y(x) - 1) + 75/2*log(y(x)) == x + 75/2*log(2) + 75/2*log(3/2)
In the ode-world this is already a solution. (Although i had a similar situation in an exam, and the examiner considered
i stopped too early, since the equation can be solved explicitly.) Here, the coefficients of the two log
expressions involving a non-constant function of y(x)
are opposite, ±75/2, so using exp
on both sides the expression (y−1)/y=1−1/y leads to an algebraic equation of first order in y, that can be solved. If we want to do this in sage, there is one more step needed, before calling solve
(for a combined exponential/logarithmic and algebraic equation), we substitute with an other variable, z
, the expression y(x)
. The adjusted code for this plan and a possible answer to the question is as follows:
( b, r, y0 ) = ( 30, 8/10, 3/2 )
var( 'x,z' );
y = function('y')(x)
de = diff( y, x ) == r*y*(1-y)/b
sol = desolve( de, y, ics=[0,y0] )
sol = sol . subs( { y(x): z } )
Y = sol . solve( z, to_poly_solve=True )[0].rhs()
print "Solution: Y=%s" % Y
print "Check is", bool( diff(Y,x) == r*Y*(1-Y)/ b )
print "Y(0) = %s" % Y.subs( {x:0} )
Results:
Solution: Y=3*e^(2/75*x)/(3*e^(2/75*x) - 1)
Check is True
Y(0) = 3/2
Related question, answers and discussion: logistic differential equation