Résolution d'équation sur R

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Christian Vayssier
Messages : 44
Enregistré le : 11 Mai 2009, 08:44

Résolution d'équation sur R

Messagepar Christian Vayssier » 09 Déc 2015, 15:46

Bonjour,

Je tente de résoudre une équation sur un jeu de donnée et ça ne fonctionne pas. Mon objectif est d'obtenir la solution à l'équation suivante (très simplifiée pour l'exemple) : A*(B+C*x)^t = 0. Tous les paramètres sont connus sauf "x".
En cherchant sur internet, j'ai trouvé une fonction "uniroot.all" qui permet de faire ça. Voici le lien :
http://stackoverflow.com/questions/1202 ... -every-row

J'ai essayé de mon côté et ça ne marche pas, voici un petit exemple :

Code : Tout sélectionner

df <- data.frame(a=round(runif(1000, 1, 10),0), b=round(runif(1000, 10, 20),0), c=round(runif(1000, 30, 40),0), t=0.8)

library(plyr)
library(rootSolve)

df2 <- adply(df, 1, summarize,
      solution = uniroot.all(function(x) a*(b+c*x)^t,
                             interval = c(0,1000)))


J'obtiens une table complètement vide et franchement je ne sais pas comment procéder.
Certains d'entres vous ont-ils déjà eu ce problème ?
En attendant votre aide,
merci,

Bien cordialement.

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Résolution d'équation sur R

Messagepar Eric Casellas » 09 Déc 2015, 16:50

Bonjour,

Pour l'équation présentée (A*(B+C*x)^t = 0.), si A!=0 alors c'est encore simplifiable/équivalent à (B+C*x) = 0 et donc x=-B/C
Toute valeur de x < -B/C n'est pas valide pour des valeurs non entières de t. Ainsi la racine recherchée est exactement la borne min du domaine de validité de la fonction donc je ne sais pas si l'algo Newton-Raphson supporte bien ce cas...

Sinon dans tes exemples de codes tu lui demande un intervalle sur les x qui commence à 0 donc il n'y aura jamais de solutions pour B & C > 0

illustration par petits exemples de code pour les 1ere lignes de df :

Code : Tout sélectionner

library(rootSolve)
df <- data.frame(a=round(runif(1000, 1, 10),0), b=round(runif(1000, 10, 20),0), c=round(runif(1000, 30, 40),0), t=0.8)

myfun <- function(x, a, b, cc, tt) {
  return(a*(b+cc*x)^tt)
}

intervalRange <- seq(0, 100, 1)
for (i in 1:10) {
  plot(intervalRange, myfun(intervalRange, a=df$a[i], b=df$b[i], cc=df$c[i], tt=df$t[i]), main=paste0("Min=", summary(myfun(intervalRange, a=df$a[i], b=df$b[i], cc=df$c[i], tt=df$t[i]))["Min."]))
  abline(h=0, col="red")
  print(uniroot.all(f=myfun, interval=range(intervalRange), a=df$a[i], b=df$b[i], cc=df$c[i], tt=df$t[i]))
}


ps : t étant déjà utilisé par R pour la fonction transposée il est fortement recommander de ne pas l'utiliser (idem pour c qui fait de la concatenation)
Eric

Eric Wajnberg
Messages : 778
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: Résolution d'équation sur R

Messagepar Eric Wajnberg » 09 Déc 2015, 21:40

Eric Casellas a écrit :ps : t étant déjà utilisé par R pour la fonction transposée il est fortement recommander de ne pas l'utiliser (idem pour c qui fait de la concatenation)

Et idem pour df qui retourne une densité de proba..

Eric.

Christian Vayssier
Messages : 44
Enregistré le : 11 Mai 2009, 08:44

Re: Résolution d'équation sur R

Messagepar Christian Vayssier » 04 Jan 2016, 21:40

Bonjour,

Ok, merci pour vos réponses. Je ferai plus attention pour les noms des paramètres.

Mais je n'ai pas bien compris comment obtenir la valeur "x" qui annule l’équation de départ ou qui se rapproche de 0 pour chaque lignes de la table ?
Faut il juste que je prenne un intervalle de x inférieure à 0 ? ça ne semble pas marcher .... :(

Cordialement.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité