我一直在尝试用 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)
}
我无法让 R 识别这些函数f
and f.
如果我尝试使用readline()
提示用户输入。我收到错误“Newton() 中的错误:找不到函数“f”。”但是,如果我注释掉 readlines(如上所述),请定义f
and f.
事先,然后一切正常。
我一直在尝试让 R 计算函数的导数。问题是 R 可以进行符号导数的类对象是expression()
,但我想求 a 的导数function()
并让它给我一个function()
。简而言之,我在类型转换方面遇到了麻烦expression()
and function()
.
我有一个丑陋但有效的解决方案function()
to 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)
}