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 :

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
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.
Sinon au début j'avais fait :

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
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...).

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