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 :

Meilleure façon de résoudre mon equation


Sujet :

MATLAB

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut Meilleure façon de résoudre mon equation
    Bonjour, je cherche à résoudre une équation et à optimiser cette résolution. Or, Matlab offrant plusieurs possibilités pour cela, je suis un peu perdu quant au choix de la plus adaptée à mon problème.

    J'ai une formule assez compliquée avec une seule variable que nous allons appeler f(z) et je cherche tous les z tels que abs(f(z))=2.

    Autant que je sache, je peux faire ces trois choses pour trouver les solutions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f = myfunction;
    f = abs(f)-2;
    sol = fzero(f,z);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f = myfunction;
    f = abs(abs(f)-2);
    sol = fminsearch(f,z);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    syms z;
    f = myfunction;
    sol = double(solve(f==2))
    Je suppose qu'utiliser syms n'est pas le plus rapide donc ce sera probablement une des deux autres. Mais laquelle devrais-je utiliser ? De plus, peut-être aussi que d'autres fonctions similaires existent que je ne connais pas. De plus, je galère un peu avec les options et sur comment optimiser la recherche de solutions. Par exemple, je connais les valeurs minimale et maximale que z peut potentiellement prendre et je suppose que rentrer ça pourrait optimiser le temps.

    Dernière chose, pour une fonction, j'ai calculer cette dernière en fonction de z pour voir à quoi elle ressemblait et il y avait quatre solutions. Pourtant, en utilisant les méthodes syms et fminsearch, je n'en trouve que deux et ce ne sont pas les mêmes. Et c'est aussi pour cela que je poste car cela signifie que je les utilise mal.

  2. #2
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    les méthodes de résolution numérique ne trouvent qu'un seul zéro. C'est à toi de définir l'intervalle à l'intérieur duquel se trouve le zéro que tu cherches.
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Merci. Du coup, je dois la faire tourner en boucle jusqu'à ce qu'elle ne trouve plus de solution. Mais entre fminsearch et fzero, laquelle conviendrait mieux ? et aussi, comme proposer un intervale ?

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2014
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 109
    Points : 151
    Points
    151
    Par défaut
    comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fun=@(x) f(x)
    x=fminsearch(fun,[a,b])

  5. #5
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par elglantosimpatico Voir le message
    Mais entre fminsearch et fzero, laquelle conviendrait mieux ?
    Dans le cas précis : fzero car tu veux le zéro d'une fonction qui coupe les abscisses

    Citation Envoyé par elglantosimpatico Voir le message
    et aussi, comme proposer un intervale ?
    C'est à toi de savoir où sont tes racines. Je ne connais pas de recette miracle pour ça.
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  6. #6
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Merci pour les réponses.

    En fait, j'ai regardé fzero et je ne peux pas l'utiliser avec des bornes car pour fzero, la valeur de la fonction au niveau des bornes doit avoir un signe opposé ce qui n'est pas nécessairement mon cas. J'utilise donc fminbnd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x1 = fminbnd(fun,x01,x02);
    Avec x01<x02 qui sont mes bornes.

    Du coup, je pensais aller de x01 vers x02 et chercher la racine la plus proche de x01. Ensuite, je pensais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    x2 = fminbnd(fun,x1+dx,x02);
    avec dx un petit pas pour m'éloigner légèrement de la racine.

    Donc je trouverais la seconde racine et ainsi de suite. L'exemple que j'ai choisit pour essayer a quatre racines : x1 < x2 < x3 < x4. Cependant, lorsque je fais ce que j'ai présenté juste au-dessus, cela me donne la racine la plus proche de x02 soit x4 à la place de x1. Ok, pas de soucis, je vais donc faire en sens inverse. Mais lorsque je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x4 = fminbnd(fun,x01,x02);
    x3 = fminbnd(fun,x01,x4-dx);
    Tout en faisant attention à ce que x4-dx > x3.
    Alors à la place de me donner la racine juste avant x4, il me donne la seconde, x2. Il doit bien y avoir un moyen systématique de résoudre ça en faisant en sorte que fminbnd retourne toujours la racine la plus proche d'une des bornes mais je ne trouve pas comment.

Discussions similaires

  1. Meilleur façon de résoudre le problème du sac à dos
    Par K-you dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 01/11/2010, 18h36
  2. Réponses: 1
    Dernier message: 08/08/2007, 08h45
  3. Meilleure façon de créer mon MCD
    Par yamino dans le forum Bases de données
    Réponses: 7
    Dernier message: 13/07/2007, 13h39
  4. Liste d'objets, quel est la meilleure façon
    Par shirya dans le forum C++
    Réponses: 2
    Dernier message: 08/12/2005, 16h59
  5. Est ce bien la meilleure façon de faire un histogramme ?
    Par rvzip64 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 10/05/2005, 12h41

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