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,