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

MATLAB Discussion :

methode de newton raphson sans la connaissance de f(x) [Débutant]


Sujet :

MATLAB

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut methode de newton raphson sans la connaissance de f(x)
    bonjour tous,

    Je veux effectuer une methode de Newton Raphson mais sans connaitre l'expression analytique de ma fonction.

    1°) Voici mon problème:

    J'ai deux paramètres d'une loi normale que je fais varier jusqu'à obtenir une courbe se rapprochant le plus de la loi normale avec theta=5.65 et nu=0.9.

    Je note J l'erreur entre la courbe référence et la courbe calculé, pour retrouver les paramètres je cherche donc à minimiser l'erreur J.

    2°) Voici le programme que j'ai effectué, pour la premiere itération j'ai fait une descente de gradient et pour la suite j'ai approché la dérivée par la pente donnée par la valeur de la fonction precedemment calculée


    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    clear all
    close all
    clc
    %--------------------------------------------------------------------------
    periode=-10:1:10;
    gaussienne_de_base=(1/(5.65*sqrt(2*pi)))*exp((-1/2)*((periode-0.9)/5.65).^2);
    y_exp=gaussienne_de_base';
    %--------------------------------------------------------------------------
    iter=1;
    theta(iter)=10;
    J(iter)=100000000;
    nu(iter)=10;
    pas=0.1;
    gradient_J=zeros(2,1);
    critere_arret=10^-6;
    %--------------------------------------------------------------------------
    tic %demarre compteur de temps
    %--------------------------------------------------------------------------
    while iter<10;
     
    if iter==1;
     
        if J(iter) < critere_arret;
            break
        end
        A=loi_normale(theta(iter),nu(iter));
        y_cal=A';
        residu=y_exp-y_cal;
        J(iter)=residu'*residu;
        %casser le while si erreur > critere
        %------------------------
        dtheta=0.0000001*theta(iter);
        dnu=0.0000001*nu(iter);
        y_cal_dtheta=loi_normale(theta(iter)+dtheta,nu(iter))';
        y_cal_dnu=loi_normale(theta(iter),nu(iter)+dnu)';
        %------------------------
        residu_dtheta=y_exp-y_cal_dtheta;
        J_dtheta=residu_dtheta'*residu_dtheta;
        residu_dnu=y_exp-y_cal_dnu;
        J_dnu=residu_dnu'*residu_dnu;
        %------------------------
        gradient_J(1,1)=(J_dtheta-J(iter))/dtheta;
        gradient_J(2,1)=(J_dnu-J(iter))/dnu;
        %------------------------
        %descente de gradient
        theta(iter+1)=theta(iter)-pas*gradient_J(1);
        nu(iter+1)=nu(iter)-pas*gradient_J(2);
     
    else
        if J(iter-1) < critere_arret;
            break
        end
        A=loi_normale(theta(iter),nu(iter));
        y_cal=A';
        residu=y_exp-y_cal;
        J(iter)=residu'*residu;
        %casser le while si erreur > critere
        %------------------------
        dtheta=0.000001*theta(iter);
        dnu=0.000001*nu(iter);
        y_cal_dtheta=loi_normale(theta(iter)+dtheta,nu(iter))';
        y_cal_dnu=loi_normale(theta(iter),nu(iter)+dnu)';
        %------------------------
        residu_dtheta=y_exp-y_cal_dtheta;
        J_dtheta=residu_dtheta'*residu_dtheta;
        residu_dnu=y_exp-y_cal_dnu;
        J_dnu=residu_dnu'*residu_dnu;
        %------------------------
        %newton
        theta(iter+1)=theta(iter)-(J(iter)./((J(iter)-J(iter-1))/(theta(iter)-theta(iter-1))));
        nu(iter+1)=nu(iter)-(J(iter)./((J(iter)-J(iter-1))/(nu(iter)-nu(iter-1))));
     end
     
        iter=iter+1;
    end
    3°) Mon probleme est que mon code ne trouve pas de solution il part tres rapidement à l'infini (il diverge) pourtant en faisant une descente de gradient classique sur chaque iterations je retrouve bien la solution

    J'espere que vous pourrez m'aider car le programme est tres important pour moi.

    merci d'avance

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    ce ne serait pas plutôt la méthode de Gauss-Newton que tu essaies d'appliquer?

    Pourquoi dis-tu que tu ne connais pas l'expression analytique de la fonction alors que tu sais que c'est une loi normale?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par magelan Voir le message
    Bonjour,

    ce ne serait pas plutôt la méthode de Gauss-Newton que tu essaies d'appliquer?

    Pourquoi dis-tu que tu ne connais pas l'expression analytique de la fonction alors que tu sais que c'est une loi normale?
    En faite j'ai pris le cas de la loi normale ici mais dans la realité j'utilise des resultats issu d'une fonction que je ne connais pas.

    J'aimerai utiliser la methode de Newton Raphson mais comme je ne connais pas la derivée de la fonction je suis obligé de l'approximer

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    la premiere iteration se passe bien

    c'est juste à partir de la seconde iteration que les calculs divergent

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    si vous avez besoin de plus de renseignements pour m'aider merci de me le dire car ça fait deux jours que je suis dessus et je vois pas mon erreur

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    salut, 21did,

    tu aurais le code de la fonction loi_normale pour qu'on puisse faire des tests (ou c'est une fonction de toolbox) ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Merel Voir le message
    salut, 21did,

    tu aurais le code de la fonction loi_normale pour qu'on puisse faire des tests (ou c'est une fonction de toolbox) ?
    merci beaucoup d'avoir repondu je t'envois:

    1°) la fonction: loi normale
    le programme d'optimisation par descente de gradient

    2°) le programme d'optimisation par newton

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Je viens de faire tourner les deux programmes différents.(pas jusqu'au bout par manque de temps...) . J'arrive aux mêmes résultats en modifiant ton programme numéro 2.

    Au lieu d'avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    theta=theta-J/gradient_J(1);
        nu=nu-J/gradient_J(2);
    J'ai remplacé par une multiplication comme dans ton programme 1 .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    theta=theta-J*gradient_J(1);
        nu=nu-J*gradient_J(2);
    Je ne sais pas si ca vient de là. Quoiqu'il en soit, j'ai eu des "warning divided by 0" sur ton programme 2 avant de faire les modifications. Si la cause de la divergence ne provient pas de la multiplication que j'ai modifié, ca vient peut être de là. A ce moment là, il faudra vérifier tes valeurs gradient_J(1) et gradient_J(2)

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Merel Voir le message
    theta=theta-J*gradient_J(1);
    nu=nu-J*gradient_J(2);
    [/code]

    Je ne sais pas si ca vient de là. Quoiqu'il en soit, j'ai eu des "warning divided by 0" sur ton programme 2 avant de faire les modifications. Si la cause de la divergence ne provient pas de la multiplication que j'ai modifié, ca vient peut être de là. A ce moment là, il faudra vérifier tes valeurs gradient_J(1) et gradient_J(2)
    merci beaucoup d'avoir pris le temps de regarder!

    en faite dans la formule se n'est pas une multiplication mais bien une division, peut etre que cela vient de la division par une 0 qui doit apparaitre....?...

    je sais pas trop d'où ca vient, peut etre que la fonction est pas appropriée pour ce type d'algo car des derivée trop faibles....(tres bizarre car on est avec une loi normale...)

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    je ne comprends pas bien les problemes que je rencontre, es ce que quelqu'un à déjà effectué des algorithmes de newton raphson ou autre mais sans l'expression de la fonction à minimiser?

  11. #11
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Je veux effectuer une methode de Newton Raphson
    j'utilise des resultats issu d'une fonction que je ne connais pas
    Cette discussion tourne en rond parce que tu as posé le problème à l'envers. Pour clarifier les choses, applique la démarche proposée par G. Polya:
    1. Quel est le problème? Dis-nous ce que tu cherches, ce qui sera la solution finale de ton projet, mieux, pourquoi tu la cherches.
    2. Quelles sont les données? Dis nous ce que tu sais, par exemple si ce sont des données expérimentales, ce qu'elles représentent, sous quelle forme elles se trouvent.
    3. Quels algorithmes utiliser Dis-nous ce que tu as essayé, pourquoi et ce que ça t'a donné. C'est pour cette étape que nous pourrons t'aider.

    Jean-Marc Blanc

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci de ta reponse et pour le conseil;

    Citation Envoyé par FR119492 Voir le message
    Quel est le problème? Dis-nous ce que tu cherches, ce qui sera la solution finale de ton projet, mieux, pourquoi tu la cherches.
    Je cherche à minimiser l'erreur entre une courbe connue (experimentale) et une courbe calculé avec deux paramètres.
    Dans mon exemple j'ai pris une loi normale dont l'expression et connu et en minimisant l'erreur entre cette courbe et une autre loi normale dont je fais varier les parametres j'essai de retomber sur la 1ere.

    Ici Je fais comme si je ne connaissais pas l'expression de la fonction loi normale de base car dans mon probleme réel en fait je ne connais pas l'expression analytique de celle ci (ici ce n'est qu'un cas un peu simplifier de ce que je veux faire mais si je resout ce cas simplifié alors pour le reste ca sera bon).

    Citation Envoyé par FR119492 Voir le message
    Quelles sont les données? Dis nous ce que tu sais, par exemple si ce sont des données expérimentales, ce qu'elles représentent, sous quelle forme elles se trouvent.
    normalement dans mon probleme j'ai des resultats experimentaux connu et des resultats calculés fonction de 2parametres, les resultats sont des pression pour plusieurs abscisses.
    les resultats experimentaux sont sous forme de vecteur tout comme les resultats calculé.
    A partir de ces vecteurs je calcul une erreur J=yexp'*ycalculé
    si j'arrive à minimiser cette erreur en faisant varier les parametres de calcul alors j'aurais trouvé l'expression de mes 2parametres.


    Citation Envoyé par FR119492 Voir le message
    Quels algorithmes utiliser Dis-nous ce que tu as essayé, pourquoi et ce que ça t'a donné. C'est pour cette étape que nous pourrons t'aider.
    Il y a 3principaux algorithmes à utiliser:
    - Descente de gradient: (le plus simple, mais le pas est un pas choisi par l'utilisateur se qui peut provoquer des lenteurs de convergence extreme)
    - Newton raphson: bon algorithme mais peut rencontrer quelques problemes
    - levenberg marquardt: niquel c'est l'algorithme que je veux reellement implémenter

    ==>
    Pour la descente de gradient mon programme semble tres bien fonctionner car je retrouve les resultats tres proches de theta=5,65 et nu=0,9 se qui est bien les parametres de la loi de depart que j'ai rentrée.

    ==>
    Newton raphson: c'est pour cette algo que je vous sollicite car les calculs divergent, en faisant des test j'ai vu que les resultats se dirigent tres vite à des valeures infinie alors que pour l'algo ci dessus ca fonctionne tres bien...

  13. #13
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    c'est pour cette algo que je vous sollicite car les calculs divergent, en faisant des test j'ai vu que les resultats se dirigent tres vite à des valeures infinie
    C'est un phénomène qui se produit assez souvent avec la méthode de Newton-Raphson, en particulier si on part avec des valeurs très éloignées de la solution. Il est bien expliqué dans "Numerical Recipes". En attendant, essaie avec d'autres valeurs initiales.
    Jean-Marc Blanc

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    Salut!

    C'est un phénomène qui se produit assez souvent avec la méthode de Newton-Raphson, en particulier si on part avec des valeurs très éloignées de la solution. Il est bien expliqué dans "Numerical Recipes". En attendant, essaie avec d'autres valeurs initiales.
    Jean-Marc Blanc
    je vais regarder cela merci

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    je pense que cela aussi est dû au type de fonction que je veux minimiser car cette algorithme est reconnu pour diverger dans certains cas

    merci de votre aide en tout cas

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

Discussions similaires

  1. Optimisation avec la methode de Newton raphson et Dichotomie
    Par Mehdi_youssoufi dans le forum Mathématiques
    Réponses: 0
    Dernier message: 12/06/2014, 16h08
  2. Methode Newton Raphson pour cellule photovoltaïque
    Par the cameleon dans le forum MATLAB
    Réponses: 2
    Dernier message: 21/03/2013, 09h27
  3. la methode de newton raphson(essai)
    Par crippella dans le forum MATLAB
    Réponses: 17
    Dernier message: 10/03/2010, 16h17
  4. la methode newton-raphson sur matlab
    Par crippella dans le forum Mathématiques
    Réponses: 2
    Dernier message: 02/02/2010, 11h27
  5. pb de solution methode de newton-raphson
    Par laroche1 dans le forum MATLAB
    Réponses: 2
    Dernier message: 14/03/2008, 00h03

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