Resolution equation du 3eme ordre

graph2fre

XLDnaute Nouveau
Bonjour

Je souhaiterais savoir si quelqu'un à déjà résolu une équation du 3ème ordre sur excel du type ax^3 + bx^2 + cx + d = 0 et si possible récupérer son fichier excel ou sa macro.

Je sais que deux méthode existe : la méthode de Cardan mais je suis embêté avec les solutions de nombres complexes. Et une autre méthode consist à passer l'équation du troisieme ordre en multiplication de deux equations. Une du 1er ordre et une du deuxième et excel à des formules pour ca. Mais la encore je n'arrive pas.

J'y ai passé plusieurs semaines sur ce problème sans trouver alors si quelqu'un pouvait m'aider!!!

Merci
 

néné06

XLDnaute Accro
Re : Resolution equation du 3eme ordre

Tapes sur la croix Rouge de USF
Tapes F11 sur la feuil1
Dans la partie gauche Click sur UserForm1

Voici le code

Const PI As Double = 3.1415926536
Private Sub CommandButton1_Click()
a = Val(TextBox1.Text)
b = Val(TextBox2.Text)
c = Val(TextBox3.Text)
d = Val(TextBox4.Text)
e = b / (3 * a)
f = c / a
g = d / a
p = (-3 * (e ^ 2)) + f
q = (2 * (e ^ 3)) - (e * f) + g
k = ((4 * (p ^ 3)) / 27) + (q ^ 2)
If k < 0 Then
x = ((3 * q) / (2 * p)) * Sqr(-3 / p)
t = (1 / 3) * (Atn(-x / Sqr(-x * x + 1)) + 2 * Atn(1))
s1 = -e + Sqr(-4 * p / 3) * Cos(t)
s2 = -e + Sqr(-4 * p / 3) * Cos(t + 2 * PI / 3)
s3 = -e + Sqr(-4 * p / 3) * Cos(t + 4 * PI / 3)
TextBox1.Text = " Il y a trois solutions: " & s1 & " et " & s2 & " et " & s3
TextBox2.Text = " "
TextBox3.Text = " "
TextBox4.Text = " "
ElseIf k = 0 Then
s4 = -e - ((4 * q) ^ (1 / 3))
s5 = -e + ((q / 2) ^ (1 / 3))
TextBox1.Text = " Il y a deux solutions: " & s4 & " et " & s5
TextBox2.Text = " "
TextBox3.Text = " "
TextBox4.Text = " "
Else
s6 = -e + (((-q + Sqr(k)) / 2) ^ (1 / 3)) - (((q + Sqr(k)) / 2) ^ (1 / 3))
TextBox1.Text = " Une solution : " & s6
TextBox2.Text = " "
TextBox3.Text = " "
TextBox4.Text = " "
End If
End Sub

A+
 

néné06

XLDnaute Accro
Re : Resolution equation du 3eme ordre

Bonjour graph2fre

Excuse moi pour le retard, mais je n'ai pas eu beaucoup de temps.
Je fais parvenir une nouvelle mouture qui fonctionne "PRESQUE".
Les arrondis ne sont pas exacts et provoques dans certains cas des erreurs.
Si tu souhaites, ou d'autres XLD corriger ces résultats et les formules, le retour me ferait plaisir.

A+
 
Dernière édition:

néné06

XLDnaute Accro
Re : Resolution equation du 3eme ordre

J'ai changé les variables en les déclarants "Double" ainsi que PI.
Les résultats sont améliorés mais une erreur survient parfois.

Des exemples:

1,3,5,6 donne -2 (exact)
1,3,3,1 donne -1 (exact)
2,15,24,-16 donne -4.000000000000001 , -3.99999999999999, 0.5 (faux) -4, 1/2 (exact)
4,-5,-23,6 donne -2, 0.249999999999986, 3 (faux) résultat = -2, 1/4 , 3
5,4,1,4 donne -1.19380491396465 (exact)

A+
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Resolution equation du 3eme ordre

Bonjour à tous


Un essai par formules, vite fait. C'est brut de fonderie (donc à contrôler), mais si ça peut aider...​


ROGER2327
#5361


Mercredi 11 Décervelage 139 (Saint Eustache, libérateur - fête Suprême Quarte)
18 Nivôse An CCXX, 0,9988h - pierre à chaux
2012-W01-7T02:23:49Z
 

Pièces jointes

  • Equation_du_troisième_degré.xlsx
    12.5 KB · Affichages: 425

néné06

XLDnaute Accro
Re : Resolution equation du 3eme ordre

Bonsoir à tous et particulièrement à Roger.

Devant autant de maitrise, je ne peux que m'incliner !!!
Les applications, tant en VBA que par formules, sont magnifiques!!
Un seul petit détail (minime).

Si je l'applique par le programme en VBA à l'équation 4x^3-5x^2-23x+6=0, le résultat, au lieu d'être: -2,1/4,3, exact par la programmation par formules, est:
x1 = -2,00000000000001
x2 = 0,249999999999986
x3 = 3

Les mathématiques étant une science exacte, ces résultats peuvent contrarier nos ("Chères petites têtes blondes")
Comment affiner cet arrondi par VBA ?

A+
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Resolution equation du 3eme ordre

Bonsoir à tous


  1. Pour Habitude.

    Le code n'est pas si difficile. En voici une version commentée :
    VB:
    Function deg3b(a#, ByVal b#, c#, d#)
    Dim p#, q#, r#, rex1#, rex2#, rex3#, imx2#, imx3#
        'On veut résoudre : a*x^3+b*x^2+c*x+d=0 ; a<>0          (1)
        'On met (1) sous la forme canonique y^3-3*p*y-2*q=0     (2)
        'en posant x=y-b/a/3                                    (3)
        'Il vient :
        'a*(y-b/a/3)^3+b*(y-b/a/3)^2+c*(y-b/a/3)+d=0
        'Après développement et réduction :
        'y^3-3*((b/a/3)^2-c/a/3)*y-2*((b/a/3)^3+b/a/3*c-d)/a/2=0
        'Avec :
        b = b / a / 3
        'y^3-3*(b^2-c/a/3)*y-2*(b^3+(b*c-d)/a/2)=0              (4)
        'D'où :
        p = b ^ 2 - c / a / 3
        q = (b * c - d) / a / 2 - b ^ 3
        'Il faut maintenant résoudre : y^3-3*p*y-2*q=0
        'La méthode à employer dépend du signe de q^2-p^3       (5) ("discriminant" de l'équation)
        r = q ^ 2 - p ^ 3
        If r < 0 Then       'Trois racines réelles.
            r = WorksheetFunction.Acos(q / Sqr(p ^ 3)) / 3      'Valable car r<0 => Abs(q/Sqr(p^3))<1
            rex1 = Sqr(p) * Cos(r + 2.0943951023932) * 2         '2*pi/3 = 2.0943951023931954923084289221863
            rex2 = Sqr(p) * Cos(r - 2.0943951023932) * 2
            rex3 = Sqr(p) * Cos(r) * 2
        Else                'Une racine réelle et deux racines complexes conjuguées si r>0.
                            'Trois racines réelles dont une double si r=0.
            r = Sqr(r)
            p = Sgn(q + r) * Abs(q + r) ^ (1 / 3)
            q = Sgn(q - r) * Abs(q - r) ^ (1 / 3)
            rex1 = q + p
            rex2 = -rex1 / 2
            imx2 = Sqr(3) * (q - p) / 2
            rex3 = rex2
            imx3 = Sqr(3) * (p - q) / 2
        End If
        'À ce stade, on a les racines de (2) : y1=rex1, y2=rex2+i*imx2, y3=rex3+i*imx3
        'Compte tenu de (3), on termine :
        rex1 = rex1 - b
        rex2 = rex2 - b
        rex3 = rex3 - b
        'Renvoi des racines sous forme de tableau :
        deg3b = Array(rex1, rex2, imx2, rex3, imx3)
        'Pour récupérer les résultats :
        '- On suppose les données a, b, c, d en A2:D2.
        '1. Sélectionner cinq cellules contigües dans une ligne.
        'Saisir =deg3c(A2;B2;C2;D2) dans la première et valider matriciellement ( Ctrl Maj Entrée ).
        '2. Sélectionner cinq cellules contigües dans une colonne.
        'Saisir =TRANSPOSE(deg3c(A2;B2;C2;D2)) dans la première et valider matriciellement ( Ctrl Maj Entrée ).
        '3. Pour afficher une des cinq valeurs, saisir =INDEX(deg3c(A2;B2;C2;D2);n), avec n entier de 1 à 5.
        '
        'Remarques :
        '1. Il convient que a<>0. (Sinon l'équation est de degré 2.)
        '2. Si d=0 l'une au moins des racines est nulle. Les deux autres sont les racines de :
        'a*x^2+b*x+c=0
    End Function
  2. Pour néné06

    Excel gère les arrondis moins bien que la plupart des calculatrices. Je ne vois guère d'autre solution que d'appliquer un arrondi sur le résultat final. Mais quelqu'un d'autre trouvera peut-être un autre remède...


ROGER2327
#5363


Jeudi 12 Décervelage 139 (Saint Landru, gynécologue - fête Suprême Quarte)
19 Nivôse An CCXX, 8,6029h - marbre
2012-W02-1T20:38:49Z
 
Dernière édition:

JCGL

XLDnaute Barbatruc
Re : Resolution equation du 3eme ordre

Bonjour à tous,

N'apporte rien à la discussion...

Sinon le plaisir de croiser de nouveau Roger sur XLD...
Bien que l'on soit en "Décervelage", je constate que tu n'as rien perdu... de ta sagacité.

Au plaisir

A + à tous
 

Habitude

XLDnaute Accro
Re : Resolution equation du 3eme ordre

@Roger2327

Merci pour les commentaires.
Sans doute très utile.
Ce n'est pas cependant pas mon niveau de compréhension que je remet en question mais mon niveau de connaissance.

Mon niveau pré-universitaire ne suffit visiblement pas.
 

Discussions similaires

Statistiques des forums

Discussions
312 361
Messages
2 087 626
Membres
103 610
dernier inscrit
Guelim