Bonjour,
Je viens vers vous pour tenter d'optimiser un algorithme que j'ai écrit, qui fonctionne très bien, mais qui a le défaut d'être très lent.
Je suis absolument certain que l'on peut trouver une solution itérative plus efficace, mais comme cela sort de mon domaine de compétence, je m'en remet à vous.
Pour le fond de l'histoire, il s'agit de trouver la position d'équilibre d'une section en béton armé :
Pour faire simple, lorsqu'on soumet une poutre en béton armé à de la flexion (typiquement une poutre sur deux appuis supportant des charges descendantes), caractérisée par un moment de flexion noté M, on comprime la poutre en fibre supérieure et on la tend en fibre inférieure. La compression est équilibrée par la béton et la traction par les armatures qui sont noyées dans le béton.
Dans les cas complexes, la forme de la section peut être quelconque, la valeur de l'effort de compression dans le béton, que l'on notera Fc, n'est pas linéairement proportionnel à l'allongement de la fibre supérieure que l'on notera eps_sup.
De même, la valeur de l'effort de traction dans les armatures, que l'on notera Fs, n'est pas linéairement proportionnel à l'allongement de la fibre inférieure, que l'on notera eps_inf
On a :
f(eps_sup,eps_inf) = Fc
g(eps_sup,eps_inf) = Fs
h(eps_sup,eps_inf) = z
Les fonctions f, g et h sont non linéaires.
Lorsque l'équilibre est atteint, c'est à dire lorsqu'on a trouvé le bon couple de valeur eps_sup et eps_inf, les équations suivantes se vérifient :
Fc + Fs = 0 (avec Fs > 0 et Fs < 0)
M/z = Fc = -Fs (où M est une constante donnée, c'est le moment de flexion que l'on chercher à équilibrer)
Compte tenu des limites des matériaux, je connais les valeurs maximales et minimales admissibles pour eps_sup et eps_inf.
Je me donne un pas de calcul eps_step, suffisamment petit pour que le calcul converge systématiquement.
Mon algortihme, à ce jour, cherche la solution en recherchant le minimum de la fonction abs(Fc+Fs)/Fc + abs(M_calc-M)/M.
J'ai lu des choses intéressantes sur les algorithme de minimisation, mais je n'ai pas réussi à comprendre comme pratiquement programmer le calcul.
Par avance Merci !
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 Constante : M Variable : delta = 10000000000000 M_calc = 0 eps_sup_candidat = 0 eps_inf_candidat = 0 Pour eps_sup = 0 à eps_sup_max par pas de eps_step Pour eps_inf = eps_min à 0 par pas de eps_step Fc = f(eps_sup,eps_inf) Fs = g(eps_sup,eps_inf) z = h(eps_sup,eps_inf) M_calc = Fc * z Si (abs(Fc+Fs)/Fc + abs(M_calc-M)/M) < delta Alors delta = abs(Fc+Fs)/Fc + abs(M_calc-M)/M eps_sup_candidat = eps_sup eps_inf_candidat = eps_inf Fin Si Fin Pour Fin Pour Retrourner eps_sup_candidat et eps_inf_candidat
Partager