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 :

Résolution de système d'équation par méthode du gradient conjugué


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut Résolution de système d'équation par méthode du gradient conjugué
    Bonjour,
    je suis débutante en matlab, j'ai essayé de faire un programme pour résoudre un système linéaire par la méthode du gradient conjugué de Dai-Yuan,
    il y a une faute dans la ligne 21 (calcul du gradient) mais je ne vois pas..

    voici le programme :
    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
     
    function [x]= daiyuan(A,B,x1,epsilon,maxiter)
    % Méthode de Dai Yuan pour la résolution d'un problème linéaire Ax=B
    % Entrée :   A       = la matrice donnée
    %             B       = vecteur donné
    %             x1      = le point de départ
    %            epsilon = tolérance du test d'arret, valeur par défaut 1e-8
    %           maxiter = nombre maximum d'itérations, valeur par défaut 100
    % Sortie :  x       = solution
    % Valeurs par défaut
    if nargin < 4, epsilon = 1e-8; end
    if nargin < 5, maxiter = 100; end
    A = input ('donner la matrice A =')
    b = input ('donner le vecteur b =')
    x1 = input ('donner le point du départ x1 =')
    iter = 1; % Compteur des itérations
    g = A*x1-b;
    while iter <= maxiter
    if norm(g) <= epsilon, break, end
            if iter ==1
              d == -g, a == norm(g)^2/dot(A*d,d), x_ == x1 + d.^a...
              g_ == A*x_- b, p == norm(g_)^2/dot(g_-g,d), d_ == -g_+ d.^p;
            else a == norm(g)^2/dot(A*d,d), x_ == x + d.^a,...
                g_== A*x_-b, p == norm(g_)^2/dot(d,g_-g), d_ == -g_+ d.^p; end
        x == x_;
        g == g_;
        d == d_;
        iter == iter +1; end
    if iter > maxiter, warning('nombre maximum d itération atteint'), end
    l'algorithme de Dai Yuan (pièce jointe)

    Aidez moi s'il vous plait!!
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Je n'ai pas cherché à comprendre ton problème, ni à savoir où était la ligne 21 (pas facile à voir comme ça) mais attention le signe == est utilisé uniquement pour la comparaison et j'ai l'impression que tu l'utilises aussi pour l'allocation des variables.
    donc plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    d = -g, a = norm(g)^2/dot(A*d,d), x_ = x1 + d.^a...
              g_ = A*x_- b, p = norm(g_)^2/dot(g_-g,d), d_ = -g_+ d.^p;
            else a = norm(g)^2/dot(A*d,d), x_ = x + d.^a,...
                g_= A*x_-b, p = norm(g_)^2/dot(d,g_-g), d_ = -g_+ d.^p; end
        x = x_;
        g = g_;
        d = d_;
        iter = iter +1;

  3. #3
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    Bonjour,
    Merci beaucoup pour votre réponse, j'ai réctifié mais il y a toujours le problème...(la ligne colorée en rouge)
    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
    
    function [x] = daiyuan(A,b,x1,epsilon,maxiter)
    % Méthode de Dai Yuan pour la résolution d'un problème linéaire Ax=B
    % Entrée : A       = la matrice donnée
    %          B       = vecteur donné
    %          x1      = le point de départ
    %          epsilon = tolérance du test d'arret, valeur par défaut 1e-8
    %          maxiter = nombre maximum d'itérations, valeur par défaut 1000
    % Sortie : x       = solution
    % Valeurs par défaut
    if nargin < 4, epsilon = 1e-8; end
    if nargin < 5, maxiter = 1000; end
    A = input ('donner la matrice A =')
    b = input ('donner le vecteur b =')
    x1 = input ('donner le point du départ x1 =')
    iter = 1; % Compteur des itérations
    g = A*x1-b;
    while iter <= maxiter
    if norm(g) <= epsilon, break, end
            if iter == 1
              d = -g, a = norm(g)^2/dot(A*d,d), x_ = x1 + d.^a...
              g_ = A*x_- b, p = norm(g_)^2/dot(g_-g,d), d_ = -g_+ d.^p;
            else a = norm(g)^2/dot(A*d,d), x_ = x + d.^a,...
                g_ = A*x_-b, p = norm(g_)^2/dot(d,g_-g), d_ = -g_+ d.^p; end
        x = x_;
        g = g_;
        d = d_;
        iter = iter +1; end
    if iter > maxiter, warning('nombre maximum d itération atteint'), end

  4. #4
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    Bonjour,
    me voilà!!! je suis hyper contente car j'ai trouvé la faute..
    je tiens à remercier caro95470 pour son aide,
    voici le programme :

    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
     
    function [x] = daiyuan(A,b,x1,epsilon,maxiter)
    % Méthode de Dai Yuan pour la résolution d'un problème linéaire Ax=B
    % Entrée : A       = la matrice donnée
    %          B       = vecteur donné
    %          x1      = le point de départ
    %          epsilon = tolérance du test d'arret, valeur par défaut 1e-8
    %          maxiter = nombre maximum d'itérations, valeur par défaut 1000
    % Sortie : x       = solution
    % Valeurs par défaut
    if nargin < 4, epsilon = 1e-8; end
    if nargin < 5, maxiter = 1000; end
    A = input ('donner la matrice A =')
    b = input ('donner le vecteur b =')
    x1 = input ('donner le point du départ x1 =')
    iter = 1; % Compteur des itérations
    g = A*x1-b;
    while iter <= maxiter
    if norm(g) <= epsilon, break, end
            if iter == 1
              d = -g, a = norm(g)^2/dot(A*d,d), x_ = x1 + d.^a,...
              g_ = A*x_- b, p = norm(g_)^2/dot(g_-g,d), d_ = -g_+ d.^p;
            else a = norm(g)^2/dot(A*d,d), x_ = x + d.^a,...
                g_ = A*x_-b, p = norm(g_)^2/dot(d,g_-g), d_ = -g_+ d.^p; end
        x = x_;
        g = g_;
        d = d_;
        iter = iter +1; end
    if iter > maxiter, warning('nombre maximum d itération atteint'), end

    Juste pour l'information, si vous changer la variante "p", vous aurez les autres types du gradient conjugué (Fletcher Reeves, Polak Ribière Polyak, Descente conjugué..)
    bon courage
    merci encore !!

  5. #5
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 36
    Par défaut
    Bonjour,
    me voilà encore, j'ai fait une faute dans mon programme ,
    c'est dans le calcul des itérés, j'ai corrigé
    voici le programme :

    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
     
     
    function [x] = daiyuan(A,b,x1,epsilon,maxiter)
    % Méthode de Dai Yuan pour la résolution d'un problème linéaire Ax=B
    % Entrée : A       = la matrice donnée
    %          B       = vecteur donné
    %          x1      = le point de départ
    %          epsilon = tolérance du test d'arret, valeur par défaut 1e-8
    %          maxiter = nombre maximum d'itérations, valeur par défaut 1000
    % Sortie : x       = solution
    % Valeurs par défaut
    if nargin < 4, epsilon = 1e-8; end
    if nargin < 5, maxiter = 1000; end
    A = input ('donner la matrice A =')
    b = input ('donner le vecteur b =')
    x1 = input ('donner le point du départ x1 =')
    iter = 1; % Compteur des itérations
    g = A*x1-b;
    while iter <= maxiter
    if norm(g) <= epsilon, break, end
            if iter == 1
              d = -g, a = norm(g)^2/dot(A*d,d), x_ = x1 + d*a,...
              g_ = A*x_- b, p = norm(g_)^2/dot(g_-g,d), d_ = -g_+ d*p;
            else a = norm(g)^2/dot(A*d,d), x_ = x + d*a,...
                g_ = A*x_-b, p = norm(g_)^2/dot(d,g_-g), d_ = -g_+ d*p; end
        x = x_;
        g = g_;
        d = d_;
        iter = iter +1; end
    if iter > maxiter, warning('nombre maximum d itération atteint'), end

  6. #6
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Bonjour,
    si je peux me permettre quelques conseils purement sur la programmation :
    - Pour rendre la lecture plus agréable mettre une seule instruction par ligne
    - Pour ne pas avoir plein d'affichages (à moins que cela ne soit voulu), remplacer les virgules par des point-virgules

    Et je te propose donc ce code qui peut aussi optimiser le temps de calcul :
    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
    function [x] = daiyuan(A,b,x1,epsilon,maxiter)
    % Méthode de Dai Yuan pour la résolution d'un problème linéaire Ax=B
    % Entrée : A       = la matrice donnée
    %          B       = vecteur donné
    %          x1      = le point de départ
    %          epsilon = tolérance du test d'arret, valeur par défaut 1e-8
    %          maxiter = nombre maximum d'itérations, valeur par défaut 1000
    % Sortie : x       = solution
    % Valeurs par défaut
    if nargin < 4
       epsilon = 1e-8; 
    end
    if nargin < 5
       maxiter = 1000; 
    end
    A = input ('donner la matrice A =');
    b = input ('donner le vecteur b =');
    x1 = input ('donner le point du départ x1 =');
    g = A*x1-b;
    %Faire ici le calcul pour iter=1 évite de faire maxiter-1 tests dans la boucle.
    d = -g;
    a = norm(g)^2/dot(A*d,d);
    x_ = x1 + d*a;
    g_ = A*x_- b;
    p = norm(g_)^2/dot(g_-g,d);
    d_ = -g_+ d*p;
    x = x_;
    g = g_;
    d = d_;      
    %on boucle maintenant à partir du pas 2
    for iter = 2:maxiter
       if norm(g) <= epsilon
          break
       end
       a = norm(g)^2/dot(A*d,d);
       x_ = x + d*a;
       g_ = A*x_-b;
       p = norm(g_)^2/dot(d,g_-g);
       d_ = -g_+ d*p;
       x = x_;
       g = g_;
       d = d_;
    end
    if norm(g) > epsilon %à la fin des itérations la condition n'est toujours pas vraie
       warning('nombre maximum d''itérations atteint');
    end
    J'espère qu'il n'y a pas de coquilles, je n'ai pas testé, n'ayant aucune idée des valeurs d'entrées qu'il faut mettre.

    D'ailleurs question subsidiaire : tu as en entrées de ta fonction les variables A,b et x1 mais elles ne servent à rien puisque tu les écrases dès le début de ton programme en demandant à l'utilisateur de les renseigner

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

Discussions similaires

  1. Résolution système d'équation par la méthode SOR
    Par seanp223 dans le forum Mathématiques
    Réponses: 9
    Dernier message: 25/05/2011, 15h35
  2. Probléme résolution de systèmes d'équations en c
    Par nissalabella dans le forum Débuter
    Réponses: 4
    Dernier message: 11/03/2009, 11h45
  3. Résolution de systèmes d'équations linéaires
    Par Eric06 dans le forum MATLAB
    Réponses: 3
    Dernier message: 14/06/2008, 17h19
  4. Résolution de système d'équations
    Par RS4_69 dans le forum MATLAB
    Réponses: 1
    Dernier message: 05/02/2008, 12h12
  5. Résolution de système d'équation d'ellipse
    Par soeursourire dans le forum MATLAB
    Réponses: 1
    Dernier message: 13/02/2007, 18h42

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