Bonjour
je vous propose l'exercice suivant :
la côte de la surface d'un bassin supposé très profond est initialement fixée au niveau 0 . cette côte monte et descend systématiquement selon cette règle :
montée du niveau :
avec une probabilité de 4/7 le bassin monte de 50 cm , sinon avec la probabilité contraire , il monte de 20 cm.
descente du niveau :
avec une probabilité de 7/9 le bassin descend de 30 cm , sinon avec la probabilité contraire il descend 15 cm.
on convient qu'a l'étape 0 , le niveau h =0 .
Quelle est la probabilité qu'a l'étape 2 le niveau du bassin depuis la référence 0 soit de +40 ?
Bonjour Verdurin ..ce n'est pas tout à fait ca pour le résultat obtenu ...
initialement admet que le plan d'eau est au niveau 0 cm (h=0) à l'étape e=0 . par la suite le bassin monte et descend et se mouvement se répète indéfiniment avec la règle énoncée précédement , à savoir :
montée du niveau :
avec une probabilité de 4/7 le bassin monte de 50 cm , sinon avec la probabilité contraire , il monte de 20 cm.
descente du niveau :
avec une probabilité de 7/9 le bassin descend de 30 cm , sinon avec la probabilité contraire il descend 15 cm.
J'ai du faire une erreur .
Mon raisonnement:
Pour tomber exactement sur +40 en deux temps,je ne vois que 3 séquences:
1) +50-20 puis +50-20
2) +50-15 puis +20-15
3) +20-15 puis +50-15
Je me demande bien quel cas tu as oublié candide2?
J'ai les mêmes 3 cas que dpi (à une typo près).
Et j'obtiens comme les autres 880/3969 ~= 0.2217
Les 3 cas sont :
1) +50-30 puis +50-30 avec proba = (4/7 * 7/9) * (4/7 * 7/9)
2) +50-15 puis +20-15 avec proba = (4/7 * 2/9) * (3/7 * 2/9)
3) +20-15 puis +50-15 avec proba = (3/7 * 2/9) * (4/7 * 2/9)
La proba totale est :
(4/7 * 7/9) * (4/7 * 7/9) + (4/7 * 2/9) * (3/7 * 2/9) + (3/7 * 2/9) * (4/7 * 2/9) = 1164240/5250987 = 0,2217183...
Dans ma première réponse, je n'avais pris en compte que le cas 1 et 2 ...
On peut bien entendu simplifier 1164240/5250987 en 880/3969
Bonjour
en programmation sauf erreur on a :
Function Pr(h As Integer, k As Integer) As Double
If h = 0 And k = 0 Then
Pr = 1
ElseIf (h <> 0 And k = 0) Then
Pr = 0
Else
Pr = Pr(h + 10, k - 1) * (21 / 63) + Pr(h - 20, k - 1) * (28 / 63) + Pr(h - 35, k - 1) * (8 / 63) + Pr(h - 5, k - 1) * (6 / 63)
End If
End Function
Sub TEST()
MsgBox Pr(40, 2) 'retourne 0,2217
End SubÇa m'a l'air correct mais terriblement inefficace
On a 4 appels récursifs pour chaque k. On a donc un algo en O(4^n).
Si on augmente k, il va vite avoir du mal
Voici un code qui construit l'ensemble des possibilités après chaque étape:
from collections import defaultdict
def solve(steps=2, up=((50, 4), (20, 3)), down=((30, 7), (15, 2))):
positions = {0: 1}
for _ in range(steps):
# Up
new_positions = defaultdict(int)
for pos, prob in positions.items():
for u, prob_u in up:
new_positions[pos + u] += prob_u * prob
positions = new_positions
# Down
new_positions = defaultdict(int)
for pos, prob in positions.items():
for d, prob_d in down:
new_positions[pos - d] += prob_d * prob
positions = new_positions
return positions
def main():
solution = solve()
print(solution) # defaultdict(<class 'int'>, {40: 880, 55: 448, 10: 1212, 25: 672, 70: 64, -20: 441, -5: 252})
print(solution[40] / sum(solution.values())) # 0.2217183169564122
if __name__ == '__main__':
main()
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :