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 :

Erreur 5 pour la résolution d'une équation du 3ème ordre


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Erreur 5 pour la résolution d'une équation du 3ème ordre
    Bonsoir, je tente de résoudre une équation du 3ème degré j'ai donc utiliser la méthode cardan

    Mon code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub mb()
    mi = Sheets("Dimensionnement").Range("F22").Value
    p = 3 * mi - 7
    q = 3 - 15 * mi
    t = 4 * p * p * p + 27 * q * q
    y = (-q / 2 - 0.5 * (t / 27) ^ (1 / 2)) ^ (1 / 3) + (-q / 2 + 0.5 * (t / 27) ^ (1 / 2)) ^ (1 / 3)
    Range("F23").Value = y
    End Sub
    Excel me renvoit l'erreur 5 je ne comprend pas pourquoi ...

    Merci d'avance pour votre aide.

    Cordialement
    Guillaume

  2. #2
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Points : 9 402
    Points
    9 402
    Par défaut
    Bonjour,

    Apparemment la formule suivante fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    y = (-q / 2 - 0.5 * (t / 27) ^ (1 / 2))
    Mais si on ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    y = (-q / 2 - 0.5 * (t / 27) ^ (1 / 2)) ^ (1 / 3)
    Cela ne fonctionne plus.

    Est ce que cette formule est correct ?

    NB : me souviens plus a quoi sert le ^. peux tu me rafraichir la mémoire

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut jfontaine et le forum
    3^2=3² il me semble
    A+

  4. #4
    Expert éminent Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Points : 9 402
    Points
    9 402
    Par défaut
    Merci Gorfael, je l'avais sur le bout de la langue

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut jfontaine et le forum
    Je pense que l'erreur 5 vient d'une limitation d'excel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
    Dim x As Double
    x = (5 - 10)
    x = x ^ (1 / 2)
    End Sub
    sort une erreur 5 alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub test()
    Dim x As Double
    x = -5 ^ (1 / 2)
    End Sub
    Passe. Quoique pour moi, excel sorte la moitié des solutions : Racine de 4 donnant -2 ou +2. Mais ça fait longtemps que je ne me suis pas immergé dans les maths.
    A+

  6. #6
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Oui la formule mathématique est bonne

    le 1/2 c'est pour ma racine carré et le 1/3 pour ma racine troisième

    à moi que le ^ ne sert pas a signifier les puissances sous VBA?

    Quelqu'un aurai une solution où un code alternatif pour résoudre numérique une équation du type :

    ax^3 + bx^2 + cx + d = 0

    Merci pour vos aides

  7. #7
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x = -5
    z = x ^ (1 / 3) 'erreur
    z = IIf(x > 0, 1, -1) * Abs(x) ^ (1 / 3) 'résultat correct
    EDIT
    e pense que l'erreur 5 vient d'une limitation d'excel :
    Code :

    Sub test()
    Dim x As Double
    x = (5 - 10)
    x = x ^ (1 / 2)
    End Sub
    La racine carrée d'un nombre négatif est un nombre complexe! (-5)^(1/2) n'a aucun sens dans IR et est différente de -5^(1/2)
    par contre la racine troisième existe bien dans IR

    Pour détourner en vba (le cas de la racine troisième), ci-haut une des pistes

  8. #8
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    j'ai modifier mon code pour qu'il devienne le suivant :

    la fonction llf marche nickel dans le code que j'avais mis au dessus sauf que si t est négatif la racine carré est fausse ... j'ai donc résolu le système en complexe avec les arg et modules.

    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
     
    Sub mb()
    mi = Sheets("Dimensionnement").Range("F22").Value
    a = -1 / 3
    b = 1
    c = 2 * mi
    d = -2 * mi
    g = -a / 3
    p = b - a * a / 3
    q = c - a * b / 3 + 2 * a * a * a / 27
    Delta = 4 * p * p * p + 27 * q * q
    If Delta > 0 Then
    Y1 = (-q + (Delta / 27) ^ (1 / 2)) / 2
    Y2 = (-q - (Delta / 27) ^ (1 / 2)) / 2
    r = (Y1) ^ (1 / 3)
    S = (Y2) ^ (1 / 3)
    X = r + S
    Range("F23").Value = X
    End If
    If Delta < 0 Then
    For k = 0 To 2
    y = (3 * q / (2 * p) * (3 / -p) ^ (1 / 2))
    o = Atn(y / Sqr(-y * y + 1)) + Maths.Pi / 2
    Z = 2 * (-p / 3) ^ (1 / 2) * Cos(1 / 3 * o + 2 * k * Maths.Pi / 3)
    If Z > 0 And Z < 1 Then
    Range("F23").Value = Z
    End If
    Next k
    End If
    Cependant il me retourne toujours une erreur 5 je vais rajouter les llf et on verra mais je pense pas que ca vienne de là il me renvoie l'erreur au niveau du if Z>0 ...

    Cordialement Guillaume

  9. #9
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Après correction de mes formules mathématiques il me sort erreur 424 objet requis je sèche là ...



    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
     
    Sub mb()
    mi = Sheets("Dimensionnement").Range("F22").Value
    a = -3
    b = -6 * mi
    c = 6 * mi
    g = -a / 3
    p = b - a * a / 3
    q = c - a * b / 3 + 2 * a * a * a / 27
    Delta = 4 * p * p * p + 27 * q * q
    Range("G22") = Delta
    If Delta > 0 Then
    y1 = (-q + (Delta / 27) ^ (1 / 2)) / 2
    y2 = (-q - (Delta / 27) ^ (1 / 2)) / 2
    r = IIf(y1 > 0, 1, -1) * Abs(y1) ^ (1 / 3)
    S = IIf(y2 > 0, 1, -1) * Abs(y2) ^ (1 / 3)
    X = r + S
    Range("F23").Value = X
    End If
    If Delta < 0 Then
    For k = 0 To 2
    y = (3 * q / (2 * p) * (3 / -p) ^ (1 / 2))
    o = Atn(y / (-y * y + 1) ^ (1 / 2)) + Maths.Pi / 2
    Z = 2 * (-p / 3) ^ (1 / 2) * Cos(1 / 3 * o + 2 * k * Maths.Pi / 3)
    Next k
    End If

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 134
    Points : 129
    Points
    129
    Par défaut
    Attention, sous Excel comme sous beaucoup de logiciels de calcul demander à verifier si c'est "=" peut induire des erreurs... tu as tjrs des termes résiduels, par exemple ; 0 = 0 n'est pas toujours vrai, car en général le 0 estimé est 0.00000001 et pas 0...

  11. #11
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Marsgui Voir le message
    Après correction de mes formules mathématiques il me sort erreur 424 objet requis je sèche là ...

    l'erreur se situe pour le delta négatif

    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
     
    Sub mb()
    mi = Sheets("Dimensionnement").Range("F22").Value
    a = -3
    b = -6 * mi
    c = 6 * mi
    g = -a / 3
    p = b - a * a / 3
    q = c - a * b / 3 + 2 * a * a * a / 27
    Delta = 4 * p * p * p + 27 * q * q
    Range("G22") = Delta
    If Delta > 0 Then
    y1 = (-q + (Delta / 27) ^ (1 / 2)) / 2
    y2 = (-q - (Delta / 27) ^ (1 / 2)) / 2
    r = IIf(y1 > 0, 1, -1) * Abs(y1) ^ (1 / 3)
    S = IIf(y2 > 0, 1, -1) * Abs(y2) ^ (1 / 3)
    X = r + S
    Range("F23").Value = X
    End If
    If Delta < 0 Then
    For k = 0 To 2
    y = (3 * q / (2 * p) * (3 / -p) ^ (1 / 2))
    o = Atn(y / (-y * y + 1) ^ (1 / 2)) + Maths.Pi / 2
    Z = 2 * (-p / 3) ^ (1 / 2) * Cos(1 / 3 * o + 2 * k * Maths.Pi / 3)
    Next k
    End If

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 134
    Points : 129
    Points
    129
    Par défaut
    Voici je que j'expliquai, dans le lien que tu as donné la personne utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Abs(p) < 0.000000000001)
    Car si tu demandes par exemple de calculer 3.3-3-0.3, sous excel VBA cela ne fait pas 0 mais -1.6653e-016. Donc tes solutions erronées proviennent peut-être de là...

    Tu ne déclares pas tes variables au départ ???

    Dim k as integer,
    Dim p as double, etc.

  13. #13
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    je suis pas encore trop copain avec les déclarations de variables.

    je commence je vais les rajoutes maintenant vu que mon code marche mieux je défini toujours mes ranges c'est tout pour l'instant. c'est un tord je sais mais je débute en VBA chaque chose en son temps.

    Maintenant c'est parti pour une équation du 4ème degré à resoudre ...

  14. #14
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Il me sort toujours une erreur 5 ...

    voilà le code source de mon algo de résolution :

    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
     
    Sub au()
     
    mu = Range("B22").Value
    mi = Range("B21").Value
     
    Dim ta As Range
    Dim Z As Double, AA As Double, BB As Double, CC As Double
    Dim C2 As Double, D2 As Double, delta As Double, delta2 As Double, delta3 As Double
    Dim W As Double, U As Double, T As Double, R As Double, S As Double
    Dim Decal As Double, Partie1 As Double, Partie2 As Double, Partie3 As Double, Partie4 As Double
     
    Dim X1 As Double, X2 As Double, X3 As Double, X4 As Double
    If mu = "A1" Then
     
     
     
     
     
    A = 15
    B = -900
    C = (20 - 4 * mi)
    D = 8 * mi
    E = -4 * mi
     
     
    Z = B / (2 * A)
    AA = C / A - 3 * Z ^ 2 / 2
    BB = D / A + Z ^ 3 - C * Z / A
    CC = E / A - 3 * Z ^ 4 / 16 + C * Z ^ 2 / (4 * A) - D * Z / (2 * A)
    D2 = -2 * AA ^ 3 / 27 - BB ^ 2 + 8 * AA * CC / 3
    C2 = -(AA ^ 2 + 12 * CC) / 3
    delta = (C2 / 3) ^ 3 + (D2 / 2) ^ 2
     
    Select Case delta
        Case Is > 0
        W = (-D2 / 2 + delta ^ 0.5) ^ (1 / 3)
        U = W - C2 / 3 / W
        Case Is = 0
        U = 3 * D2 / C2
        Case Is < 0
        U = 2 * (-C2 / 3) ^ 0.5 * Cos(ArcCos(-D2 / 2 / (-C2 / 3) ^ (3 / 2)) / 3)
    End Select
     
    T = AA / 3 + U
    R = (T - AA) ^ 0.5
    S = ((T / 2) ^ 2 - CC) ^ 0.5
    Decal = -B / (4 * A)
    delta2 = R ^ 2 - 2 * T - 4 * S
     
    If BB > 0 Then
    Partie1 = R / 2
    Else
    Partie1 = -R / 2
    End If
    Partie2 = Abs(delta2) ^ 0.5 / 2
     
    Select Case delta2
    Case Is >= 0
    X1 = Partie1 + Partie2 + Decal
    X2 = Partie1 - Partie2 + Decal
    Case Is < 0
    X1 = Partie1 + Decal & "+i" & Partie2
    X2 = Partie1 + Decal & "-i" & Partie2
    End Select
     
    delta3 = R ^ 2 - 2 * T + 4 * S
    If BB > 0 Then
    Partie3 = -R / 2
    Else
    Partie3 = R / 2
    End If
    Partie4 = Abs(delta3) ^ 0.5 / 2
     
     
    Select Case delta3
    Case Is >= 0
    X3 = Partie3 + Partie4 + Decal
    X4 = Partie3 - Partie4 + Decal
    Case Is < 0
    X3 = Partie3 + Decal & "+i" & Partie4
    X4 = Partie3 + Decal & "-i" & Partie4
     
    End Select
     
    Range("G22") = X1
    Range("G23") = X2
    Range("G24") = X3
    Range("G25") = X4
     
    End If
     
    If mu = "A2" Then
    A = 1 - (1 - (7 + 100 * mi) / 57) ^ (1 / 2)
    Range("B23") = A
    B = (16 * A - 1) / 15
    Range("B24") = B
    End If
    If mu = "B" Then
     
    A = 119 / 99 * (1 - (1 - 6 * 99 * mi / (17 ^ 2)) ^ (1 / 2))
    Range("B23") = A
    B = 17 * A / 21
    Range("B24") = B
     
    End If
     
    End Sub
    le problème se situe dans la partie mu="A1"

    Merci d'avance pour votre aide

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 134
    Points : 129
    Points
    129
    Par défaut
    C'est quoi ton A1 ? une variable ? quel est son typage ? Tu vois, si tu avais déclaré tes variables dès le départ...

    Astuce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim A, B, ..., Z As Double
    marche aussi

  16. #16
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    A1 est un texte contenu dans une cellule c'est le pivot sur lequel je me trouve pour dimensionner ma poutre

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 134
    Points : 129
    Points
    129
    Par défaut
    Si ta variable A1 est de type String alors essaie plutôt :

    Ou alors directement le contenu de ta cellule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If mu = Feuilx.Range("X1").Value Then

  18. #18
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    ok je test çà, merci

    seul la 2ème solution marche pour effectuer mes calculs, mais il me renvoie toujours une erreur dans le bloc A1

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 134
    Points : 129
    Points
    129
    Par défaut
    Une rectification dont un membre du forum m'a fait part.
    La déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim A, B, ..., Z As Double
    déclare uniquement la dernière variable Z en type Double, le reste étant de type Variant.

    Ce qui est bien différent de tes déclarations.

    Voila, me suis trompé donc .

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/07/2011, 23h15
  2. Résolution d'une équation trigonométrique
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 20/08/2009, 17h47
  3. Résolution d'une équation
    Par johnvox dans le forum Delphi
    Réponses: 6
    Dernier message: 13/02/2007, 10h04
  4. Réponses: 1
    Dernier message: 08/12/2006, 17h13
  5. Résolution d'une équation par Gauss
    Par rahmani01 dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/11/2006, 22h15

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