我一直在尝试用R编写一个实现牛顿方法的程序。我大部分时候都取得了成功,但是有两个小障碍困扰着我。这是我的代码:
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)
}
f
提示用户输入,我将无法通过R识别函数f.
和readline()
。我收到错误“Newton()中的错误:找不到函数“f。”。”但是,如果我注释掉了读取行(如上所述),请事先定义f
和f.
,那么一切正常。 expression()
,但是我想采用function()
的导数并将它给我一个function()
。简而言之,我在expression()
和function()
之间的类型转换遇到麻烦。 对于从
function()
到expression()
,我有一个难看但有效的解决方案。给定一个函数f,D(body(f)[[2]],"x")
将给出f
的导数。但是,此输出是expression()
,我无法将其转换回function()
。我是否需要使用eval()
或其他内容?我尝试了子设置,但无济于事。例如:g <- expression(sin(x))
g[[1]]
sin(x)
f <- function(x){g[[1]]}
f(0)
sin(x)
当我想要的是f(0)= 0时,因为sin(0)= 0。
编辑:谢谢大家!这是我的新代码:
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)
}
最佳答案
readline
读取文本字符串,而您需要的是表达式。您可以使用parse()
将文本字符串转换为表达式:f <-readline(prompt="Function? ")
sin(x)
f
# [1] "sin(x)"
f <- parse(text = f)
f
# expression(sin(x))
g <- D(f, "x")
g
# cos(x)
eval()
编码。很好,R允许您在提供给envir=
的eval()
参数的列表中提供这些值:> eval(f, envir=list(x=0))
# [1] 0
关于R类型转换expression()function(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857042/