How Do I Solve A Second Order Differential Equation In R?
I am learning R to solve a second order differential equation(probably using deSolve package). Which I have written in python by writing it as two first order differential equation
Solution 1:
This should be a translation of the Python code to R
library(deSolve)
deriv <- function(t, state, parameters){
with(as.list(c(state, parameters)),{
M <- sqrt(1/3 * (1/2 * dy^2 + 1/2 * y^2))
dz <- M*z # dz/dt
ddy <- -3* M * dy - y # ddy/dt
list(c(dy, ddy, dz))
})
}
state <- c(y = 1,
dy = -0.1,
z = 1)
times <- seq(0, 100, length.out = 10001)
sol <- ode(func = deriv, y = state, times = times, parms = NULL)
y <- sol[, "y"]
dy <- sol[, "dy"]
z <- sol[, "z"]
M <- sqrt(1/3 * (1/2 * dy^2 + 1/2* y^2))
plot(times, z, col = "red", ylim = c(-1, 18), type = "l")
lines(times, y, col = "blue")
lines(times, M, col = "green")
grid()
There is a faster way to directly calculate M
in R with this code:
library(deSolve)
deriv <- function(t, state, parameters){
with(as.list(c(state, parameters)),{
M <- sqrt(1/3 * (1/2 * dy^2 + 1/2 * y^2))
dz <- M*z # dz/dt
ddy <- -3* M * dy - y # ddy/dt
list(c(dy, ddy, dz), M = M)
})
}
state <- c(y = 1,
dy = -0.1,
z = 1)
times <- seq(0, 100, length.out = 10001)
sol <- ode(func = deriv, y = state, times = times, parms = NULL)
## save to file
write.csv2(sol,file = "path_to_folder/R_ODE.csv")
## plot
matplot(sol[,"time"], sol[,c("y", "z", "M")], type = "l")
grid()
Post a Comment for "How Do I Solve A Second Order Differential Equation In R?"