R conversão de tipo de expressão () function ()
Eu tenho tentado escrever um programa em R que implementa o método de Newton. Eu tenho tido mais sucesso, mas há dois pequenos obstáculos que me incomodam. Aqui está o meu código:
Newton<-function(f,f.,guess){
#f <- readline(prompt="Function? ")
#f. <- readline(prompt="Derivative? ")
#guess <- as.numeric(readline(prompt="Guess? "))
a <- rep(NA, length=1000)
a[1] <- guess
a[2] <- a[1] - f(a[1]) / f.(a[1])
for(i in 2:length(a)){
if(a[i] == a[i-1]){
break
}
else{
a[i+1] <- a[i] - f(a[i]) / f.(a[i])
}
}
a <- a[complete.cases(a)]
return(a)
}
Não consigo fazer com que R reconheça as funçõesf
ef.
se eu tentar usarreadline()
para solicitar a entrada do usuário. Eu recebo o erro "Erro em Newton (): não foi possível encontrar a função" f. "" No entanto, se eu comentar as linhas de leitura (como acima), definaf
ef.
antes, então tudo funciona be
Eu tenho tentado fazer R calcular a derivada de uma função. O problema é que o objeto de classe com o qual R pode obter derivadas simbólicas éexpression()
, mas quero tirar a derivada de umfunction()
e me dê umfunction()
. Em resumo, estou tendo problemas com a conversão de tipo entreexpression()
efunction()
.
Tenho uma solução feia, mas eficaz, para passar defunction()
paraexpression()
. Dada uma função f,D(body(f)[[2]],"x")
dará a derivada def
. No entanto, essa saída é umexpression()
e não consegui transformá-lo novamente em umfunction()
. Preciso usareval()
ou alguma coisa? Eu tentei fazer subconjuntos, mas sem sucesso. Por exemplo
g <- expression(sin(x))
g[[1]]
sin(x)
f <- function(x){g[[1]]}
f(0)
sin(x)
quando o que eu quero é f (0) = 0 desde que sin (0) = 0.
EDIT: Obrigado a todos! Aqui está o meu novo código:
Newton<-function(f,f.,guess){
g<-readline(prompt="Function? ")
g<-parse(text=g)
g.<-D(g,"x")
f<-function(x){eval(g[[1]])}
f.<-function(x){eval(g.)}
guess<-as.numeric(readline(prompt="Guess? "))
a<-rep(NA, length=1000)
a[1]<-guess
a[2]<-a[1]-f(a[1])/f.(a[1])
for(i in 2:length(a)){
if(a[i]==a[i-1]){break
}else{
a[i+1]<-a[i]-f(a[i])/f.(a[i])
}
}
a<-a[complete.cases(a)]
#a<-a[1:(length(a)-1)]
return(a)
}