I am working on code that solves a differential equation numerically. The dydx_solve function is recursive and the results are supposed to be appended to a list called results that look like
[1] -0.1
[2] 0.1
[3] -0.001
...
[100] -1e-101
instead I'm getting solutions that's just
[[1]]
[1] -0.1
If I add print(y_n)
in the if
statement then I get all the values I need but not in a list. Where am I going wrong and how can I add all y_n
values to a single results list?
dx=0
y1=1
x1=1
slope=function(y){
dydx<- -y
return(dydx)
}
dydx_solve=function(x,y){
results<-list()
stepper<-0.1
if(x<10){
x<-x+stepper
y_n<-slope(y) *(x-(x-stepper))
results<-append(results, list(y_n))
dydx_solve(x,y_n)
print(results)
}else{
#pass
}
return(results)
}
print(dydx_solve(dx, y1))
print(results)
Try:
dydx_solve <- function(x,y, results=list()){
stepper <- 0.1
if (x < 10) {
x <- x + stepper
y_n <- slope(y) * (x-(x-stepper))
results <- append(results, list(y_n))
dydx_solve(x, y_n, results)
} else {
#pass
return(results)
}
}
# only show the last 3 elements
tail(dydx_solve(dx, y1), 3)
# [[1]]
# [1] -1e-99
#
# [[2]]
# [1] 1e-100
#
# [[3]]
# [1] -1e-101
Rather than save your results
, each time you call dydx_solve()
your first line creates an empty list. In your call, you need to pass your updated list to your results
argument and not overwrite it with an empty list with results<-list()
.
Also you need to move your return()
into your else
condition.
Note: this runs quickly for this task but growing a list with append()
can slow down your code if you have a lot of iterations.