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 d'une équation en ajustant un variable


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut Résolution d'une équation en ajustant un variable
    Bonjour,

    je suis un peu coincé, je souhaite résoudre une équation de la forme avec Matlab :

    y = a*x + b

    Ca a l'air trop simple mais la vraie équation est beaucoup plus complexe et on ne peut pas obtenir la solution en le résolvant directement.

    dont on connait la valeur de b et de a (calculés avant) et on voudrait ajuster la variable x afin que le résultat y soit le plus proche d'une valeur qu'on souhaite avoir (par exemple 0).

    Avez-vous une idée d'un outil Matlab ?

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    salut

    tu as des fonctions d’optimisation pour cela :
    fzero, fminsearch, fminbnd


    exemple avec ta fonction simpliste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    f = @(x) 2*x+3;
    y = fzero(f,0)
     
    y =
     
       -1.5000

    l'Optimization toolbox rajoute des méthodes (fmincon, linprog, quadprog ...)

    et il y a également la symbolic math toolbox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    syms a b x
    solve(a*x + b,'x')
     
    ans =
     
    -b/a

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Merci d'y avoir répondu rapidement...

    deux petits bémols à savoir :

    la valeur "a" n'est pas sous une forme de chiffre (comme 2 ou 2,0) mais plutôt "a" car il est calculé avant et je ne peux pas mettre exprès sa valeur dans l'équation.

    Ensuite j'ai testé le 'solve' mais ce n'est pas la forme de la solution qui m'intéresse (d'ailleurs y'en a pas et solve n'y est pas arrivé) mais sa valeur...

    Bon je vais te montrer l'équation en question pour que tu puisses mieux mesurer la difficulté :


    abs((R-1)/(R+1))-(f/log(2))*acosh(exp((log(2)/2*f)))

    R est une valeur calculée avant (et je ne peux pas mettre une valeur dessus)
    f est la fameuse variable à ajuster

    Il faut juste que cette équation soit nulle (ou être le plus proche possible de 0).

    Le "Solveur" d'Excel y arrive bien facilement... j'aimerai bien le mettre dans Matlab...

  4. #4
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    et un truc comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    func = @(R,f) abs((R-1)/(R+1))-(f/log(2))*acosh(exp((log(2)/2*f)));
    R = 1; % calculé par un autre process
    f0 = 0; % point initial de l'optimisation
    y =fminsearch(@(f) abs(func(R,f)),f0); 
    func(R,y)
    j'ai mis une valeur absolue pour chercher la valeur la plus proche de 0

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    J'y avais pensé

    voici la reformulation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        R = 0.88520531 (calculé auparavant)
     
        func = @(R,f) (abs((R-1)/(R+1)))-((f/log(2))*acosh(exp((log(2)/(f/2)))));
     
        f0 = 0.998; % point initial de l'optimisation 
     
        [y,fval] =fminsearch(@(f) func(R,f),f0)
    J'ai lancé sur Matlab et ca me donne !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Exiting: Maximum number of function evaluations has been exceeded
             - increase MaxFunEvals option.
             Current function value: -379625062.435454 
     
     
    y =
     
       1.2487e+16
     
     
    fval =
     
      -3.7963e+08
    Excel me donne : f = 0.998713672685129 pour une valeur de -0.000000000037.

  6. #6
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    fminsearch cherche un minimum, pas un point proche de 0 !!
    si la fonction va dans le negatif (c'est le cas) elle te donnera une solution négative
    d'ou la valeur absolue dans ma suggestion

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Re,

    J'ai été absent du forum pour avoir creusé ta solution de fminsearch.

    Alors y'a eu des fautes sur l'équation en question. Voici l'équation corrigée (vérifié et revérifié plusieurs fois) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abs((R-1)/(R+1))-(f/log(2))*acosh(exp(log(2)/f)/2)
    avec :

    R = 0.885205314009662 (au départ j'avais mis que 4 décimaux dans le programme mais avec de long décimaux ca change la donne).

    J'ai mis ton code dans mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        func = @(R,f) abs((R-1)/(R+1))-(f/log(2))*acosh(exp(log(2)/f)/2);
        f0 = 0,99; % point initial de l'optimisation
        y =fminsearch(@(f) abs(func(R,f)),f0); 
        func(R,y)
    Et ça me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Exiting: Maximum number of function evaluations has been exceeded
             - increase MaxFunEvals option.
             Current function value: Inf 
     
     
    ans =
     
      -Inf
    En regardant le solveur d'Excel, il me demande avant de démarrer quelle valeur je souhaite m'approcher. Est ce que fminsearch possède cet option ? ou un autre solveur de Matlab ?

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    C'est bon j'ai trouvé la solution !! Je la donne pour ceux qui ont ou auront le même souci à l'avenir...

    En fait j'avais donné un mauvais départ au solveur. J'ai donné f = 0.99 qui donnait à l'équation un résultat négatif et donc le solveur avait du mal à résoudre (si on lui demande un résultat positif).

    Donc je lui ai donné f = 1.00 -> l'équation est positif et le solveur peut travailler plus facilement .

    Il me donne des résultats corrects (environ 0.00001) un peu moins bien que le solveur d'Excel (0.0000001). Cela doit être du au forçage du solveur de chercher que des valeurs absolues alors qu'Excel n'est pas contraint dessus .

    Merci à toi le fab !

    Problème résolu !

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

Discussions similaires

  1. Résolution d'une équation à 2 variables
    Par johnraikonen dans le forum Mathématiques
    Réponses: 8
    Dernier message: 24/01/2011, 18h17
  2. Résolution d'une équation trigonométrique
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 20/08/2009, 18h47
  3. Résolution d'une équation
    Par johnvox dans le forum Delphi
    Réponses: 6
    Dernier message: 13/02/2007, 11h04
  4. Réponses: 1
    Dernier message: 08/12/2006, 18h13
  5. Résolution d'une équation par Gauss
    Par rahmani01 dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/11/2006, 23h15

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