IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Débutant VBA - trouver le zéro d'une fonction affine en réglant la précision


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Août 2017
    Messages : 1
    Par défaut Débutant VBA - trouver le zéro d'une fonction affine en réglant la précision
    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,

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Auclair Voir le message
    J'essaye de programmer depuis un petit moment déjà une procédure itérative pour trouver le x qui annule f(x).
    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".
    Pourquoi ne pas, tout simplement, résoudre l'équation ?
    Ce qui donne f(x) = 0 si x = b / a
    Pas besoin d'itération et la réponse est obtenue avec la précision maximale.

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 681
    Par défaut
    @Menhir
    Je suppose que c'est une exemple simple pour tester la macro avant de passer à des équations plus compliquées pour lesquelles on ne connais pas le résultat.

    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
    Tu te rends compte qu'a chaque appel de ta fonction tu recalcule "a" et "cst" ?

    ajoute ceci: au milieu de ta macro avant de comparer le signe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox f(a, x, cst) & Chr(10) & f(a, x, cst)
    Tu verras que deux fois le même appel de f avec les même arguments donne deux valeurs différente, ton problème est là.

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Je suppose que c'est une exemple simple pour tester la macro avant de passer à des équations plus compliquées pour lesquelles on ne connais pas le résultat.
    C'est aussi ce que je pense et que je voulais faire dire à Auclair.
    Parce que si l'équation est plus compliquée, cette recherche peut poser d'autres problématiques. Par exemple, une fonction peut avoir deux valeurs positives pour deux itérations successives tout en ayant deux valeurs égale à 0 pour des variables intermédiaires.
    Je me suis penché sur le problème à une époque (lointaine) où j'étais étudiant. Il est plus complexe qu'il n'y parait si on commence à s'attaquer à des fonctions complexes (au sens littéral du terme).

Discussions similaires

  1. Trouver le zéro d'une fonction
    Par marion15 dans le forum C++
    Réponses: 10
    Dernier message: 12/06/2013, 15h15
  2. [XL-2007] [débutante VBA] trouver la liste des images utilisée dans une feuille
    Par EmmanuelleC dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/10/2009, 13h46
  3. Trouver rapidement les zéros d'une fonction
    Par nahouto dans le forum MATLAB
    Réponses: 17
    Dernier message: 23/01/2009, 13h32
  4. [VBA-E]passage de parametre à une fonction
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/02/2006, 17h51
  5. [Débutant][indexes]Trouver les indexes d'une table
    Par Gromitou dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 13/12/2005, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo