Bonjour à vous,
N'ayant jamais reçu de formation en programmation et devant actuellement faire un petit algo en VBA, je suis confronté à un souci. Je suis tombé sur cet excellent site, et j'aurais souhaité profiter de vos lumières
Voilà mon problème :
J'aimerais créer un algorithme pour calculer la formule suivante (écrite avec les connaissances que j'ai en info, c'est-à-dire nulles, donc désolé à l'avance si la formulation est mauvaise) :
R = somme(i=1 à n+1, i * ((i-1) sommes(j=1 à n, produit(h prenant comme valeurs l'ensemble des indices de mes i-1 sommes, (1-fh)) * produit(k=1 à n avec k différent de l'ensemble des indices de mes i-1 sommes, fk)))
Je me rends compte que c'est pas très clair, donc je donne comme exemple, pour i=1 :
on a : 1 * (pas de somme puisque i-1 = 0)(pas de premier produit, puisqu'il n'y a pas de somme donc pas d'indice) produit(k=1 à n, fk) = f1*f2*...*fn
pour i=2 :
on a : 2 * somme(j=1 à n, produit(h=j, (1-fh)) * produit(k=1 à n et k <> j, fk)) = 2*(1-f1)*f2*f3*...*fn + 2*(1-f2)*f1*f3*f4*...*fn + ... + 2*(1-fn)*f1*f2*...*f(n-1)
i = 3, on aura de même : 3*(1-f1)*(1-f2)*f3*f4*...*fn + 3*(1-f1)*(1-f3)*f2*f4*...*fn + ... + 3*(1-f(n-1))*(1-fn)*f1*f2*...*fn
...
i = n+1 : (n+1)*(1-f1)*(1-f2)*...*(1-fn)
Et R est donc la somme de tous ces termes. Pour chaque i, tous les fi apparaissent, mais une fois chacun, et ceux qui ne sont pas dans le premier produit sont dans le deuxième.
J'espère que ça aide un peu à comprendre...
J'ai réfléchi à plusieurs solutions possibles. N'étant pas un informaticien, je me suis lancé d'abord dans un algo pour traduire mathématiquement la formule, évidemment je n'y suis pas arrivé. Voilà les deux solutions que j'ai essayées pour l'instant (les cellules que je prends dans excel sont mes fi, placés dans la deuxième colonne à partir de la ligne 199 jusqu'à la ligne 210):
Sol1 :
Cette solution marche pour i=1 (normal puisque j'en ai fait un cas à part) et i=2. Malheureusement elle ne laisse pas apparaître la variation de termes dans mes produits.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 Sub Calcul_indice() Sheets("distances").Select n = 12 o = 198 Range("J229").Select ThisWorkbook.Worksheets("distances").Cells(500, 2) = "" ThisWorkbook.Worksheets("distances").Cells(501, 2) = 1 R = (1 - ThisWorkbook.Worksheets("distances").Cells(500, 2)) P = ThisWorkbook.Worksheets("distances").Cells(501, 2) S = 0 Q = 1 X = 1 aux = 1 pipo = 1 pipette = 1 For i = 1 To n + 1 If i = 1 Then For k = 1 To n X = X * ThisWorkbook.Worksheets("distances").Cells((o + k), 2) Next k Else For j = 1 To n For t = 1 To i - 1 R = R * (1 - ThisWorkbook.Worksheets("distances").Cells((o + j), 2)) Next t For u = i To n If j = n Then P = 1 Else For m = 1 To n And m <> j P = P * ThisWorkbook.Worksheets("distances").Cells((o + m), 2) Next m End If Next u Next j S = S + i * P * R End If Next i S = S + X ThisWorkbook.Worksheets("distances").Cells(229, 10) = S End Sub
Sinon au début j'avais fait :
Mais j'avais redondance de termes, et malgré plusieurs tentatives de bidouillage, je n'ai pas trouvé le moyen de m'en affranchir autrement qu'en faisant n cas particuliers (ce qui n'est pas vraiment le but...).
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 Sub Calcul_indice() Sheets("distances").Select n = 12 o = 198 Range("J229").Select ThisWorkbook.Worksheets("distances").Cells(500, 2) = "" ThisWorkbook.Worksheets("distances").Cells(501, 2) = 1 R = (1 - ThisWorkbook.Worksheets("distances").Cells(500, 2)) P = ThisWorkbook.Worksheets("distances").Cells(501, 2) S = 0 Q = 0 X = 0 aux = 0 pipo = 1 pipette = 1 For j = 1 To (n + 1) If j <> 1 Then For k = (o + 1) To (o + j - 1) pipo = 1 - ThisWorkbook.Worksheets("distances").Cells(k, 2) pipette = pipette * pipo Next k Else: pipette = 1 End If R = pipette pipette = 1 If j <> (n + 1) Then For h = (o + j) To (o + n) pipo = ThisWorkbook.Worksheets("distances").Cells(h, 2) pipette = pipette * pipo Next h Else: pipette = 1 End If P = pipette pipette = 1 If (P * R) = 1 Then aux = 0 Else: aux = j * P * R End If S = S + aux P = 1 R = 1 aux = 0 Next j X = S P = 1 R = 1 For i = 2 To n For j = 1 To n For k = (o + 1) To (o + j) If (o + i) <> k Then pipo = 1 - ThisWorkbook.Worksheets("distances").Cells(k, 2) Else: pipo = 1 End If pipette = pipette * pipo Next k R = pipette pipette = 1 For h = (o + j) To (o + n) If (o + j - 1 + i) <> h Then pipo = ThisWorkbook.Worksheets("distances").Cells(h, 2) Else: pipo = 1 End If pipette = pipette * pipo Next h P = pipette pipette = 1 If (P * R) = 1 Then aux = 0 Else: aux = j * P * R End If Q = Q + aux Next j Next i X = X + Q ThisWorkbook.Worksheets("distances").Cells(229, 10) = X End Sub
Pour info, à l'avenir, je serai amené à travailler sur des fi avec n différent de 12. Voilà pourquoi j'introduis n et non 12.
Ensuite, j'ai réfléchi à faire un tableau à une ligne et n colonne, rempli de tous les arrangements possibles de 1 et de 0 (soit 16 possibilités pour n = 4 par exemple), puis d'aller chercher mes 0 et mes 1 dans le tableau et essayer de les remplacer respectivement par mes termes du premier et du second produit.
Malheureusement, je suis incapable de formaliser ça. Je découvre tout juste la programmation et les algorithmes, et j'ai encore beaucoup de mal à formaliser mes idées.
Voilà, si quelqu'un a ne serait-ce qu'une piste, ce serait vraiment sympa
D'avance merci
Partager