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 :

Itération d'optimisation


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 5
    Par défaut Itération d'optimisation
    Bonjour!

    Je suis étudiant en école d'ingénieur en stage en Nouvelle Zélande sur un problème de mécanique des fluides modélisé sous Excel 2016 (Mac) et je rencontre un problème.

    Pour une géométrie de tube fixe, je rentre en entrée un débit, je récupère la valeur des pertes de charge. J'aimerais mettre la main sur le débit à appliquer pour avoir une perte de charge imposée.
    En théorie il suffirait d'inverser les matrices de mon calcul initial, malheureusement le calcul n'est pas aussi simple et je n'y arrive pas.. J'ai donc choisi d'utiliser le solveur.
    J'ai choisi de dupliquer ma feuille de calcul qui me donne les pertes de charge en fonction du débit. Dans une case j'ai mis la valeur que je souhaite obtenir. Je crée une case "Erreur" qui fait la différence entre la valeur souhaitée et celle obtenue.
    Dans le solveur, je lui demande de changer la valeur d'une seule case (le débit) afin que la case "Erreur" soit inférieure à 0,01.

    C'est très fonctionnel et j'obtiens, pour chaque valeur de perte de charge, le débit escompté.

    Maintenant, j'aimerais que ce calcul se fasse automatiquement, sans que je n'aie à rentrer la valeur de la perte de charge à chaque fois.
    Est ce que quelqu'un a idée de la façon de procéder ? Ca m'aiderait beaucoup

    J'ai donc une colonne en entrée, qu'il faudra injecter case par case dans mon calculateur, qui s'inverse grâce à l'utilisation du solveur en optimisant toujours la même case, et obtenir une colonne en sortie.
    J'espère avoir été assez clair, n'hésitez pas à demander s'il y a des points obscurs, j'essaierais de détailler.

    Merci d'avance,
    Vincent

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    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 680
    Par défaut
    Bonjour,

    Connais-tu l'enregistreur de macro?
    C'est très pratique ça te permet de récuperer le code d'une action que tu fais "à la main".
    En l'occurence ça pourrais te permettre de récupérer le code du solveur.
    Ensuite il suffit d'adapter un peu et de rajouter une boucle.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 5
    Par défaut
    Oui j'ai essayé et ça n'a pas enregistré les infos relatives au solveur...
    J'ai donc juste retrouvé les opérations de changement de feuilles, de sélection de cases mais pas d'info relatives au solveur. C'est pour ça que quand je vois des lignes de code pour d'autres problèmes je n'arrive pas à comparer parce que je ne les comprends pas trop trop ...

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Voici deux fonctions. L'une retourne le débit en litres/heure quand J lui est passé en argument (en mmCE) et l'autre retourne J quand le débit lui est passé en argument (en litres/heure). Pour ces deux fonctions, le fluide est de l'eau claire et les natures de tubes sont : Cuivre, Acier et Per (polyéthylène réticulé) pour la rugosité et ces tubes sont circulaires. Adapte les valeurs dans la proc de test :
    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
    Sub Test()
     
        Dim Diametre As Single
        Dim TempEau As Single
        Dim NatTube As String
        Dim J As Single
        Dim Debit As Single
     
        NatTube = "Cuivre" 'pour connaître la rugosité du tube
        TempEau = 55 'en °C
        Diametre = 26 'en mm
     
        J = 231 'en mm de colonne d'eau
        MsgBox RetourneDebit(J, NatTube, Diametre, TempEau) 'en litres/heure
     
        Debit = 5000 'en litres/heure
        MsgBox RetournePerte(Debit, NatTube, Diametre, TempEau) 'en mmCE
     
    End Sub
     
    Function RetournePerte(Debit As Single, _
                           NatureTube As String, _
                           Diametre As Single, _
                           Temp_Eau As Single) As Double
     
        Dim A As Single '3 coefficients intermédiaires qui permettent d'éviter le recours à la fonction de Colebrook
        Dim B As Single
        Dim C As Single
        Dim Cpe As Single 'coefficient de perte de charge
        Dim J As Single
        Dim Rug As Single
        Dim M_Eau As Single
        Dim Re As Single
        Dim V As Single
     
        Const Pi As Single = 3.14159265358979
     
        Select Case NatureTube
     
            Case "Cuivre": Rug = 0.0000015
            Case "Acier": Rug = 0.00005
            Case "Per": Rug = 0.000003
     
        End Select
     
        M_Eau = 0.0000000008 * Temp_Eau ^ 5 + _
                -0.000000303 * Temp_Eau ^ 4 + _
                0.000053678 * Temp_Eau ^ 3 + _
                -0.00780474 * Temp_Eau ^ 2 + _
                0.0523705799 * Temp_Eau + _
                999.83932
     
            V = ((Debit / 3600) * 0.001) / ((Diametre / 2 * 0.001) ^ 2 * Pi)
     
            Re = (V * (Diametre * 0.001)) / (-2.2183992 * 10 ^ -12 * Temp_Eau ^ 3 + _
                  0.00051252585 * 10 ^ -6 * Temp_Eau ^ 2 - _
                  0.043254681 * 10 ^ -6 * Temp_Eau + 1.6993718 * 10 ^ -6)
     
            Select Case Re
     
                Case Is <= 2320 'régime laminaire
                    Cpe = 64 / Re
     
                Case Is <= 3158 + 48000 * Rug / Diametre 'régime intermédiaire
                    Cpe = -1.292 * 10 - 2 + 8.88 * 10 - 5 * Re ^ 0.8
     
                Case Else 'régime turbulent
                    A = -2 * Log((Rug / (Diametre / 1000)) / 3.71 + 12 / Re) / Log(10)
                    B = -2 * Log((Rug / (Diametre / 1000)) / 3.71 + 2.51 * A / Re) / Log(10)
                    C = -2 * Log((Rug / (Diametre / 1000)) / 3.71 + 2.51 * B / Re) / Log(10)
                    Cpe = (A - ((A - B) ^ 2) / (A + C - (2 * B))) ^ -2
     
            End Select
     
            J = Cpe / (Diametre / 1000) * V ^ 2 / (2 * 9.81) * 1000
     
        RetournePerte = J
     
    End Function
     
    Function RetourneDebit(Max_mmCE As Single, _
                           NatureTube As String, _
                           Diametre As Single, _
                           Temp_Eau As Single) As Double
     
        Dim A As Single '3 coefficients intermédiaires qui permettent d'éviter le recours à la fonction de Colebrook
        Dim B As Single
        Dim C As Single
        Dim Cpe As Single 'coefficient de perte de charge
        Dim J As Single
        Dim Rug As Single
        Dim D As Single
        Dim M_Eau As Single
        Dim Re As Single
        Dim V As Single
     
        Const Pi As Single = 3.14159265358979
     
        Select Case NatureTube
     
            Case "Cuivre": Rug = 0.0000015
            Case "Acier": Rug = 0.00005
            Case "Per": Rug = 0.000003
     
        End Select
     
        M_Eau = 0.0000000008 * Temp_Eau ^ 5 + _
                -0.000000303 * Temp_Eau ^ 4 + _
                0.000053678 * Temp_Eau ^ 3 + _
                -0.00780474 * Temp_Eau ^ 2 + _
                0.0523705799 * Temp_Eau + _
                999.83932
     
        Do
     
            D = D + 0.1
     
            V = ((D / 3600) * 0.001) / ((Diametre / 2 * 0.001) ^ 2 * Pi)
     
            Re = (V * (Diametre * 0.001)) / (-2.2183992 * 10 ^ -12 * Temp_Eau ^ 3 + _
                  0.00051252585 * 10 ^ -6 * Temp_Eau ^ 2 - _
                  0.043254681 * 10 ^ -6 * Temp_Eau + 1.6993718 * 10 ^ -6)
     
            Select Case Re
     
                Case Is <= 2320 'régime laminaire
                    Cpe = 64 / Re
     
                Case Is <= 3158 + 48000 * Rug / Diametre 'régime intermédiaire
                    Cpe = -1.292 * 10 - 2 + 8.88 * 10 - 5 * Re ^ 0.8
     
                Case Else 'régime turbulent
                    A = -2 * Log((Rug / (Diametre / 1000)) / 3.71 + 12 / Re) / Log(10)
                    B = -2 * Log((Rug / (Diametre / 1000)) / 3.71 + 2.51 * A / Re) / Log(10)
                    C = -2 * Log((Rug / (Diametre / 1000)) / 3.71 + 2.51 * B / Re) / Log(10)
                    Cpe = (A - ((A - B) ^ 2) / (A + C - (2 * B))) ^ -2
     
            End Select
     
            J = Cpe / (Diametre / 1000) * V ^ 2 / (2 * 9.81) * 1000
     
        Loop While J <= Max_mmCE
     
        RetourneDebit = D
     
    End Function

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    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 680
    Par défaut
    Oui j'ai essayé et ça n'a pas enregistré les infos relatives au solveur...
    Etrange ...

    Voici ce que me donne l'enregistreur de macro:
    Nom : exemple.jpg
Affichages : 920
Taille : 51,1 Ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("D1").GoalSeek Goal:=1, ChangingCell:=Range("A1")

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 5
    Par défaut
    Ah y'a du fluxeux ici
    Merci d'avoir pris le temps de répondre, même si la solution ne m'aide pas trop. Le code proposé a l'air de fournir une réponse pour un tube quelconque, et mon tube est loin d'être quelconque.
    Je m'intéresse à un capillaire dont les dimensions sont connues grâce à une IRM. J'ai donc en entrée une longueur de tube, et en 86 points de ce tube j'ai la surface mouillée et le périmètre. Comme j'impose le débit, je calcule la vitesse en les 86 points de ce tube, puis les nombres de Reynolds associés, et donc le coefficient de friction local (je suis tout le temps en laminaire). Enfin, en additionnant les 85 coefficients (85 portions de tube pour 86 points) les uns aux autres je récupère ma perte de charge dûe à la friction. Je fais pareil pour les pertes de charge singulières liées aux variations de section (élargissement/rétrécissement brusque) et j'ai donc ma perte de charge totale.
    Quand j'utilise le solveur, c'est pour déterminer le débit tel que, pour cette même géométrie, la somme des pertes de charge soit égale à la valeur que je souhaite.



    Halaster08, pour ta macro, juste en tapant ça ça te donne l'antécédent ? Il te le calcule dans la case A1, mais comment faire pour faire varier la valeur objectif (tu as marqué 1 dans ton exemple, est ce que je peux lui demander de prendre les valeurs stockées dans un colonne ?) afin d'avoir une colonne en sortie ?

    Merci en tout cas, on progresse

Discussions similaires

  1. [Free Pascal] Optimisation d'une itération sur une String (enlever le dernier mot)
    Par Invité dans le forum Free Pascal
    Réponses: 4
    Dernier message: 18/02/2013, 19h13
  2. Optimisation de votre SGBDR et de vos requêtes...
    Par SQLpro dans le forum Langage SQL
    Réponses: 35
    Dernier message: 11/01/2013, 11h49
  3. [langage]Problème de temps de lecture, optimisation
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2003, 08h47
  4. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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