Anticipation d'une prochaine valeur
Bonjour tout le monde !
Voilà bien quinze jours que je bloque sur ce problème, et je ne trouve toujours pas de solution, c'est assez frustrant.
J'ai noté dans mon fichier ce que je souhaite faire, en espérant que ce soit possible. Si jamais ça l'est, et que le problème venait à être solutionné, ça me rendrait un énooooooorme service.
Je vais quand même tenter d'expliquer mon problème ici : dans une colonne, j'ai toute une série de valeurs. A un moment donné, la valeur change pour une valeur inférieure. Ce que je souhaite faire, c'est qu'avec un coefficient de décroissement, une colonne juste à côté arrive pile au niveau de la nouvelle valeur. Cette opération requiert je pense des calculs itératifs, mais jusque là je n'y suis pas parvenu.
J'espère que ma demande est suffisamment compréhensible, sans quoi j'essaierai de reformuler cela.
En vous remerciant par avance, je vous souhaite une bonne après-midi.
Rod'
Bonjour,
J'ai un peu de peine à comprendre ce que tu souhaites !
Tu veux connaître la vitesse finale maximale pour le pas de temps de façon à ne pas dépasser la décélération maximale ?
Sachant qu'une accélération ou décélération est calculée avec la formule :
a ou d (m/s²) = (Vitesse finale - Vitesse initiale) / temps (si négatif , c'est une décélération)
Si c'est ça, il te faut utiliser la formule : V_finale = d_max x t + V_initiale
Donc, si je prend tes valeurs :
Pas de temps = 0,5 s
Vitesse initiale = 17 m/s
Décélération max = -1 m/s²
Ceci nous donne :
V_finale = -1 x 0,5 +17 = 16,5 m/s
Qu'il est possible de vérifier par :
d_max = (16,5 - 17) / 0,5 = -1 m/s²
Bonjour !
Je comprends que ce soit difficilement compréhensible, désolé ! Ma demande est très spécifique, et relativement complexe. Je vais tenter d'expliquer mieux mon souhait.
La décélération maximale est fixe. Dans un premier temps, la vitesse augmente en fonction de l'accélération a, fixe aussi. Si la vitesse maximale est atteinte, l'accélération s'annule.
A un moment donné, la vitesse maximale va varier. Dans mon exemple, elle passe de 17 à 8. De ce fait, il faut que la vitesse soit à 8 à cet endroit-là précis. Il faut donc que j'arrive à demander à Excel de programmer une décélération suffisante en amont de cette vitesse maximale pour arriver à cette Vmax en temps voulu.
J'espère que c'est un peu plus compréhensible !
Bonjour,
Et si tu tires la formule vers le bas jusqu'à la valeur voulue (de 17 à 8 m/s) ça ne va pas ?
Bonjour,
En fait, la formule de la vitesse en fonction de la décélération est bonne, mais ce que je n'arrive pas à faire, c'est faire en sorte que cette formule s'applique pour arrive à Vmax = 8 pile quand il faut ; le reste du temps ça peut rester à 17. J'espère que mon souhait est réalisable, sinon je me demande vraiment comment je vais faire !
Bonjour,
Qu'est-ce qui fait que ça passe à 8 ? Vmax est vraiment saisi ou c'est une formule ?
Sinon par formule ça risque d'être imbuvable. Plus facile en vba
eric
Bonjour eriiic !
Vmax passe à 8 en fonction d'autres données. Dans un autre onglet, il y a tout un tas de Vmax différentes en fonction de paramètre, et le Vmax général correspond au minimum de toutes ces Vmax pour chaque unité de distance. Et dans l'onglet principal, celui qui me pose problème, le Vmax en question va chercher ce minimum pour chaque unité de distance donnée. Ainsi, lorsque ça passe à 8, ça signifie que sur l'onglet propre aux Vmax, le minimum des Vmax à l'unité de distance donnée est 8. 8 n'est donc pas saisie et provient d'une formule. Sur le fichier que j'ai joint, je l'ai saisi car je pense que les démarches amont ne sont pas nécessaires à la compréhension, car de toutes manière il y aura toujours une valeur à cet instant, et il faudra toujours prendre en compte ces valeurs. Donc j'ai fait quelque chose de plutôt simple et léger à envoyer à titre de fichier exemple.
Oui, je me doute, et je me rends compte que par formule c'est imbuvable. Par contre, je suis bien curieux de savoir comment je peux faire ça en VBA. Est-ce que tu as une idée de solution VBA par hasard ?
Je vous remercie d'ores-et-déjà de vous intéresser à mon problème.
Rod'
Décidément, je suis désolé mais je n'arrive pas à saisir ce que tu souhaites faire au final !
Si tu veux une fonction qui te donne tous les pas jusqu'à approcher la vitesse finale sans la dépasser, je peux te proposer celle plus bas qui est à utiliser sous forme matricielle (Ctrl+Maj+Entrée) en sélectionnant au préalable un certain nombre de cellules dans une colonne. A utiliser par exemple de la façon suivante :
en i1 tu entres la formule ci-dessous :
=VitesseMax(H1;H2;J2;J5)que tu tires jusqu'à i19 puis tu mets le curseur dans la barre de formule et tu valides en matricielle mais au préalable, tu aura saisis en H1 la valeur 17 et en H2 la valeur 8, J2 et J5 ayant déjà les valeurs 0,5 et -1
Function VitesseMax(V_Initiale As Single, V_Finale As Single, Pas_t As Single, d_Max As Single) As Variant()
Dim Tbl()
Dim V As Single
Dim I As Integer
Application.Volatile
V = V_Initiale
Do
If V < V_Finale Then Exit Do
I = I + 1
ReDim Preserve Tbl(1 To I)
Tbl(I) = V
V = d_Max * Pas_t + V
Loop
VitesseMax = Application.Transpose(Tbl())
End FunctionBonjour,
Hum, merci pour le code, mais je ne pense pas que ça convienne à ce que je souhaite faire.
Ci-dessous un code que j'ai tapé ce matin. Il ne fonctionne pas encore, mais la marche est la suivante :
- Dans une première boucle, je demande de décélérer jusqu'à trouver la position à laquelle il arrivera à la prochaine Vmax. Je compare cette position à la position réelle de la prochaine Vmax. Si cette position est inférieure, alors je passe aux étapes suivantes, qui permettent d'affecter une accélération au système en fonction d'autres données.
- La boucle principale permet de rééditer cette opération jusqu'à ce que la position maximale soit atteinte.
L'idée, c'est de remplir les cellules de chaque ligne en fonction de toutes ces données. Les cellules sont celles initialisées, et les variable b et c correspondent aux numéros de ligne.
Le problème que j'ai c'est que ça ne fonctionne pas, ça ne remplit pas mes cellules, et ça ne passe pas aux lignes suivantes.
Qu'est-ce qui pourrait manquer ?
(Je sais, ma question paraît éloignée de ma question principale, désolé. Mais le but recherché est toujours le même : adapter l'accélération en fonction de la position de la prochaine Vmax.)
J'espère qu'une solution est possible !
Aussi je pense que je vais poster un autre sujet concernant les boucles imbriquées, car sur mon code il en est question, et ça ne marche pas. Les deux sujets seront déclarées résolus en même temps.
Ah oui, mon code fait régulièrement planter mon Excel. Est-ce un problème de code ou d'une demande trop datavore ?
En vous remerciant !
Rod'
Option Explicit
Sub Marchetypesensaller_Bouton1_Cliquer()
'Outil et onglets utilisés
Dim OUT As Workbook
Dim VMR As Worksheet
Dim MTA As Worksheet
Dim MTR As Worksheet
Dim ACC As Worksheet
'Toutes les données utiles à la marche-type
Dim Pki As Single 'Pk courant, utilisé également pour les tests
Dim Pko As Single 'Pk à l'instant T
'Dim T As Single 'Variable temporelle
Dim Vo As Single 'Vitesse à l'instant T
Dim Vi As Single 'Vitesse à l'instant T créée pour les tests
Dim a As Single 'Accélération
Dim a1 As Single 'Accélération pallier
Dim amax As Single 'Accélération maximale
Dim Vmax As Single 'Vitesse maximale due à l'infrastructure
Dim VmaxMR As Single 'Vitesse maximale du matériel roulant
Dim V1 As Single 'Vitesse pallier du matériel roulant pour calculer l'accélération
Dim pVmax As Single 'prochaine Vmax infra
Dim PkpVmax As Single 'position de la prochaine Vmax infra
Dim d As Single 'Décélération maximale du matériel roulant
Dim Pkmax As Single
'Pas et cellule variable
Dim k As Single 'Pas de temps
Dim b As Integer 'Cellule
Dim c As Integer 'Cellule suivant
'Initialisation des onglets utilisés
Set OUT = ThisWorkbook
Set VMR = OUT.Worksheets("Validation matériel roulant")
Set MTA = OUT.Worksheets("Marche type sens aller")
Set MTR = OUT.Worksheets("Marche type sens retour")
Set ACC = OUT.Worksheets("ACCUEIL")
Pko = ACC.Cells("16", "G")
Pki = Pko
Pkmax = ACC.Cells("18", "G")
b = 9
c = b + 1
'T = 0
pVmax = MTA.Cells(b, "H")
PkpVmax = MTA.Cells(b, "I")
Vo = MTA.Cells(b, "C")
Vi = Vo
k = MTA.Cells("3", "K")
d = VMR.Cells("7", "B")
amax = VMR.Cells("4", "B")
a = amax
V1 = VMR.Cells("5", "B")
VmaxMR = VMR.Cells("6", "B")
Vmax = MTA.Cells(b, "G")
Do
Do While Vo > pVmax
'Test prochaine position en fonction de prochaine Vmax en cas de décélération
Vi = Vo
Vi = Vi + k * d
Pki = Pko
Pki = Pki + k * Vi
Exit Do
Loop
If Pki >= PkpVmax Then 'Si la position courante ne se trouve plus avant la prochaine Vmax, alors enclencher décélération
Vo = Vo + k * d
Pko = Pko + k * Vo
' Cells(b, "A").Value = T
Cells(b, "E").Value = d
Cells(c, "C").Value = Vo
Cells(c, "D").Value = Vo * 3.6
Cells(c, "B").Value = Pko
' T = T + k
Else
If Pki < PkpVmax Then 'Si la positions courante est en amont de la prochaine Vmax, alors accélérer sous conditions
If Vo = Vmax Then
a = 0
Pko = Pko + k * Vo
' Cells(b, "A").Value = T
Cells(b, "E").Value = 0
Cells(c, "C").Value = Vo
Cells(c, "D").Value = Vo * 3.6
Cells(c, "B").Value = Pko
' T = T + k
Else
If Vo < V1 Then
a = amax
Vo = Vo + k * a
Pko = Pko + k + Vo
' Cells(b, "A").Value = T
Cells(b, "E").Value = a
Cells(c, "C").Value = Vo
Cells(c, "D").Value = Vo * 3.6
Cells(c, "B").Value = Pko
' T = T + k
Else
If Vo < VmaxMR Then
a = (amax / (VmaxMR - Vo)) * (VmaxMR - Vi)
Vo = Vo + k * a
Pko = Pko + k * Vo
' Cells(b, "A").Value = T
Cells(b, "E").Value = a
Cells(c, "C").Value = Vo
Cells(c, "D").Value = Vo * 3.6
Cells(c, "B").Value = Pko
' T = T + k
End If
End If
End If
End If
End If
Loop While Pko < Pkmax
End Sub