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 :

Recherche d'un maximum ou d'un minimum seulement entre certaines bornes


Sujet :

MATLAB

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut Recherche d'un maximum ou d'un minimum seulement entre certaines bornes
    Bonjour à tous,

    J'ai actuellement besoin d'utiliser la fonction min (ou la fonction max) afin de calculer un maximum ou un minimum. Le souci c'est que je voudrais utiliser une telle fonction mais seulement entre deux bornes. Le problème est assez tordu et je n'arrive plus à y voir clairement. Voici d'abord une représentation imagée d'une certaine courbe A1 :



    Ce qui m'intéresse c'est de calculer les coordonnées des deux pics extrema ici entre les indices 45 et 65 à peu près. Il est très clair que l'on a ici un maximum et un minimum absolu. Mais il arrive qu'entre ces bornes 45 et 55 les deux pics dont je parle ne soient pas les plus grand ou les plus petits, le maximum étant par exemple inférieur à ce que j'appellerai la ligne de base autour de 50. Et c'est là que commencent les problèmes : jusque-là j'utilisais une fonction spéciale (disponible sur mathworks) et appelée extrema qui trouve tous les pics de la courbe et les restituent puis je stocke moi-même dans une matrice avec deux colonnes abscisse/ordonnée l'ensemble des pics trouvés (minima ou maxima séparés). Je ne vais pas revenir sur cette fonction qui me fournit un résultat correct. Après son utilisation, je trie simplement la matrice par rapport à la première colonne afin d'avoir les abscisses dans l'ordre, ce qui donne ici :

    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
    2	49,312
    6	48,649
    9	43,899
    11	45,072
    15	45,192
    20	44,643
    23	44,493
    25	45,597
    29	45,565
    31	45,846
    34	40,332
    36	41,838
    39	46,216
    50	93,342
    62	47,864
    65	42,229
    68	44,468
    72	43,185
    76	45,313
    78	45,386
    82	49,469
    88	45,403
    90	48,083
    93	42,735
    95	46,375
    97	44,798
    100	45,071
    Le pic maximum figure donc bien dans cette matrice, en l'occurrence il s'agit de la 14ème ligne : 50 93.342. Pour le déterminer, je faisais simplement une recherche de l'indice du maximum sur la matrice précédente et je stockais dans un autre vecteur la ligne trouvée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A1b=find(maxima_A1_trier_1(:,2)==max(maxima_A1_trier_1(:,2)));
    maxima_A1_1=[maxima_A1_trier_1(A1b,1) maxima_A1_trier_1(A1b,2)];
    Mais voilà, comme je l'ai dit plus haut, il y a des cas problématiques où cette recherche avec find ne fournit pas le maximum entre 45 et 55. C'est pourquoi j'aurais besoin d'utiliser le find et max entre ces deux bornes. Mais je ne sais pas comment m'y prendre : d'une part comment restreindre le max sur le code précédent ? D'autre part, 45 et 55 n'existe pas en tant que pics : ici le 45 "deviendrait" 50 et le "55" 62 ce qui me permettrait de chercher le max entre 50 et 62, ce qui doit donner 50 donc.

    J'avais essayé de restreindre la fonction extrema appliquée originellement comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [valeurs_indices_max_A1,indices_max_A1,valeurs_indices_min_A1,indices_min_A1] = extrema(A1);
    maxima_A1=[indices_max_A1 valeurs_indices_max_A1];
    minima_A1=[indices_min_A1 valeurs_indices_min_A1];
    Mais écrire par exemple extrema(A1(45:55)) au lieu de extrema(A1) dans la première ligne ne marche pas : je n'obtient pas seulement les pics entre les indices 45 et 55 et pire j'obtiens quelque chose et l'indicage a changé.

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Une autre chose : une idée plutôt "sophistiquée" qui découle de mon message précédent serait dans la matrice deux colonnes des extremum de rechercher le minimum et le maximum seulement entre les bornes correspondantes à 45 55. Comme je l'ai dit plus haut ce 45 55 deviendrait ici 50 62.

    J'aurais donc l'idée de faire une sorte d'arrondi le plus proche mais je n'ai aucune idée de comment mettre en oeuvre cette tactique : en gros je voudrais trouver dans la première colonne de la matrice précédente la valeur la plus proche de 45 qui lui est supérieure, donc 50 ici. De même pour 55, je voudrais la valeur d'indice la plus proche et supérieure, soit 62. Il n'est pas dit que ceci sera infaillible mais je cherche à faire une fonction qui donnerait au final des résultats pour une dizaine de cas. Auriez-vous des pistes pour faire ceci ? Et ensuite trouver le max ou min seulement entre les deux bornes calculées.

    EDIT:

    Bon en fait pour les bornes les plus proches, je pense que ce qui suit peut faire l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    contraintes1=find(maxima_A1_trier_1(:,1)>=45);
    indice_A1_max1=contraintes1(1);
    contraintes2=find(maxima_A1_trier_1(:,1)>=55);
    indice_A1_max2=contraintes2(1);
    Après il y a un autre problème qui est que cette recherche ne donne pas un bon résultat sur ma courbe. Je pensais qu'en restreignant ainsi je trouverai seulement les deux pics qui m'intéressent. Mais en fait, si on prend la situation suivante :



    L’utilisation du code précédent va me donner 50 et 63 comme bornes et l'ordonnée en 63 est plus grande qu'en 50, mais c'est bien le pic en 50 que j'aurais aimé détecter. Bref, à moins de distinguer encore selon que le pic en 63 est d'ordonnée supérieure à celle en 50, je ne sais pas trop comment faire. Je reconnais que ceci est un peu grossier mais bon comme je l'ai dit je souhaite faire fonctionner le processus dans une dizaine de cas, cela sera suffisant.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Au vu de la courbe, je commencerais par faire une dérivée afin de repérer les limites du patron central.

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Oui merci Winjerome j'étais justement en train de penser à cela. Est-ce que tu avais en tête de trouver les points de dérivées nulles de la courbe ? J'ignore comment faire cela précisément, ou s'il faut utiliser diff d'une certaine façon.

    Malgré tout j'ai trouvé une solution très "bidouillée" partielle. Il se trouve que je n'ai pas une mais 4 courbes à traiter. J'ai fait un travail différent pour chacune des 4. Je ne vais pas poster ici la solution (sauf si vraiment vous y tenez) car elle ne fonctionne pas dans tous les cas. Mais comme je souhaitais en avoir 10 qui fonctionnent cela me convient. Donc en gros j'utilise extrema, fonction du site mathworks, pour avoir tous les pics de la courbe. J'ai ensuite écrit une fonction qui recherche simplement les pics que je veux : dans les photos que j'ai postées il y en a donc 2 à trouver. J'ai fixé deux bornes 45 et 55 et je recherche les maxima qui m'intéressent entre les bornes les plus proches de 45 et 55 en tant que pic. Bien évidemment c'est difficile à mettre en oeuvre mais cela marche dans certains cas. Maintenant pour le cas général je ne sais pas vraiment mais si Winjerome développe un peu l'idée avec la dérivée, je pourrais réessayer.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Non, comme je l'ai dit mon idée est de passer par la dérivée pour trouver les limites des pics centraux.
    La dérivée aux alentours étant faible, contrairement au centre, tu devrais facilement pouvoir les délimiter.

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 401
    Points : 102
    Points
    102
    Par défaut
    Winjerome, en fait je ne vois pas bien comment procéder. Avec une fonction que je ne vais pas poster puisqu'elle est réalisée à partir d'autres fonctions imbriquées, j'obtiens quatre signaux A50,AL50,A1,AL1 et j'ai montré un exemple de A1 dans mes messages précédent. J'ai donc A1 en mémoire. Pour essayer de comprendre comment je pourrai faire pour trouver les deux pics qui m'intéressent dans un exemple (j'adapterais ensuite ailleurs), voici un code que tu peux directement tester :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    function test
     
    A1=[23.588
    29.936
    27.605
    26.785
    24.608
    27.746
    25.733
    26.833
    28.643
    28.529
    26.804
    26.709
    24.703
    24.939
    32.869
    28.473
    28.091
    27.063
    26.669
    32.049
    28.024
    28.912
    30.956
    24.751
    26.907
    29.645
    27.981
    32.656
    30.61
    25.18
    29.272
    25.97
    28.047
    27.803
    24.802
    25.902
    29.432
    26.64
    28.933
    20.475
    -44.146
    -112.87
    -183.31
    -253.61
    -319.41
    -394.98
    -460.09
    -528.45
    -601.48
    -505.61
    -605.73
    -683.95
    -463.52
    -388.24
    -325.31
    -250.72
    -181.37
    -111.72
    -45.026
    20.974
    30.05
    28.257
    27.35
    25.883
    26.945
    23.549
    26.536
    28.269
    25.945
    23.717
    32.259
    30.745
    26.194
    26.054
    27.38
    31.165
    29.668
    26.674
    27.556
    24.05
    25.536
    28.851
    26.579
    30.121
    28.352
    30.414
    29.367
    25.492
    25.602
    26.171
    26.842
    25.852
    27.751
    29.553
    31.293
    25.307
    30.274
    27.687
    24.156
    24.295];
     
    figure(1)
    plot(A1)
    title('signal A50 : Bruit+Reflux+Sinus')
    xlabel('indices')
    ylabel('valeurs indices')
     
    end
    En l'éxécutant tu obtiendras sur la figure(1) la courbe avec les deux pics en questions situés entre les indices 45 et 55. Bref à partir de là je suis bloqué pour le moment. Je vais tester des choses pour voir mais je ne comprends pas comment calculé la dérivée.

    Par exemple si j'utilise diff :

    Je regarde ce qu'il se passe par exemple autour de la 50ème position : ce qu'on voit en position 49 50 51 c'est un changement de signe entre 49 et 50 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    95,87
    -100,12
    -78,22
    Mais ceci intervient à de nombreuses reprises. Comme je ne sais pas ce que je pourrai faire exactement je vais essayer de détecter les changements de signes par paquets de 3. Bien sûr si tu as une idée d'algorithme j'essaierai la tienne.

    EDIT:

    Comme je le disais je suis donc parti sur mon idée de paquets de 3 mais je me contente d'analyser la situation entre les indices 43 et 57 :

    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
    diff_A1=diff(A1);
     
    ligne=[];
     
    for i=43:57
     
        %Dans la matrice ligne on stocke sur une première colonne les valeurs
        %prises aux indices correspondant mis sur la deuxième colonne.
     
        ligne=[diff_A1(i) i ; diff_A1(i+1) i+1 ; diff_A1(i+2) i+2];
     
        %Détermination des pics : il y a un pic dès que dans un triplet il y a
        %un changement de signe sur la première colonne de ligne. Si un pic a
        %déjà été détecté on ne le recherche pas à nouveau.
     
        %Seulement si les signes diffèrent.
     
        if( (ligne(1,1)<0 & ligne(2,1)<0 & ligne(3,1)>0) | (ligne(1,1)<0 & ligne(2,1)>0 & ligne(3,1)>0) | (ligne(1,1)>0 & ligne(2,1)<0 & ligne(3,1)<0) | (ligne(1,1)>0 & ligne(2,1)>0 & ligne(3,1)<0) | (ligne(1,1)>0 & ligne(2,1)<0 & ligne(3,1)>0) | (ligne(1,1)<0 & ligne(2,1)>0 & ligne(3,1)>0) )
     
          %A faire
     
        end
     
     
    end
    Dans ligne je stocke une matrice deux colonnes où sur la première colonne j'ai les valeurs du diff et sur la deuxième colonne les indices correspondant. On peut dire qu'on a forcément un pic quand les signes des nombres sur la première colonne de ligne ne sont pas du même signe, d'où le if avec des ou "|". Bref, je ne sais pas si c'est l'idée à suivre mais je suis un peu bloqué : je ne vois pas, si je rentre dans le if lequel des éléments du triplet je dois choisir en tant qu'extrema. La plupart du temps l'extema correspond au nombre qui est de signe différents des deux autres mais parfois non. Je ne sais pas comment choisir et donc peut-être que l'idée n'est pas bonne.

Discussions similaires

  1. Recherche d'un maximum inférieur à une valeur
    Par i0raek dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/01/2016, 14h38
  2. Recherche simultanée du maximum et du minimum d'un tableau
    Par comtois dans le forum Télécharger
    Réponses: 0
    Dernier message: 03/04/2013, 21h13
  3. Recherche d'une valeur entre 2 Bornes
    Par Jimy6000 dans le forum Excel
    Réponses: 13
    Dernier message: 03/09/2009, 16h19
  4. [WD12] recherche enregistrements entre deux bornes
    Par cgr_007 dans le forum WinDev
    Réponses: 2
    Dernier message: 28/03/2009, 22h40
  5. Recherche à partir d'un formulaire sur l'appuie sur Entrée
    Par talrashha dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/07/2008, 13h41

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