Foro de debate

Iteraciones con retroalimentación

Iteraciones con retroalimentación

de Juan Miguel Requena Mullor -
Número de respuestas: 5
Hola, me gustaría que me ayudaran en lo siguiente:
He creado una función con function y necesito iterarla n veces pero que el output de cada iteración sea el input de la siguiente. 
He probado haciendo loops mezclados con otras herramientas pero no doy con la tecla, ¿alguien sabe qué función hace esto?
Muchas gracias.
En respuesta a Juan Miguel Requena Mullor

Re: Iteraciones con retroalimentación

de Juan Miguel Requena Mullor -
Hola de nuevo, por si alguien está interesado en el tema o para contrastar otras formas de hacerlo, la tecla con la que dí al final es ésta:

j<-c(1:100)
n1<-NULL
a<-function(x){
  b<-(1.5*(x/1000))*(1-(x/1000))
  c<-b*1000
}
for (i in j){
  if (1==i){ n1<-as.vector(a(50))       
  }else{m<-a(n1[i-(i-1)])
  n1<-abind(m,n1,along=)
  }
}
n1

Mi intención era trabajar con una versión simple de la ecuación de crecimiento exponencial para estudiar la evolución de poblaciones, en el ejemplo de arriba se aplica a 100 generaciones, con una tasa de natalidad de 1.5, una capacidad de carga de 1000 individuos y un n inicial de 50. 
Las claves para conseguir iterar con feedback estuvieron en el bucle, el condicional y abind.
Saludos.
En respuesta a Juan Miguel Requena Mullor

Re: Iteraciones con retroalimentación

de Manuel Muñoz Márquez -
Hola Juan Miguel y foreros:

Aunque ya has encontrado una solución a tu problema te propongo otra, aunque no entiendo muy bien lo que haces y por eso lo hago con otra función:

Consideremos la función g
g <- function(a, r) (a/r+r)/2

Si a es un número y r es el valor candidato a su raíz cuadrada, g(a, r) es un valor más cercano a la raíz cuadrada de a que r. Por tanto, iterando se obtiene la raíz cuadrad de a.

Sea n el valor del que hay que calcular la raíz cuadrada y raiz un valor cualquiera,
n <- 36
raiz <- 1

entonces el siguiente bucle aplica 10 iteraciones usando como valor de entrada en cada iteración el obtenido en la iteración siguiente.
for(i in 1:10) raiz <- g(n, raiz)
raiz

Saludos.
En respuesta a Manuel Muñoz Márquez

Re: Iteraciones con retroalimentación

de Juan Miguel Requena Mullor -
Hola Manuel, gracias por tu respuesta, entiendo lo que buscas con la función, te vas aproximando al valor de la raíz cuadrada del número n por "exceso" de forma que en i iteraciones converge en el valor, p.e., para 36 realmente con 6 iteraciones es suficiente si partes de 1, ó en 3 si partes de 5. Curioso que si arrancas por encima del valor. p.e. de 20, tarda mucho menos en comparación a cuando lo haces por debajo de 6.
El caso es que llevo poco tiempo con R y no veo cómo R entiende que tiene que repetir y además usar los ouputs como inputs si no metes i dentro del bucle.
Un saludo
Juanmi.
En respuesta a Juan Miguel Requena Mullor

Re: Iteraciones con retroalimentación

de Manuel Muñoz Márquez -
Buenas:

Esto funciona igual en todos los lenguajes de programación, con la instrucción
for(i in 1:10) raiz <- g(n, raiz)

le dices a R que repita la instrucción que viene a continuación o el bloque de instrucciones que vienen a continuación entre llaves, cuando i va desde 1 hasta 10, el que i aparezca o no dentro de las instrucciones a ejecutar es irrelevante.

Saludos.
En respuesta a Manuel Muñoz Márquez

Re: Iteraciones con retroalimentación

de Juan Miguel Requena Mullor -
Ok, el for si lo conocía pero no había pillado el truco para retroalimentar las iteraciones, tan sencillo como poner a raiz dentro y fuera para irle asignando cada vez el valor de la iteración. 
saludos y gracias
Juanmi.