Processing math: 100%

First time here? Check out the FAQ!

Ask Your Question
3

Numeric multivariable ode solver in Sage?

asked 14 years ago

ngativ gravatar image

updated 13 years ago

Kelvin Li gravatar image

hi everyone, is there any numeric multivariable ode solver in sage? i want to solve the double pendulum problem, so i need to solve 4 first order differential equations which deppends on theta_1(t) amd thetha_2(t). I need something like a multivariable runge kutta algorithm

Preview: (hide)

Comments

You should also ask on ask.scipy.org (but ask about scipy - a component of sage - instead of sage). Post a link here.

William Stein gravatar imageWilliam Stein ( 14 years ago )

3 Answers

Sort by » oldest newest most voted
2

answered 14 years ago

Joaquim Puig gravatar image

Hi,

Another option is to use the function desolve_odeint (from version 4.6 on, see the docs on desolve_odeint?), which uses the odeint solver internally, but takes as an input symbolic funcions . For instance, to integrate the Lorenz attractor, you would do

 sage: x,y,z=var('x,y,z') # Declare the variables 
 sage: lorenz=[10.0*(y-x),x*(28.0-z)-y,x*y-(8.0/3.0)*z]
 sage: times=srange(0,50.05,0.05) # Integration Time 
 sage: ics=[0,1,1] # and initial conditions
 sage: sol=desolve_odeint(lorenz,ics,times,[x,y,z]) #integrate

to plot the attractor, simply:

sage: line3d(sol)

I do not know what you mean exactly by the double pendulum, but here it is something similar:

sage: theta1,theta2,x1,x2=var('theta1,theta2,x1,x2')
sage: dpendulum=[x1,x2,-sin(theta1)-0.1*sin(theta2),-sin(theta2)+0.1*sin(theta1)]
sage: # Time and initial conditions
sage: times=srange(0,50.05,0.05) 
sage: ics=[1,1,0,0] 
sage: sol=desolve_odeint(dpendulum,ics,times,[theta1,theta2,x1,x2])

and a nice plot is here

sage: graphics_array([line(zip(sol[:,0],sol[:,2])),line(zip(sol[:,1],sol[:,3]))])

Joaquim Puig

Preview: (hide)
link
2

answered 14 years ago

Most of Sage's numerics is done via Numpy/Scipy which is included in Sage and usable from the Sage Notebook. To solve an ODE using Scipy first reduce your problem to a system of 1st degree ODEs: u(x,y,t)=f(t,x,y,u). Then, follow the instructions on the relevant Scipy documentation: Ordinary differential equations (odeint). The key components to solving the numerical ODE is (1) writing a Python function for the right-hand side, f, (2) writing a function for its Jacobian, Jf, (3) and calling the scipy.integrate.odeint function.

Consult the scipy.integrate.odeint documentation for more information on its use. You can read this documentation by entering

sage: from scipy.integrate import odeint
sage: odeint?

Finally, I providing the Jacobian for your problem is an optional argument but it helps with convergence.

Preview: (hide)
link

Comments

Thanks!, but.. it works for a multivariable diferential equation system like u(x,y,t)=f(t,x,y,u). ? i only see that odeint only works for du/dt=f(u,t) or im wrong?

ngativ gravatar imagengativ ( 14 years ago )

**odeint** allows passing of arguments. These arguments are supposed to match those of f and Jf in the same order. For example, if f and Jf depend on a parameter, α, then just include α in the **args** parameter of **odeint**. Spatial vecotrs x and y can behave similarly.

cswiercz gravatar imagecswiercz ( 14 years ago )
1

answered 14 years ago

ngativ gravatar image

i make it! using desolve_system_rk4[w1,w2,aw1,aw2],[s1,s2,w1,w2],ics=[0,0.5,0,0.0,0.5],ivar=t,step=0.01,end_points=20)

I compared these results with the results from a maple worksheet that i downloaded from internet and they match very well. The Sage's speed is very good

But i would like to learn how to use odeint from scipy and ode_solver from gsl to solve this system :S

I just started to using Sage 3 days ago and i love it. Thanks!

Preview: (hide)
link

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 14 years ago

Seen: 2,608 times

Last updated: Mar 03 '11