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
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
- Messages
- 358
- Excel
- 2003-2007 FR
- Inscrit
- 02/08/2011
- Emploi
- Consultant Test Performance / Audit
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 SubA+
@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
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
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.
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.