Suppose I have a 2nd order ODE of the form y''(t) = 1/y
with y(0) = 0
and y'(0) = 10
, and want to solve it using a Runge-Kutta solver. I've read that we need to convert the 2nd order ODE into two 1st order ODEs, but I'm having trouble doing that at the moment and am hoping someone here might be able to help. This is my code thus far:
Remove["Global`*"]
(*dy/dt=*)f[t_, y_] := 1/y;
(*d^2y/dt^2=*)g[t_, y_, yd_] :=???;
t[0] = 0;
y[0] = 0;
yd[0] = 10;
tmax = 1000;
h = 0.01;
Do[
{t[n] = t[0] + h n,
k1 = h f[t[n], y[n], yd[n]];
l1 = h g[t[n], y[n], yd[n]];
k2 = h f[t[n] + h/2, y[n] + k1/2, yd[n] + l1/2];
l2 = h g[t[n] + h/2, y[n] + k1/2, yd[n] + l1/2];
k3 = h f[t[n] + h/2, y[n] + k2/2, yd[n] + l2/2];
l3 = h g[t[n] + h/2, y[n] + k2/2, yd[n] + l2/2];
k4 = h f[t[n] + h, y[n] + k3, yd[n] + l3];
l4 = h g[t[n] + h, y[n] + k3, yd[n] + l3];
y[n + 1] = y[n] + 1/6 (k1 + 2 k2 + 2 k3 + k4);
yd[n + 1] = yd[n] + 1/6 (l1 + 2 l2 + 2 l3 + l4);
}, {n, 0, tmax}]
As you can see by the question marks for the function g[t_,y_,yd_]
, I don't know how I can set it in such a way that y''(t) = 1/y
. Do I feed the results of y[n+1]
into g
when running the algorithm? Any help would be appreciated.