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 :

Algorithmie sur MATLAB


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Par défaut Algorithmie sur MATLAB
    Bonjour
    Dans le cadre d'un projet j'ai tenté de coder la méthode de brent pour trouver le zéro d'une fonction afin de pouvoir faire des tests sur les différents critères d'arrêts des algorithmes.
    Toutefois j'ai un soucis car mon algo de converge pas vers la valeure escomptée j'aurais donc aimé savoir si vous pouviez m'aider.

    Voici le code en question
    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
    % Calcul des racines d'une équation par la méthode de Brent
    % Benjamin AUGUSTIN, Dumery Quentin et Tang Lichen - INSA-Lyon - 12 Mai 2009
    % 
    function [xs,n,lint] = brent(f,a,b,tol,nmax)
    %
    fa=f(a); fb=f(b);
    if sign(fa) == sign(fb)
      disp('Attention, problème de signe !'),return
    end
    %
    if abs(fa) < abs(fb)
      tmp=fa;
      fa=fb;
      fb=tmp;
    end
    %
    c=a;
    mflag=1;
    n=0;
    while (abs(b-a)>tol+eps*abs(a)) & (n<nmax) & (fb~=0)
       n=n+1;
       lint(n)=abs(b-a);
       fc=f(c);
       if (fa~=fc) & (fb~=fc)
           xs(n)=(a*fb*fc)/((fa-fb)*(fa-fc))+(b*fa*fc)/((fb-fa)*(fb-fc))+(c*fa*fb)/((fc-fa)*(fc-fb));
       else
           xs(n)=b-fb*(b-a)/(fb-fa);
       end
       if (xs(n)<(3*a+b)/4) | (xs(n)>b) | (mflag & (abs(xs(n)-b)>=(abs(b-c)/2))) | (~mflag & (abs(xs(n)-b)>=(abs(c-d)/2)));
           xs(n)=(a+b)/2;
           mflag=1;
       else
           mflag=0;
       end
       fs=f(xs(n));
       d=c;
       c=b;
       if fa*fs<0
          b=xs(n);
       else
           a=xs(n);
       end
       fa=f(a);
       fb=f(b);
       if abs(fa)<abs(fb)
          tmp=fa;
          fa=fb;
          fb=tmp;
       end
    end
    Je vous remercie d'avance car je ne voit vraiment pas d'ou peut bien provenir mon erreur.

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Par défaut
    Bonsoir,

    Aurais-tu un exemple concret (avec des valeurs d'entrée et le résultat souhaité)?

    Sinon, essaye d'indenter ton code (Ctrl+A et Ctrl+I), tu y gagneras en lisibilité

    Bonne soirée,
    Duf

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Par défaut
    Bonsoir
    Merci de ton intérêt
    Par exemple dans le cas de la fonction exp(x²)-10^-9
    je rentre [xs,n,test]=brent(f,4,5,1e-14,20000)
    je devrais obtenir un résultat à 10^-14 près soit 4.552281388155439e+00
    mais au lieu de cela au bout de 48 itérations j'obtient 4.991236217746922e+00
    La variable test qui indique la distance [ab] est égale à 1.332267629550188e-14

    Ce qui explique que l'algo soit sorti de la boucle mais je ne comprend pas pourquoi il converge vers une fausse valeure

    Merci d'avance pour votre aide

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Bonjour.
    je rentre [xs,n,test]=brent(f,4,5,1e-14,20000)
    f(4) et f(5) sont de même signe !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Par défaut
    Bonjour
    f(4) et f(5) ne sont pas de même signe vu que la fonction est exp(x^2)-10^-9 et que le zéro est de 4.552281388155439e+00

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >> f(4)
     
    ans =
     
       1.1154e-07
     
    >> f(5)
     
    ans =
     
      -9.8611e-10

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Bonjour.
    f(4)

    ans =

    1.1154e-07
    Je ne comprends pas le calcul.
    exp(4^2)-10^(-9)
    ans =

    8886110.5

Discussions similaires

  1. [MEX] Modifier des Mex-Files Matlab 7 pour utilisation sur Matlab 5.3
    Par mathieu2703 dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/08/2007, 12h20
  2. Matrice indicée sur matlab
    Par Surf!ng_jOe dans le forum MATLAB
    Réponses: 2
    Dernier message: 27/07/2007, 14h28
  3. Problème variable locale sur MATLAB
    Par nuans dans le forum MATLAB
    Réponses: 10
    Dernier message: 12/04/2007, 10h34
  4. Nombre pair sur Matlab
    Par cricri04 dans le forum MATLAB
    Réponses: 2
    Dernier message: 16/03/2007, 16h46
  5. Un nouveau qui a besoin d'aide sur MATLAB
    Par bf491499 dans le forum MATLAB
    Réponses: 4
    Dernier message: 26/02/2007, 16h10

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