OVH Cloud OVH Cloud

Recherche de Maxima

50 réponses
Avatar
HRV
Bonjour,

Je cherche =E0 identifier deux maximums dans une m=EAme plage
de donn=E9e. Ces deux maximum n'ont pas n=E9cessairement la
m=EAme valeur. Comment faire ?

D'avance merci

10 réponses

1 2 3 4 5
Avatar
twinley
A part le Ctrl+Maj+enter
c'était bon
si je met 1 à la fin les valeurs sont répétée dans chaque fml
si je met 2 à la fin j'ai #NOMBRE! ou #VALEUR pour les deux cells extrêmes.

Je ne comprend rien au fml...

à+twinley

RaMA wrote:
Les Définitions de plages:
définir nom maplaj pour A3 à A18
définir nom maplaj2 pour A2 à A17
définir nom maplaj3 pour A4 à A19
Les formules sont à valider Ctl+Maj+entrée
pour le pic MAX
=-PETITE.VALEUR(((maplaj2>MaPlaj)+(Maplaj3>MaPlaj)-1)*MaPlaj;1)
Pour le second
=-PETITE.VALEUR(((maplaj2>MaPlaj)+(Maplaj3>MaPlaj)-1)*MaPlaj;2)

Etc...
Salutations
RaMa



Avatar
twinley
oui,
Voici ma sub qui extrait l'équation du graphique et qui la pose dans une
var et des cellules aussi . C'est pour y=ax+b.
Je viens de voir qu'une courbe de régression d'ordre six collait bien au
nuage. Il faudra adapter.

Garnote m'avait montré une façon de faire pour avoir les coef a et b
dans une cell avec des formule mais j'avais un résultat faux. Donc j'ai
privilégié l'extraction de la chaîne de car.

Sub equat()
equation = ActiveSheet.ChartObjects("Graphique1").Chart _
.SeriesCollection(6).Trendlines(1).DataLabel.Text
positionx = InStr(equation, "x")
Select Case Mid(equation, 5, 1)
Case "+" 'y = +3644.5
a = ""
b = Mid(equation, positionx) * 1
Case "-"
If Mid(equation, 6, 1) = "x" Then 'y = -x + 3644.5
a = -1
b = Mid(equation, positionx + 4) * 1
Else 'y = -2.456x +3644.5
a = Mid(equation, 5, positionx - 5) * 1
b = Mid(equation, positionx + 1) * 1
End If
Case "x" 'y = x +3644.5
a = 1
b = Mid(equation, positionx + 2) * 1
Case Else
If positionx = 0 Then 'y = +3644.5
a = ""
b = Mid(equation, 5) * 1
Else 'y = 2.456x +3644.5
a = Mid(equation, 5, positionx - 5) * 1
b = Mid(equation, positionx + 1) * 1
End If
End Select
Sheets("Graph1").Range("D1") = a
Sheets("Graph1").Range("E1") = b
' valeur de la droite de regression y=ax+b avec x=1 sur le
dernier cours
Sheets("Graph1").[O12] = Sheets("Graph1").[D1] + Sheets("Graph1").[E1]
Sheets("Graph1").Range("F1").Select
End Sub

C'est un des premier truc que j'ai fais en VBA alors c'est assez
détaillé en pas à pas. Je pensais la condenser un jour, mais j'ai pas eu
le temps.

twinley


YannX wrote:
Oui, en direct à l'écran, je connais...
Mais parce que tu sais faire cela direct en VBA ; et meme en VB peut-etre
??????
Alors là on va pouvoir faire quelque chose de bien...
depuis le temps que je galère sur ce truc......
je dis bien en VB et CreateObject...

Sinon, il me manque la recherche de zéros,
mais a la limite on multiplie la série de Y par -1*son signe
et on appliquera les GRANDE.VALEUR que j'ai appris ici

Si c'st OK, on va couper le fil pour s'y mettre....

YannX

"twinley" a écrit dans le message de
news:

Pour ce qui d'afficher l'équation de ta série de données
En nuage de points, clic droit sur la série, ajouter une courbe de


tendance

Tu choisi le type régression et dans l'autre onglet Options afficher
l'équation.
Cette équation appairait dans le graphe et tu peux la copier ou tu veux,
si tu as besoin je chercherai le code VBA pour la tripatouiller.

twinley

YannX wrote:

Si des experts graphiques Excel VBA veulent bien se signaler....
La solution sera...... Donc merci a eux !

"twinley" a écrit dans le message de
news:%23Wp%


Alors là ! tu vas me dire que c'est simple comme bonjour.



Ben exactement : FAUCON YAKA....



Si les dérivées ... permettent de
trouver l'algorithme des points tournants d'une courbe qui fait des
vagues successives,


Mais si, c'est exactement cela !



. Et qu'on puisse identifier deux
sommets... ou deux creux. Je suis preneur.


Bien sur : un sommet c'est quand la courbe
monte (dérivée positive) puis descend (négative).
Donc un sommet ou un vallon -> dérivée nulle



Tu auras au moins une oreille attentive. Celle qui me reste, car l'autre
je l'ai perdu en écoutant chanter jps.


Ou d'autres cacatoUès...... ;-)

Bon : qui peut/veut m'aider sur VB->ExcelGraphiques ?



YannX wrote:


Ensuite, il me semble qu'une solution implicite se dégage....
Identifier les maximas d'une courbe d'un nuage de points,
c'est :
1°/ générer son approxiamtion polynomiale,



La question est donc : comment obtenir dans Excel,
et en VBA svp la formule de la regression d'un tableau de points



2°/ identifier les points à dérivée changeant de signe (vers



negatif)


3°/ appliquer GRANDE.VALEUR sur la série extraite



4°/ il pourra y avoir uen approximation, selon que HRV
doit avoir les points théoriques (de l'approximation
polynomiale)
ou les valeurs des points réellement proposés dans le



tableau

initial



Elements dispo.
1°) En VBA j'ai trouvé une classe de régression polynomiale,
si celle d'Excel ne suffit pas.
2°) Y= SIGMA : An * (X ** N)
dérivée : Y' = SIGMA : An * N * ( X ** N-1)
Trouver les zeros, j'ai pas cela en tete
c'est dommage que le partenaire ExcelLabo soit absent.....
3°) Merci de me l'avoir apprise...

Je gage que Misange rajoutera le VBA dans son site...

@+
YannX

"twinley" a écrit dans le message de
news:



tout à fait.
C'est aussi le domaine de la reconnaissance de forme.
Excel n'est pas forcement l'outil le plus adapté.

twinley

JpPradier wrote:



Oui on fait du lissage en fait. Après tout dépends sur combien de



points. Il y a un compromis à



adopter.
On peut aussi tester si il y a un creux entre les deux sommets. Et il



faut donner un seuil à ce



creux.
Là on est presque dans le domaine du traitement du signal.

j-p





















Avatar
YannX
Bnsr,

Il faudra prévoir une régression polynomiale d'ordre >= 2 * N
pour atteindre les N premiers maxima.
Dans le meme ordre d'idées, comment peux-tu injecter
depuis VB dans un vecteur :
ActiveChart.SeriesCollection(2).XValues = tableauX
ActiveChart.SeriesCollection(2).Values = tableauY
(ceci ayant pour but d'accélerer la générationd e la courbe)

Merci

PS je mets en eouvre ton source !


"twinley" a écrit dans le message de
news:
oui,
Voici ma sub qui extrait l'équation du graphique et qui la pose dans une
var et des cellules aussi . C'est pour y=ax+b.
Je viens de voir qu'une courbe de régression d'ordre six collait bien au
nuage. Il faudra adapter.

Garnote m'avait montré une façon de faire pour avoir les coef a et b
dans une cell avec des formule mais j'avais un résultat faux. Donc j'ai
privilégié l'extraction de la chaîne de car.

Sub equat()
equation = ActiveSheet.ChartObjects("Graphique1").Chart _
.SeriesCollection(6).Trendlines(1).DataLabel.Text
positionx = InStr(equation, "x")
Select Case Mid(equation, 5, 1)
Case "+" 'y = +3644.5
a = ""
b = Mid(equation, positionx) * 1
Case "-"
If Mid(equation, 6, 1) = "x" Then 'y = -x + 3644.5
a = -1
b = Mid(equation, positionx + 4) * 1
Else 'y = -2.456x +3644.5
a = Mid(equation, 5, positionx - 5) * 1
b = Mid(equation, positionx + 1) * 1
End If
Case "x" 'y = x +3644.5
a = 1
b = Mid(equation, positionx + 2) * 1
Case Else
If positionx = 0 Then 'y = +3644.5
a = ""
b = Mid(equation, 5) * 1
Else 'y = 2.456x +3644.5
a = Mid(equation, 5, positionx - 5) * 1
b = Mid(equation, positionx + 1) * 1
End If
End Select
Sheets("Graph1").Range("D1") = a
Sheets("Graph1").Range("E1") = b
' valeur de la droite de regression y=ax+b avec x=1 sur le
dernier cours
Sheets("Graph1").[O12] = Sheets("Graph1").[D1] +
Sheets("Graph1").[E1]

Sheets("Graph1").Range("F1").Select
End Sub

C'est un des premier truc que j'ai fais en VBA alors c'est assez
détaillé en pas à pas. Je pensais la condenser un jour, mais j'ai pas eu
le temps.

twinley


YannX wrote:
Oui, en direct à l'écran, je connais...
Mais parce que tu sais faire cela direct en VBA ; et meme en VB
peut-etre


??????
Alors là on va pouvoir faire quelque chose de bien...
depuis le temps que je galère sur ce truc......
je dis bien en VB et CreateObject...

Sinon, il me manque la recherche de zéros,
mais a la limite on multiplie la série de Y par -1*son signe
et on appliquera les GRANDE.VALEUR que j'ai appris ici

Si c'st OK, on va couper le fil pour s'y mettre....

YannX

"twinley" a écrit dans le message de
news:

Pour ce qui d'afficher l'équation de ta série de données
En nuage de points, clic droit sur la série, ajouter une courbe de


tendance

Tu choisi le type régression et dans l'autre onglet Options afficher
l'équation.
Cette équation appairait dans le graphe et tu peux la copier ou tu veux,
si tu as besoin je chercherai le code VBA pour la tripatouiller.

twinley

YannX wrote:

Si des experts graphiques Excel VBA veulent bien se signaler....
La solution sera...... Donc merci a eux !

"twinley" a écrit dans le message de
news:%23Wp%


Alors là ! tu vas me dire que c'est simple comme bonjour.



Ben exactement : FAUCON YAKA....



Si les dérivées ... permettent de
trouver l'algorithme des points tournants d'une courbe qui fait des
vagues successives,


Mais si, c'est exactement cela !



. Et qu'on puisse identifier deux
sommets... ou deux creux. Je suis preneur.


Bien sur : un sommet c'est quand la courbe
monte (dérivée positive) puis descend (négative).
Donc un sommet ou un vallon -> dérivée nulle



Tu auras au moins une oreille attentive. Celle qui me reste, car
l'autre





je l'ai perdu en écoutant chanter jps.


Ou d'autres cacatoUès...... ;-)

Bon : qui peut/veut m'aider sur VB->ExcelGraphiques ?



YannX wrote:


Ensuite, il me semble qu'une solution implicite se dégage....
Identifier les maximas d'une courbe d'un nuage de points,
c'est :
1°/ générer son approxiamtion polynomiale,



La question est donc : comment obtenir dans Excel,
et en VBA svp la formule de la regression d'un tableau de points



2°/ identifier les points à dérivée changeant de signe (vers



negatif)


3°/ appliquer GRANDE.VALEUR sur la série extraite



4°/ il pourra y avoir uen approximation, selon que HRV
doit avoir les points théoriques (de l'approximation
polynomiale)
ou les valeurs des points réellement proposés dans le



tableau

initial



Elements dispo.
1°) En VBA j'ai trouvé une classe de régression polynomiale,
si celle d'Excel ne suffit pas.
2°) Y= SIGMA : An * (X ** N)
dérivée : Y' = SIGMA : An * N * ( X ** N-1)
Trouver les zeros, j'ai pas cela en tete
c'est dommage que le partenaire ExcelLabo soit absent.....
3°) Merci de me l'avoir apprise...

Je gage que Misange rajoutera le VBA dans son site...

@+
YannX

"twinley" a écrit dans le message de
news:



tout à fait.
C'est aussi le domaine de la reconnaissance de forme.
Excel n'est pas forcement l'outil le plus adapté.

twinley

JpPradier wrote:



Oui on fait du lissage en fait. Après tout dépends sur combien de



points. Il y a un compromis à



adopter.
On peut aussi tester si il y a un creux entre les deux sommets. Et
il









faut donner un seuil à ce



creux.
Là on est presque dans le domaine du traitement du signal.

j-p























Avatar
jps
ben voyons twinley....
fais quand même attention de ne pas perdre les deux car dans ce cas, c'est
aveugle que tu seras puisque la chéchia, elle te tombera sur les yeux..
jps (le chaouche du pataouète)

"twinley" a écrit dans le message de
news:%23Wp%
Tu auras au moins une oreille attentive. Celle qui me reste, car l'autre
je l'ai perdu en écoutant chanter jps.


Avatar
twinley
Bsr,

Je t'avais déjà envoyé ce que je fais pour XValues. Cela dépend du
format du range et des décimales. On y arrive sans soucis.
Pour mettre un tableau, je ne sais pas.
Par contre XL rafraîchi bien un graphe ainsi qu'une droite régression
avec une seule ligne qui intègre la dernière donnée qui vient d'être
ajoutée :
ActiveChart.SeriesCollection(6).Values = _
Sheets("Graph1").Range("$" & col & "$12:$" & col & (nbbar + 11))
il faut peut être des ÞCALER(..)aux bons endroits. Faut voir en
situation. J'ai un truc en temps réel qui attrape des données par DDE et
ça marche.

Pour afficher le graphique, j'ai bien cherché mais ça va. Je ne donne
pas de cours mais je peux expliquer pas mal de points.

à+twinley

YannX wrote:
Bnsr,

Il faudra prévoir une régression polynomiale d'ordre >= 2 * N
pour atteindre les N premiers maxima.
Dans le meme ordre d'idées, comment peux-tu injecter
depuis VB dans un vecteur :
ActiveChart.SeriesCollection(2).XValues = tableauX
ActiveChart.SeriesCollection(2).Values = tableauY
(ceci ayant pour but d'accélerer la générationd e la courbe)

Merci

PS je mets en eouvre ton source !


"twinley" a écrit dans le message de
news:

oui,
Voici ma sub qui extrait l'équation du graphique et qui la pose dans une
var et des cellules aussi . C'est pour y=ax+b.
Je viens de voir qu'une courbe de régression d'ordre six collait bien au
nuage. Il faudra adapter.

Garnote m'avait montré une façon de faire pour avoir les coef a et b
dans une cell avec des formule mais j'avais un résultat faux. Donc j'ai
privilégié l'extraction de la chaîne de car.

Sub equat()
equation = ActiveSheet.ChartObjects("Graphique1").Chart _
.SeriesCollection(6).Trendlines(1).DataLabel.Text
positionx = InStr(equation, "x")
Select Case Mid(equation, 5, 1)
Case "+" 'y = +3644.5
a = ""
b = Mid(equation, positionx) * 1
Case "-"
If Mid(equation, 6, 1) = "x" Then 'y = -x + 3644.5
a = -1
b = Mid(equation, positionx + 4) * 1
Else 'y = -2.456x +3644.5
a = Mid(equation, 5, positionx - 5) * 1
b = Mid(equation, positionx + 1) * 1
End If
Case "x" 'y = x +3644.5
a = 1
b = Mid(equation, positionx + 2) * 1
Case Else
If positionx = 0 Then 'y = +3644.5
a = ""
b = Mid(equation, 5) * 1
Else 'y = 2.456x +3644.5
a = Mid(equation, 5, positionx - 5) * 1
b = Mid(equation, positionx + 1) * 1
End If
End Select
Sheets("Graph1").Range("D1") = a
Sheets("Graph1").Range("E1") = b
' valeur de la droite de regression y=ax+b avec x=1 sur le
dernier cours
Sheets("Graph1").[O12] = Sheets("Graph1").[D1] +


Sheets("Graph1").[E1]

Sheets("Graph1").Range("F1").Select
End Sub

C'est un des premier truc que j'ai fais en VBA alors c'est assez
détaillé en pas à pas. Je pensais la condenser un jour, mais j'ai pas eu
le temps.

twinley


YannX wrote:

Oui, en direct à l'écran, je connais...
Mais parce que tu sais faire cela direct en VBA ; et meme en VB



peut-etre

??????
Alors là on va pouvoir faire quelque chose de bien...
depuis le temps que je galère sur ce truc......
je dis bien en VB et CreateObject...

Sinon, il me manque la recherche de zéros,
mais a la limite on multiplie la série de Y par -1*son signe
et on appliquera les GRANDE.VALEUR que j'ai appris ici

Si c'st OK, on va couper le fil pour s'y mettre....

YannX

"twinley" a écrit dans le message de
news:


Pour ce qui d'afficher l'équation de ta série de données
En nuage de points, clic droit sur la série, ajouter une courbe de


tendance


Tu choisi le type régression et dans l'autre onglet Options afficher
l'équation.
Cette équation appairait dans le graphe et tu peux la copier ou tu veux,
si tu as besoin je chercherai le code VBA pour la tripatouiller.

twinley

YannX wrote:


Si des experts graphiques Excel VBA veulent bien se signaler....
La solution sera...... Donc merci a eux !

"twinley" a écrit dans le message de
news:%23Wp%



Alors là ! tu vas me dire que c'est simple comme bonjour.



Ben exactement : FAUCON YAKA....




Si les dérivées ... permettent de
trouver l'algorithme des points tournants d'une courbe qui fait des
vagues successives,


Mais si, c'est exactement cela !




. Et qu'on puisse identifier deux
sommets... ou deux creux. Je suis preneur.


Bien sur : un sommet c'est quand la courbe
monte (dérivée positive) puis descend (négative).
Donc un sommet ou un vallon -> dérivée nulle




Tu auras au moins une oreille attentive. Celle qui me reste, car






l'autre

je l'ai perdu en écoutant chanter jps.


Ou d'autres cacatoUès...... ;-)

Bon : qui peut/veut m'aider sur VB->ExcelGraphiques ?




YannX wrote:



Ensuite, il me semble qu'une solution implicite se dégage....
Identifier les maximas d'une courbe d'un nuage de points,
c'est :
1°/ générer son approxiamtion polynomiale,



La question est donc : comment obtenir dans Excel,
et en VBA svp la formule de la regression d'un tableau de points




2°/ identifier les points à dérivée changeant de signe (vers



negatif)



3°/ appliquer GRANDE.VALEUR sur la série extraite



4°/ il pourra y avoir uen approximation, selon que HRV
doit avoir les points théoriques (de l'approximation
polynomiale)
ou les valeurs des points réellement proposés dans le



tableau


initial




Elements dispo.
1°) En VBA j'ai trouvé une classe de régression polynomiale,
si celle d'Excel ne suffit pas.
2°) Y= SIGMA : An * (X ** N)
dérivée : Y' = SIGMA : An * N * ( X ** N-1)
Trouver les zeros, j'ai pas cela en tete
c'est dommage que le partenaire ExcelLabo soit absent.....
3°) Merci de me l'avoir apprise...

Je gage que Misange rajoutera le VBA dans son site...

@+
YannX

"twinley" a écrit dans le message de
news:




tout à fait.
C'est aussi le domaine de la reconnaissance de forme.
Excel n'est pas forcement l'outil le plus adapté.

twinley

JpPradier wrote:




Oui on fait du lissage en fait. Après tout dépends sur combien de



points. Il y a un compromis à




adopter.
On peut aussi tester si il y a un creux entre les deux sommets. Et









il

faut donner un seuil à ce




creux.
Là on est presque dans le domaine du traitement du signal.

j-p

























Avatar
Alain CROS
Bonjour

En reprenant ton exemple en A2:A17
En Colonne G par exemple
G1=PETITE.VALEUR(A2:A17;1)
G2¢ puis tirer en G17 donc G17¡7
En Colonne H
H2=SI(ET(SI(DECALER($G2;1;;1)>$G2;1;0)=0;SI(SI(G2>DECALER($G2;-1;;1);1;0)=SI(DECALER($G2;1;;1)>$G2;1;0);1;0)=0);$G2;"")
Tirer en H17 donc
H17=SI(ET(SI(DECALER($G17;1;;1)>$G17;1;0)=0;SI(SI(G17>DECALER($G17;-1;;1);1;0)=SI(DECALER($G17;1;;1)>$G17;1;0);1;0)=0);$G17;"")
Les max recherchés apparaissent en colonne H

Alain CROS

"twinley" a écrit dans le message de news: u0A#

Slt,

6
7
8
7
6
5
6
7
8
9
10
11
12
11
10
9

dans cette suite comment identifier que 12 est un sommet et que 8 est un
autre sommet
Grande.Valeur trouve facilement 12 avec le rang 1 mais il faut mettre
rang 5 pour trouver 8, hors pour trouver 5 il faut tâtonner.
Et pour compliquer la suite est variable en amplitude et en temps
Pas si simple

à+twinley



Avatar
RaMA
Veux tu le classeur test en Bal

Salutations
RaMa

--
.
"twinley" a écrit dans le message de news:

A part le Ctrl+Maj+enter
c'était bon
si je met 1 à la fin les valeurs sont répétée dans chaque fml
si je met 2 à la fin j'ai #NOMBRE! ou #VALEUR pour les deux cells
extrêmes.

Je ne comprend rien au fml...

à+twinley

RaMA wrote:
Les Définitions de plages:
définir nom maplaj pour A3 à A18
définir nom maplaj2 pour A2 à A17
définir nom maplaj3 pour A4 à A19
Les formules sont à valider Ctl+Maj+entrée
pour le pic MAX
=-PETITE.VALEUR(((maplaj2>MaPlaj)+(Maplaj3>MaPlaj)-1)*MaPlaj;1)
Pour le second
=-PETITE.VALEUR(((maplaj2>MaPlaj)+(Maplaj3>MaPlaj)-1)*MaPlaj;2)

Etc...
Salutations
RaMa





Avatar
twinley
Avec plaisir, l'adresse twinley et tu remplaces at par @



Merci

twinley

RaMA wrote:
Veux tu le classeur test en Bal

Salutations
RaMa



Avatar
Alain CROS
Re

Au cas ou pour des valeurs négatives.
Rajouter
G18=PETITE.VALEUR(A2:A17;1)

Alain CROS

"twinley" a écrit dans le message de news: u0A#

Slt,


Avatar
twinley
Bonsoir Alain Cros

Ben ça alors !
ça marche aussi avec d'autres séries à deux sommets.
Plus fort, ça marche avec trois sommets !

Bon il me reste à comprendre la logique de la formule et la transposer
en VBA sans utiliser la formule. J'y entend rien dans ces formules sans
fin.

C'est une solution sérieuse pour la finale... avec la solution graphique
et équation.

Merci beaucoup. J'en reviens pas.

à+twinley

Alain CROS wrote:
Bonjour

En reprenant ton exemple en A2:A17
En Colonne G par exemple
G1=PETITE.VALEUR(A2:A17;1)
G2¢ puis tirer en G17 donc G17¡7
En Colonne H
H2=SI(ET(SI(DECALER($G2;1;;1)>$G2;1;0)=0;SI(SI(G2>DECALER($G2;-1;;1);1;0)=SI(DECALER($G2;1;;1)>$G2;1;0);1;0)=0);$G2;"")
Tirer en H17 donc
H17=SI(ET(SI(DECALER($G17;1;;1)>$G17;1;0)=0;SI(SI(G17>DECALER($G17;-1;;1);1;0)=SI(DECALER($G17;1;;1)>$G17;1;0);1;0)=0);$G17;"")
Les max recherchés apparaissent en colonne H

Alain CROS

"twinley" a écrit dans le message de news: u0A#

Slt,

6
7
8
7
6
5
6
7
8
9
10
11
12
11
10
9

dans cette suite comment identifier que 12 est un sommet et que 8 est un
autre sommet
Grande.Valeur trouve facilement 12 avec le rang 1 mais il faut mettre
rang 5 pour trouver 8, hors pour trouver 5 il faut tâtonner.
Et pour compliquer la suite est variable en amplitude et en temps
Pas si simple

à+twinley








1 2 3 4 5