web-dev-qa-db-fra.com

Résolution de l'inverse d'une fonction dans R

Y a-t-il un moyen pour R de résoudre l'inverse d'une fonction à variable unique donnée? La motivation est pour moi de dire plus tard à R d'utiliser un vecteur de valeurs comme entrées de la fonction inverse afin qu'elle puisse cracher les valeurs de la fonction inverse.

Par exemple, j'ai la fonction y(x) = x^2, l'inverse est y = sqrt(x). Y a-t-il un moyen pour R de résoudre la fonction inverse?

J'ai recherché uniroot(), mais je ne résous pas le zéro d'une fonction.

Toute suggestion serait utile.

Merci!

21
crazian

Quel genre d'inverse trouvez-vous? Si vous recherchez un inverse symbolique (par exemple, une fonction y qui est identique à sqrt (x)), vous allez devoir utiliser un système symbolique. Regardez ryacas pour qu'une bibliothèque R se connecte à un système d'algèbre informatique qui peut probablement calculer des inverses, Yacas.

Maintenant, si vous avez seulement besoin de calculer des inverses ponctuels, vous pouvez définir votre fonction en termes d'uniroot comme vous l'avez écrit:

> inverse = function (f, lower = -100, upper = 100) {
   function (y) uniroot((function (x) f(x) - y), lower = lower, upper = upper)[1]
}

> square_inverse = inverse(function (x) x^2, 0.1, 100)

> square_inverse(4)
[1] 1.999976

Pour un y et une f(x) donnés, cela calculera x de telle sorte que f(x) = y, également connu sous le nom d'inverse.

30
Mike Axiak

Je ne peux pas faire de commentaire car ma réputation est trop basse. Je suis un débutant en R, et il m'a fallu un certain temps pour comprendre le code de Mike car je n'étais pas habitué à la façon dont les fonctions sont définies dans sa réponse. Voici le code de Mike dans une notation plus longue, mais (pour moi) plus facile à lire:

inverse <- function(f, lower, upper){
  function(y){
    uniroot(function(x){f(x) - y}, lower = lower, upper = upper, tol=1e-3)[1]
  }
}
square_inverse <- inverse(function(x){x^2}, 0.1, 100)
square_inverse(4)

J'espère que cela aidera également d'autres débutants.

0
Jan H.