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
>