IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Algorithme de Newton-Raphson


Sujet :

R

  1. #1
    Invité
    Invité(e)
    Par défaut Algorithme de Newton-Raphson
    Pouvez-vous en fait me corriger le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    x=c(1,2,3,4,5,6)
    fx=c(1486,694,195,37,10,1)
    moy <- sum(x*fx)/sum(fx)
     
     
    theta=moy
    i=0
    repeat
     
    {
    n=sum(fx)
    deriveesec=function(theta)
    {
    -sum(fx)/theta**2+(n*exp(-theta))/(1-exp(-theta))**2
    }
    i=i+1
    thetaold=theta
    derivee=-n+sum(fx)/theta-(n*exp(-theta))/(1-exp(-theta))
     
     
    theta=theta-derivee/deriveesec
     
    if (sqrt(sum((theta-thetaold)**2))<0.000001)
    {break}
     
    print(i)
    }
    l'erreur retournée est la suivante :

    Error in derivee/deriveesec : non-numeric argument to binary operator
    Dernière modification par ced ; 05/02/2014 à 21h19. Motif: Merci d'utiliser la balise [CODE] (bouton #)

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2013
    Messages : 75
    Points : 191
    Points
    191
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    theta=theta-derivee/deriveesec
    tu divises un numérique par une fonction !
    pas étonnant qu'il t'affiche argument non numérique.

  3. #3
    Invité
    Invité(e)
    Par défaut re :Algorithme de newton-raphson
    J'ai corrigé le code précédent par le suivant, les dérivées sont numériques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    theta=moy
    i=0
    repeat
     
    {
    n=sum(fx)
    deriveesec={-sum(fx)/theta**2+(n*exp(-theta))/(1-exp(-theta))**2
    }
    i=i+1
    thetaold=theta
    derivee=
    {
    f=-n+sum(fx)/theta-(n*exp(-theta))/(1-exp(-theta))
    }
     
     
    theta=theta-derivee/deriveesec
     
    if (sqrt(sum((theta-thetaold)**2))<0.001)
    {break}
     
    print(i)
    }
    Cependant, il est impossible d'afficher theta et le message d'erreur est le suivant :

    Error in if (sqrt(sum((theta - thetaold)^2)) < 0.001) { :
    missing value where TRUE/FALSE needed
    Dernière modification par ced ; 06/02/2014 à 17h18. Motif: Merci d'utiliser la balise [CODE] (bouton #)

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2013
    Messages : 75
    Points : 191
    Points
    191
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # i = 8
    > theta
    [1] -892.6866
    > exp(-theta)
    [1] Inf
    Exécute ton code à la main, itération par itération si il le faut

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 208
    Points : 461
    Points
    461
    Par défaut
    Salut

    Je dirais que tu t'es trompée dans le calcul de la dérivée.
    A vue de nez j'aurais dis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      deriveesec={-sum(fx)/theta**2 -
                    (n*exp(-theta))/(1-exp(-theta))**2 +
                    (n*exp(-theta))/(1-exp(-theta))
    }
    Là ça converge.

    Mais c'est plus trop un problème de R

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup, le programme fonctionne, il restera maintenant à le comparer à la fonction implémentée sous R.
    C'est curieux, pourtant je crois avoir recopié la formule que le prof nous a donnée. Je voulais donc m'assurer que tu as bien utilisé la formule de la dérivée première du dessous pour calculer la dérivée seconde à la main.

    Sinon quelqu'un d'entre vous s'y connaît en SAS ? Car je n'ai pas de réponse sur forum pour le moment
    Dernière modification par ced ; 11/02/2014 à 21h30.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Algorithme de Newton-Raphson
    Par Invité dans le forum R
    Réponses: 0
    Dernier message: 05/02/2014, 18h41
  2. Algorithme Newton Raphson
    Par Chefcou dans le forum Calcul scientifique
    Réponses: 4
    Dernier message: 17/01/2013, 13h25
  3. Algorithme newton raphson
    Par 22011988 dans le forum SAS IML
    Réponses: 14
    Dernier message: 08/06/2012, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo