Выражение преобразования типа R () function ()

Я пытался написать программу на 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)
}
  1. Я не могу заставить R распознавать функции f и f. , если я попытаюсь использовать readline () для запроса ввода пользователем. Я получаю сообщение об ошибке «Ошибка в Newton (): не удалось найти функцию« f »». Однако, если я закомментирую строки чтения (как указано выше), определите f и f. заранее, то все нормально работает.

  2. Я пытался заставить R вычислять производную функции. Проблема в том, что объектом класса, с которым R может принимать символические производные, является выражение () , но я хочу взять производную от функции () и получить функция () . Короче говоря, у меня проблемы с преобразованием типов между выражением () и функцией () .

У меня есть уродливое, но эффективное решение для перехода от функции () к выражению () . Для функции f D (body (f) [[2]], «x») даст производную от f . Однако этот вывод представляет собой выражение () , и мне не удалось превратить его обратно в функцию () . Мне нужно использовать 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)
}
9
задан André 3000 14 January 2012 в 16:58
поделиться