Recherche des maximums et du FWHM

Bonjour,

Je suis sur la réalisation d'une macro Excel qui me pose problème.

J'ai une courbe qui représente deux pics, un principal dont la valeur max est supérieure à celle du pic secondaire.

Je cherche à réaliser une macro qui récupérer la valeur des maximums pour en faire le rapport.

La fonction MAX() fonctionne très bien pour avoir la valeur max du pic primaire, mais pour venir récupérer avec une macro la valeur max du pic secondaire je n'y arrive pas.

quelqu'un aurait une idée?

Merci d'avance

EDIT: Recherche des maximum validé, Merci @Bigdams et @Grand Chaman Excel, pour leur script.

EDIT2: Besoin de déterminer le FWHM (Full Widht Half Maximum) autrement dit la largeur à mi-hauteur des pics détectés.

Il faudrait partir des maximums trouvés pour déterminer la largeur à mi-Hauteur, ou encore à 1/e²

Merci

82signal-clcl-10.txt (4.98 Ko)

Bonjour Perceval34,

Une solution possible serait d'utiliser la fonction GRANDE.VALEUR.

Ex.:

GRANDEVALEUR(Plage, 1) : donne le maximum

GRANDEVALEUR(Plage, 2) : donne la 2e plus grande valeur

Je crois qu'en VBA, il faut la traduire par "WorksheetFunction.Large".

Consulte l'aide de Excel.

A essayer.

Bonjour,

Merci de la réponse, mais ça ne correspond pas car il s'agit pour moi d'une plage de 300 valeurs, alors si

GrANDE.VALEUR(B:B;1) me donne le premier max,

GrANDE.VALEUR(B:B;2) me donne la valeur la plus proche du max,

alors que mon autre pic est situé plus loin que ça.

Merci mais ça ne résoud pas mon problème.

Bonjour,

Grand Chaman Excel a écrit :

GRANDEVALEUR(Plage, 2) : donne la 2e plus grande valeur

Il n'a pas parlé de valeur la plus proche, cela te donne bien la 2ème mesure avec la plus grande valeur, pas la plus proche en terme de présence dans ton relevé de mesures

Les propositions des gens du forum, c'est comme les épinards, il faut essayer avant de dire que c'est mauvais

Cordialement.

Bonjour,

Je l'ai effectivement essayé avant de répondre, ce qu'il y a c'est que j'ai une plage de 300 valeurs proches et celà ne correspond pas à ma demande car,

la seconde valeur aprés le maximum est le point situé juste à côté du maximum et non pas sur le pic secondaire.

...............*MAX1

..MAX2....../\

... *......../...\

../\....../......\

./...\..../........\

/......\/...........\

-------------------------

Voilà a quoi ma fonction ressemble. La fonction GRANDE.VALEUR, me donne la valeur des points entourant le MAXIMUN et non pas la valeur MAX2.

Merci

Et tu as un moyen de connaitre un peu ou se situe les deux pic ou pas du tout ?

Sinon il suffit de refaire une GRANDE.VALEUR en changeant la 2ème plage ?

Le problème Zirak c'est que je voudrais que ce soit automatisé par une macro car je vais en avoir un paquet de courbes à comparer, c'est pour ça que je cherche une fonction qui puisse faire le travail à ma place.

Sinon je vais devoir passerpar un bouclage et faire des comparaisons.

Non mais après, ce peut être automatisé quand même, ce que je veux dire, c'est que déjà pour chaque courbe, si tu as un nombre de relevés fixe (tes 300 valeurs), on peut essayer de diviser la plage par X, et faire un GRANDE.VALEUR sur ces X plages résultantes, puis de ne garder que les deux plus grands résultats.

Après plus X est grand plus le résultat sera affiné, mais sur une macro, vu la vitesse d'exécution même si on divise les 300 valeurs en 50 plages, cela ne se verra pas.

Le seul soucis, c'est que ne connaissant pas tes courbes et l'aspect qu'elles peuvent avoir, c'est de trouver le X le plus optimisé pour ne pas tomber sur des plages si petites que l'une d'elle ferait partie des alentours de ton MAX1.

@Zirak, ta dernière phrase expose le soucis à cette méthode.

Le problème est que je ne peux pas avoir des courbes fixe avec le pic principal à la même place qui lui n'est pas sencé changer dans mes relevés.

Les relevés sont trop aléatoires pour que je puisse décomposer la plage de donné, mais ça serait une solution dans le cas ou l'un des pic est fixe.

Je commence à penser que la seule solution serait de faire une triple comparaison, c'est à dire, pour détecter les maximum, si la valeur na pas de valeur proche supérieure à elle même.

Merci encore, mais si vous avez d'autres idées je suis preneur

-- 02 Aoû 2011, 17:52 --

Désolé pour le double post, mais je pense que ta méthode peut fonctionner finalement Zirak, je n'ai pris assez de recul, je vais tester ça dessuite et je te tiens au courant.

En tous cas merci beaucoup

bonjour à vous

des pics il y en plus de 2 (dont certains tout petits)

quels sont ceux que tu cherches ? y en a-t-il toujours 2 assez différents des autres ?

Excel ne sait pas distinguer un grand pic d'un petit, à moins de lui donner un critère (plage, comme évoqué par Zirak, ou amplitude etc.)

=SI(ET(A3>=A2;A3>=A4);"pic";"")

que tu copies en colonne B, juste à côté de ta colonne de valeurs te donne les pics

tu peux remplacer "pic" par ce que tu veux, notamment par le n° de la ligne, ou la valeur, ou les 2

et là tu peux traiter ces valeurs et si nécessaire extraire facilement les 2 plus grandes

bgrvfe

Salut,

Je viens de copier le contenu de ton fichier texte dans la premiere colonne d'une feuille excel.

Le code suivant permet d'avoir les valeurs de tout les pics (selon moi).

Il ne reste plus qu'a fait un tri decroissant pour avoir les PICS les plus important...

J'obtiens avec ton fichier les pics :

0,1123263

0,1120657

0,03983131

0,03977555

0,009015149

0,008992828

0,004117653

0,003522449

0,003521221

Dis moi si cela te va ou si je suis compltement hors sujet.

'----------------------------------------------------------------------------------------------------------

Private Sub determinepic()

'Valeur de cells(1,2) a cells(

Dim tabmax() As Double

Dim maxvaleur As Double

Dim tempvaleur As Double

Dim b, i As Integer

b = 0

i = 2 'Mon tableau commence a la ligne 2

maxvaleur = Cells(i, 1) 'Init Val max

'Ici je lit toute les valeurs de la première colonne (dans mon exemple)

While Cells(i, 1).Value <> ""

If Cells(i, 1) > maxvaleur Then 'Alors la courbe monte vers le pic

maxvaleur = Cells(i, 1) ' On ecrit la valeur temporaire max

monte = True 'On positionne le flag a true pour indiquer que la courbe monte vers le pic

End If

If monte = False Then

maxvaleur = Cells(i, 1)

End If

If Cells(i, 1) < maxvaleur And monte = True Then 'Si la valeur_lue < valeur_max_temporaire ET que l'on est dans la phase monté :alors c'est le pic

b = b + 1

ReDim Preserve tabmax(b)

tabmax(b - 1) = maxvaleur 'On stock la valeur du pic

monte = False 'On vient du PIC 'On indique ensuite que l'on est dans la phase de descente

End If

i = i + 1

Wend

ReDim Preserve tabmax(b - 1)

'On affiche le contenu du tableau avec tout les pics.

'Il faut trier le tableau si on veut avoir le premier PIC MAX, puis le second etc...

For i = LBound(tabmax) To UBound(tabmax)

Cells(i + 1, 4) = tabmax(i) 'J'écris les valeurs des PICs dans la colonne D

Next

End Sub

'------------------------------------------------------------

Bonjour,

Je n'avais pas regardé le fichier de données et donc mal compris ton problème...

Voici un code qui permet de trouver les maximums en comparant les valeurs précédentes et suivantes de chaque point. (la liste de valeur doit être copiée en A1)

Reste à trier les valeurs et prendre les 2 plus grandes :

Sub TrouveMax()
Dim r As Range
'Trouve les maximums pour une série de données copiées en A1
'Les maximums sont inscrits dans la colonne C mais ne sont pas triés

'une valeur est un maximum si les valeurs précédentes et suivants lui sont
'inférieures

i = 1
If [A2] < [A1] Then
    [C1] = [A1] '1re valeur est un maximum ?
    i = 2
End If

Set r = [A2]
On Error Resume Next
Do Until IsEmpty(r.Offset(1, 0))
    If r.Offset(-1, 0) < r And r.Offset(1, 0) < r Then
        Cells(i, 3) = r
        i = i + 1
    End If
Set r = r.Offset(1, 0)
Loop

End Sub

A+

@Bigdams et @Grand Chaman Excel,

Merci vos deux macros fonctionnent parfaitement c'est exactement ce qu'il me fallait, en plus avec GRANDE.VALEUR, je peux selectionner les 2 ou 3 pics principaux.

Je vous en remercie grandement.

Si je peux me permettre, comme vous êtes callé sur le sujet.

Auriez vous une méthode pour venir récupérer la largeur à mis hauteur des pics trouvés ça corse la chose bien entendu.

De façon à ce que j'ai à côté des valeurs max trouvé, la largeur de ce pic.

Je pense que le problème n'est pas vraiment évident.

Si vous avez une idée je suis preneur.

Encore merci pour tout

-- 03 Aoû 2011, 17:02 --

Bonjour,

Il faudrait si possible à présent, déterminer le FWHM (Full Widht Half Maximum) autrement dit la largeur à mi-hauteur des pics détectés.

Ou seulement du pic principal.

Pour trouver le point ou se situe la mi-Hauteur c'est facile, il suffit de prendre le max et prendre la moitié ou 1/e² soit 13%.

Par contre comment faire pour récupérer les deux valeurs autour de ce point?

Si vous avez une idée

Bonjour Perceval,

Est-ce que ta mesure de FMHW doit être très précise ou bien une approximation serait suffisante ?

Est-ce que tu peux donner un exemple de valeur attendue ?

Si on prend le 1er pic, le maximum est à 0.112. La moitié est donc à 0.056. En regardant les points sur la courbe, on trouve que les points 26 et 39 sont les plus proches de 0.056. Donc le FMHW serait de 13 (39-26). Est-ce correct ?

Sachant cela, je crois que c'est possible de faire une macro pour ça...

A+

Bon, alors c'est toujours mieux que ce soit précis, mais sinon la procédure que tu as inscrite est valide, c'est exactement ce qu'il faudrait.

J'ai besoin en réalite du FWHM du pic principal les secondaire tertiaires ne sont pas important.

Par contre sur le fichier texte que je joint la réalisation pourrait être plus facile je pense, le premier fichier texte est un peu obsoléte au point de vue de mon étude.

Et par hasard, je veux faire fonctionner la macro pour plusieurs fichier texte que j'exporte en .xls

Actuellement je le fais pour 1 fichier en mettant la commande:

Windows("signal_clcl_0.txt").Activate

j'aimerai que la macro se lance aussi pour les fichier signal_clcl_5.txt signal_clcl_10.txt signal_clcl_15.txt etc.. autant que j'en ouvre.

Est ce possible :s

En tous cas merci pour ces réponses

32signal-clcl-0.txt (2.49 Ko)

Bonjour Perceval,

Voici un début de code pour calculer ton FMHW. Je n'ai malheureusement plus de temps pour travailler là-dessus aujourd'hui.

Donc, tu copies des données en A1 dans un fichier Excel et tu lances la macro.

Tu verras un tableau de résultats apparaître en C1. Ce qui t'intéresse, c'est la colonne J. Attention, il y a des cas où la valeur du FMHW, comme par exemple en J6 sur la feuille 1.

235fmhw-perceval.zip (26.57 Ko)

A+

Bonjour,

Alors c'est vraiment super, c'est exactement ce qu'il me fallait d'autant plus que si j'ai besoin de régler la hauteur du FWHM c'est possible.

Par contre une chose que je ne comprend pas trop, c'est à quoi sert la macro1 qu'il y a dans le fichier? fait elle partie du programme ou c'est un résidu de test?

Vraiment merci beaucoup!!!!!

La macro1 ne sert à rien, c'est un test que j'ai fait et j'ai oublié de l'effacer.

Rechercher des sujets similaires à "recherche maximums fwhm"