Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Okay, I'll suppose this is not homework (i it is, please take the time to understand the solutions : it might be worth it...). It turns out exhibiting some interesting features (and non-features) of Sage and some packages interfaced to it, so let's dig it.

Sage (i. e. Maxima)

The first attempt:

var('x')
y = function('y')(x)
de = diff(y, x) == (4*x + y)^2
desolve(de, y, x)

fails with a suggestion:

    NotImplementedError: Maxima was unable to solve this
    ODE. Consider to set option contrib_ode to True.

which, when applied, gives a curious result:

Sol=desolve(de, y, ivar=x, contrib_ode=True)
Sol

[[x == _C - 1/2*arctan(1/2*sqrt(t)), y(x) == -4*x - sqrt(t)
 [x == _C + 1/2*arctan(1/2*sqrt(t)), y(x) == -4*x + sqrt(t)]]

This parametric form introduces non only an integration constant _C but also a parameter t ; both x and y are functions of t, which is only used through its square root. We can use this to solve sqrt(t) in x (hint : the justification of this solution is not trivial…) and get two solutions…

(_C, t)=var("_C, t")
SolSage=map(lambda u:u[1].subs(u[0].solve(sqrt(t))), Sol)
SolSage

… which turn out to be the same, and can be checked:

bool(SolSage[0].rhs().diff(x)==de.subs(SolSage[0]).rhs())

True

One notes that the constant _C is determined by the initial conditions but modulo $\pi$.

Sympy

By default, Sympy returns a Taylor series of the solution, which is not very interesting here. We'll ask for /all/ solutions of our equations:

D=sympy.dsolve(*map(sympy.sympify, [de, y(x)]), hint="all")
D

{'1st_power_series': Eq(y(x), x**3*(C1**2*(3*C1**2 + 4) + 12*C1**2 + 16)/3 + x**5*(8*C1**2*(3*C1**2 + 8) + 4*C1**2*(9*C1**2 + 8) + C1**2*(2*C1**2*(3*C1**2 + 8) + C1**2*(9*C1**2 + 8) + 36*C1**2 + 32) + 144*C1**2 + 128)/15 + C1 + C1*x**2*(C1**2 + 4) + C1*x**4*(C1**2*(3*C1**2 + 8) + 12*C1**2 + 32)/3 + C1**2*x + O(x**6)),
 'best': Eq(y(x), x**3*(C1**2*(3*C1**2 + 4) + 12*C1**2 + 16)/3 + x**5*(8*C1**2*(3*C1**2 + 8) + 4*C1**2*(9*C1**2 + 8) + C1**2*(2*C1**2*(3*C1**2 + 8) + C1**2*(9*C1**2 + 8) + 36*C1**2 + 32) + 144*C1**2 + 128)/15 + C1 + C1*x**2*(C1**2 + 4) + C1*x**4*(C1**2*(3*C1**2 + 8) + 12*C1**2 + 32)/3 + C1**2*x + O(x**6)),
 'best_hint': '1st_power_series',
  'default': '1st_power_series',
  'lie_group': Eq(y(x), -4*x + 2*tan(C1 + 2*x)),
  'order': 1}

The `lie_group solution can be expressed in Sage as:

D['lie_group']._sage_()

y(x) == -4*x + 2*tan(C1 + 2*x)

which is identical to the solution given by Sage up to the expression of the constant.

Giac

Unfortunately, Sage is not (yet) able to translate the differential equation in giac. But a "manual" translation allows us to call giac's solver, which gives:

from giacpy_sage import * SolGiac=libgiac.desolve(libgiac.diff(y(x),x)-de.rhs(),y(x))[0] SolGiac

2*tan(2*x-2*c_0)-4*x

i. e. again the same result up to the expression of the constant…

Fricas

I have been unable to use Fricas solver to solve this equation. But that's probably because I do not (yet) know the `fricas' interface in detail.

Mathematica

Again, Sage is currently unable to translate the differential equation. A manual call:

mathematica("DSolve[Derivative[1][y][x] == (4*x + y[x])^2, y[x], x]")

{{y[x] -> -2*I - 4*x + (-I/4 + E^((4*I)*x)*C[1])^(-1)}}

gives a result, manually translatable to Sage as -4*x + 4/(4*C1*e^(4*I*x) - I) - 2*I, totally different from those obtained so far.

A heavy pounding on this expression by deMoivre and algebraic transformations may reveal that this expresses the same relation between x and y as before. I haven't done this.