# Runge-Kutta Method for a double pendulum

1. Nov 29, 2013

### heycoa

Hello, I am trying to program a double pendulum via the 4th order Runge-Kutta method and I cannot seem to be getting the right output. At first I used the Euler-Cromer method, but now I am aiming to make it more accurate.

1. The problem statement, all variables and given/known data

I have the equations of motion: d(omega)/dt and d(theta)/dt = omega

also, my step size is "h"

2. Relevant equations

The Runge-Kutta method can be found here: http://en.wikipedia.org/wiki/Runge–Kutta_methods

3. The attempt at a solution

for omega I tried the following:
k1=d(omega)/dt
k2=d(omega)/dt + 0.5*h*k1
k3=d(omega)/dt + 0.5*h*k2
k4=d(omega)/dt + 0.5*h*k3

omega= omega_initial + (1/6)*h*(k1 + 2*k2 + 2*k3 + k4)

and for theta:
k1=omega
k2=omega + 0.5*h*k1
k3=omega + 0.5*h*k2
k4=omega + 0.5*h*k3

theta = theta_initial + (1/6)*h*(k1 + 2*k2 + 2*k3 + k4)

Last edited: Nov 29, 2013
2. Nov 29, 2013

### pasmith

Not quite; the $k_i$ are vectors with one component for each variable, and you need to compute each component of $k_1$ before computing any components of $k_2$ and so forth. Thus if you have $x = (x_1, \dots, x_N)$ and you wish to solve $\dot x = f(x)$ then you would need (in C):
Code (Text):

double k1[N], k2[N], k3[N], k4[N], xTemp[N], xNew[N];

for(i = 0; i < N; i++)
{
k1[i] = f(xOld)[i];
}

for(i = 0; i < N; i++)
{
xTemp[i] = xOld[i] + 0.5*dt*k1[i];
}

for(i = 0; i < N; i++)
{
k2[i] = f(xTemp)[i];
}
for(i = 0; i < N; i++)
{
xTemp[i] = xOld[i] + 0.5*dt*k2[i];
}

with similar loops to calculate $k_3$ and $k_4$.

Of course if you're using a language which understands vector operations then you don't need to expressly loop through the components.

3. Nov 29, 2013

### heycoa

Thank you very much for the response! But I'm not sure I understand. What is N here?

4. Nov 29, 2013

### heycoa

I guess I just dont understand what K is. In my case, is K the slope of d(omega)/dt? So do I have to take the derivative of d(omega)/dt and then calculate the slope at each point?