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 :

Trouver une valeur approchée dans un vecteur


Sujet :

MATLAB

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 173
    Points : 67
    Points
    67
    Par défaut Trouver une valeur approchée dans un vecteur
    Bonsoir à tous,

    J'ai deux questions pour vous :
    1) Mon if ne marche pas alors que les deux variables sont égales
    2) Je voudrai trouver une valeur approchée et non une valeur juste

    La valeur 0.0679 étant la première valeur du vecteur y

    Voici mon code :
    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
    function [beta0]=tableF(m1,m2)
     
    b_cal=m1./(sqrt(m2));
     
    x=0.1:0.01:10;
    y=F(x);
     
    val_rechercher=0.0679;
     
    % Recherche dans F(x) la position valeur la plus proche de b_cal
        for i=1:length(y)
            val=y(i);
            if val == val_rechercher
                indice=i;
                break;
            end
     
        end
     
    % Recherche de la valeur de cette position dans le vecteur des beta
    beta0=x(indice);
     
     
     
    end
    Merci à ceux qui pourront m'aider

  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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Plutôt que de faire un test d'égalité avec ==, fait plutôt un test sur la valeur absolue de la différence

    Voir la FAQ : Pourquoi 0.3-0.2-0.1 est-il différent de 0 ?

    Dans ton cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if abs(val - val_rechercher) < tol
    Avec tol, l'écart maximal autorisé pour considérer que les 2 valeurs sont égales.

    Une petite remarque, dans MATLAB tu peux éviter d'utiliser la boucle FOR, en remplaçant les lignes 10 à 18 par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    indice = find(abs(y - val_rechercher) < tol, 1, 'first');
    Et tu pourrais même sans doute améliorer encore un peu en utilisant l'indexation logique (à vérifier que ca fonctionne bien sur ton code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    beta0 = x(abs(y - val_rechercher) < tol);
    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 173
    Points : 67
    Points
    67
    Par défaut
    super merci je regarderai ca.

    J'étais passé sur ca
    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
    function [beta0]=tableF(m1,m2)
     
    b_cal=m1./(sqrt(m2));
     
    x=0.1:0.01:10;
    y=F(x);
     
    val_rechercher=b_cal;
    eps=0.010;
     
    % Recherche dans F(x) la position valeur la plus proche de b_cal
        for i=1:length(y)
            val=y(i);
            binf=val_rechercher-eps;
            bsup=val_rechercher+eps;
            if (val >= binf) && (val <= bsup)
                indice=i;
                goto(24);
            end
     
        end
     
    % Recherche de la valeur de cette position dans le vecteur des beta
    beta0=x(indice);
     
     
     
    end

  4. #4
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Fait attention, eps est une variable native de matlab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >> eps
    ans =
         2.22044604925031e-016
    Il vaut mieux en général ne pas y toucher...

  5. #5
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    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 882
    Points : 3 432
    Points
    3 432
    Par défaut
    Citation Envoyé par duf42 Voir le message
    Une petite remarque, dans MATLAB tu peux éviter d'utiliser la boucle FOR, en remplaçant les lignes 10 à 18 par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    indice = find(abs(y - val_rechercher) < tol, 1, 'first');
    Et tu pourrais même sans doute améliorer encore un peu en utilisant l'indexation logique (à vérifier que ca fonctionne bien sur ton code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    beta0 = x(abs(y - val_rechercher) < tol);
    Duf
    autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [~,indice] =  min(abs(y - val_rechercher));

  6. #6
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Citation Envoyé par le fab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [~,indice] =  min(abs(y - val_rechercher));
    C'est sans doute la meilleure solution en effet
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 173
    Points : 67
    Points
    67
    Par défaut
    Merci beaucoup à vous.
    Vous êtes au top.

    Un petit rappel sur l'utilisation du goto? pour sortir d'une boucle par exemple

  8. #8
    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,

    Citation Envoyé par Stepsbysteps Voir le message
    Un petit rappel sur l'utilisation du goto? pour sortir d'une boucle par exemple
    C'est très simple, le goto n'existe pas dans matlab.

    Si tu veux sortir de la boucle avant la fin du compteur, tu peux utiliser l'instruction break.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  9. #9
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Pour sortir d'une boucle, il n'y a que break, return, ou throw une error

    Attention, ceci ne marche pas non plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for k=1:10;disp(k);k=1000;end % pas de sortie boucle apres k=1 !!!

Discussions similaires

  1. [XL-2002] Trouver une valeur specifique dans les colonnes avec une Macro
    Par sergio_gr66 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/07/2009, 11h20
  2. [Débutant] trouver une valeur précise dans une matrice
    Par lloyd_r dans le forum MATLAB
    Réponses: 8
    Dernier message: 05/06/2009, 16h55
  3. Trouver une valeur majoritaire dans une liste
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 22/08/2007, 17h48
  4. trouver une valeur dans un intervalle
    Par gwenhael dans le forum Requêtes
    Réponses: 3
    Dernier message: 16/09/2006, 11h21
  5. Trouver une valeur qui n'est pas dans un champ
    Par eric41 dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/05/2006, 16h48

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