Manuel Arriaza Guiñez
2009-Sep-18 00:18 UTC
[R-es] Como puedo calcular un maximo de alguna funcion?
Nos gustaria conocer alguna alternativa para realizar una funcion, a la que le entreguemos una funcion y nos entregue el maximo luego de evaluar la segunda derivada nuestro principal problema es que no conocemos como trabajar con la derivada ya que es de tipo call o expresion aqui esta nuestro algoritmo f<-expression(20*x*(1-x)^3) f #Primera derivada derivada<-D(f,"x") derivada mode(derivada) #Segunda derivada segundaderivada<-D(derivada,"x") segundaderivada #Instale y cargue el paquete rootsolve #Puntos criticos para la primera derivada fun <- function (x)20*(1-x)^3-60*x*(1-x)^2 curve(fun(x),0,10,main="uniroot.all") All <- uniroot.all(fun,c(0,10)) points(All,y=rep(0,length(All)),pch=16,cex=2) ceros<-All #Guardamos los puntos criticos en el vector llamado ceros ceros #Evaluando los puntos criticos en la segunda derivada fun <- function (x)-120*(1-x)^2+120*x*(1-x) i=1 while(i<=length(ceros)) { if (eval(fun(ceros[i]))<0) { cat(ceros[i]) cat(" es maximo\n") } i<-i+1 } _________________________________________________________________ [[elided Hotmail spam]] [[alternative HTML version deleted]]
Carlos J. Gil Bellosta
2009-Sep-18 12:47 UTC
[R-es] Como puedo calcular un maximo de alguna funcion?
Hola, ¿qué tal? Podríais hacer algo así como: f <- "20*x*(1-x)^3" find.max <- function( foo, min, max ){ foo <- parse( text = foo ) df <- D( foo, "x" ) ddf <- D( df, "x" ) dfoo <- function( x ) eval( df ) ddfoo <- function( x ) eval( ddf ) ceros <- uniroot.all( dfoo, c(min, max) ) ceros <- ceros[ ddfoo( ceros ) < 0 ] ceros } Le faltan cosas, como la comprobación de errores, etc., pero contiene las ideas principales sobre cómo manipular los elementos básicos del lenguaje. Un saludo, Carlos J. Gil Bellosta http://www.datanalytics.com El día 18 de septiembre de 2009 02:18, Manuel Arriaza Guiñez <manu3_16 en hotmail.com> escribió:> > Nos gustaria conocer alguna alternativa para realizar una funcion, a la que le entreguemos una funcion y nos entregue el maximo luego de evaluar la segunda derivada > nuestro principal problema es que no conocemos como trabajar con la derivada ya que es de tipo call o expresion > > aqui esta nuestro algoritmo > > > > > f<-expression(20*x*(1-x)^3) > f > > #Primera derivada > > derivada<-D(f,"x") > derivada > mode(derivada) > > > #Segunda derivada > > segundaderivada<-D(derivada,"x") > segundaderivada > > > > #Instale y cargue el paquete rootsolve > #Puntos criticos para la primera derivada > > fun <- function (x)20*(1-x)^3-60*x*(1-x)^2 > curve(fun(x),0,10,main="uniroot.all") > All <- uniroot.all(fun,c(0,10)) > points(All,y=rep(0,length(All)),pch=16,cex=2) > > ceros<-All #Guardamos los puntos criticos en el vector llamado ceros > ceros > > > > #Evaluando los puntos criticos en la segunda derivada > > fun <- function (x)-120*(1-x)^2+120*x*(1-x) > > i=1 > while(i<=length(ceros)) > { > if (eval(fun(ceros[i]))<0) > { > cat(ceros[i]) > cat(" es maximo\n") > } > i<-i+1 > } > > > > > > _________________________________________________________________ > [[elided Hotmail spam]] > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >