Bonjour,
Je suis nouveau sur le forum, comme en VBA.
Peut-être que je ne poste pas ma question au bon endroit. Si c'est le cas, je vous présente d'avance mes excuses et j'espère qu'un gentil administrateur pourra m'indiquer le bon chemin.
J'essaye de programmer depuis un petit moment déjà une procédure itérative pour trouver le x qui annule f(x). C'est un peu la fonction "Analyse de scénario" -> "Valeur cible" d'Excel.
Sauf que : je souhaite régler moi-même le critère de précision de la solution ( à 0,1 ou 0,01 prés ou encore moins).
La fonction que j'analyse est affine de la forme f(x)= -a.x + b, ou a et b sont des constantes positives générés aléatoirement avec "Randomize".
Je cherche donc l'intervalle sur lequel le signe des bornes de ma fonction s'oppose.
Le code marche "relativement" bien car il donne souvent la bonne réponse mais quelque fois pour une raison qui m'échappe, il arrive au bout de l'intervalle de recherche que je lui ai fixé et n'a pas trouvé la réponse alors qu'elle y était. Malgré mes recherches, je n'ai pas trouvé la source de ces omissions périodiques.
Est-ce que l'un des honorables membres de ce forum aura la sagacité suffisante pour trouver la réponse à mon problème et la gentillesse pour m'aider ?
Voici le code :
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 Option Explicit Sub trouve_zero() ''''''''Dimensionnement des variables pour la fonction ''''''' Dim fonction As Single Dim a As Single Dim cst As Single '''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''Définition du critére de précision (cdp) ''''''''''''' Dim cdp As Single cdp = 1 * 10 ^ (-1) 'choisir le degré de précision '''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''Dimensionnement des variables de la boucle '''''''''' Dim x As Single Dim i As Single Dim max As Single ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '''''''' Début de la boucle For ''''''''''''''''''''''''''''' max = 10 '''' borne maximale de x x = 0 '''initialisation de x For i = 1 To max * (1 / cdp) ''''la plage de x est [cdp ; 1000] x = cdp * i fonction = f(a, x, cst) If Sgn(fonction + cdp) <> Sgn(fonction) Then '''' La boucle tourne tant que le signe de f(x-cdp) est le même que celui de f(x+cdp) Exit For End If Next '''''''' Fin de la boucle '''''''''''''''''''''''''''''''' If x = max Then MsgBox "Il n'y a pas de solution sur l'intervalle [" & cdp & " ; " & max & "] pour f(x) = " & a & " *x + " & cst & " = 0." '''''Message d'erreur si il n'y a pas de solution dans l'intervalle choisie Else MsgBox " La solution pour f(x) = " & a & " * x + " & cst & " = 0 est x = " & x & " à " & cdp & " prés." ''''' Message quand la macro trouve la solution''''''''''' End If End Sub '''''''' Définition de la fonction ''''''''''''''''' Function f(a As Single, x As Single, cst As Single) As Single a = -Rnd() ''''''' Définition de la pente négative aléatoirement ''''''' cst = Rnd() '''''' Définition de la constante positive aléatoirement '''''' f = a * x + cst '''''' fonction affine simple ''''' End Function
Merci d'avance pour votre aide,
Partager