Symbolically solving ODEs can be done using Sage's interface with Maxima. Numerical solution of ODEs can be done using Sage's interface with Octave (an experimental package), or routines in the GSL (Gnu Scientific Library).
You can solve ODE's symbolically in Sage using the Maxima interface
(do not type the ...
):
sage: maxima.de_solve('diff(y,x,2) + 3*x = y', ['x','y'], [1,1,1]) y=3*x-2*%e^(x-1) sage: maxima.de_solve('diff(y,x,2) + 3*x = y', ['x','y']) y=%k1*%e^x+%k2*%e^-x+3*x sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y']) y=(%c-3*(-x-1)*%e^-x)*%e^x sage: maxima.de_solve('diff(y,x) + 3*x = y', ['x','y'],[1,1]) y=-%e^-1*(5*%e^x-3*%e*x-3*%e) sage: maxima.clear('x'); maxima.clear('f') sage: maxima.de_solve_laplace("diff(f(x),x,2) = 2*diff(f(x),x)-f(x)",\ ... ["x","f"], [0,1,2]) f(x)=x*%e^x+%e^x sage: maxima.clear('x'); maxima.clear('f') sage: f = maxima.de_solve_laplace("diff(f(x),x,2) = 2*diff(f(x),x)-f(x)",\ ... ["x","f"]) sage: f f(x)=x*%e^x*(?%at('diff(f(x),x,1),x=0))-f(0)*x*%e^x+f(0)*%e^x sage: f.display2d() ! x d ! x x f(x) = x %e (-- (f(x))! ) - f(0) x %e + f(0) %e dx ! !x = 0
If you have Octave
and gnuplot
installed,
sage: octave.de_system_plot(['x+y','x-y'], [1,-1], [0,2]) # optional octave required
Another way this system can be solved is to use the command
desolve_system
in calculus/examples
.
sage: attach os.environ['SAGE_ROOT'] + '/examples/calculus/desolvers.sage' sage: des = ["'diff(x(t),t)=x(t)+y(t)","'diff(y(t),t)=x(t)-y(t)"] sage: vars = ["t","x","y"] sage: ics = [0,1,-1] sage: desolve_system(des,vars,ics) [x(t)=cosh(2^(1/2)*t),y(t)=2*sinh(2^(1/2)*t)/sqrt(2)-cosh(2^(1/2)*t)]
Finally, Sage can solve linear DEs using power series:
sage: R.<t> = PowerSeriesRing(QQ, default_prec=10) sage: a = 2 - 3*t + 4*t^2 + O(t^10) sage: b = 3 - 4*t^2 + O(t^7) sage: f = a.solve_linear_de(prec=5, b=b, f0=3/5) sage: f 3/5 + 21/5*t + 33/10*t^2 - 38/15*t^3 + 11/24*t^4 + O(t^5) sage: f.derivative() - a*f - b O(t^4)
See About this document... for information on suggesting changes.