Résolution equation du 3ème degré

1/5 (1 avis)

Snippet vu 5 655 fois - Téléchargée 34 fois


Contenu du snippet

Ca répond a une question qui traine sur le site :
Je cherchais ce type de code et comme je n'ai pas trouvé de réponse satisfaisante je me suis replongé dans mes cours de lycée...

Code = Mixe entre résolution numérique (algo newton) et algébrique d'une équation du 3ème (respct 2ème) degré permettant d'optenir les 3 (respct 2) racines réelle(s) et/ou imaginaires de l'équation.

Source / Exemple :


Const sngEpsi As Double = 10 ^ (-10) 'critère d'arrêt pr Newton

Sub SolveEquaDeg3_Num(a3 As Double, a2 As Double, a1 As Double, a0 As Double, Mbr2 As Double, Guess As Double, S() As Variant)
    Dim Delta As Double
    Dim r As Double
    Dim A0_ As Double
    Dim r1 As Double
    Dim dbTmp As Double
    Dim ReelTmp As Double
    Dim ImgTmp As Double
       
    A0_ = a0 - Mbr2
    
    If a3 = 0 Then GoTo EquDeg2Solv
    
    ReDim S(3)
    r = Guess
    Delta = 10
    
    While Delta > sngEpsi
        r = r - P3(a3, a2, a1, A0_, r) / DP3(a3, a2, a1, r)
        Delta = Abs(P3(a3, a2, a1, A0_, r))
    Wend
    r1 = r
    
    S(1) = r1
    If r1 <> 0 Then
    '    A_ = a3
    '    B_ = a2 + a3 * r1
    '    C_ = -A0_ / r1
        dbtmp = 1 / 4 * ((a2 + a3 * r1) / a3) ^ 2 + A0_ / r1
        
        If dbtmp < 0 Then
            dbtmp = -dbtmp
            ImgTmp = (dbtmp) ^ (1 / 2)
            ReelTmp = -1 / 2 * (a2 + a3 * r1) / a3
            S(2) = CStr(Format(ReelTmp, "0.0")) + " + i x " + CStr(Format(ImgTmp, "0.0"))
            S(3) = CStr(Format(ReelTmp, "0.0")) + " - i x " + CStr(Format(ImgTmp, "0.0"))
        Else
            ImgTmp = (dbtmp) ^ (1 / 2)
            ReelTmp = -1 / 2 * (a2 + a3 * r1) / a3
            S(2) = ReelTmp + ImgTmp
            S(3) = ReelTmp - ImgTmp
        End If
    Else
    '    A_ = a3
    '    B_ = a2
    '    C_ = a1
        dbtmp = 1 / 4 * (a2 / a3) ^ 2 - a1 / a3
        If dbtmp < 0 Then
            dbtmp = -dbtmp
            ImgTmp = (dbtmp) ^ (1 / 2)
            ReelTmp = -1 / 2 * a2 / a3
            S(2) = CStr(Format(ReelTmp, "0.0")) + " + i x " + CStr(Format(ImgTmp, "0.0"))
            S(3) = CStr(Format(ReelTmp, "0.0")) + " - i x " + CStr(Format(ImgTmp, "0.0"))
        Else
            ImgTmp = (dbtmp) ^ (1 / 2)
            ReelTmp = -1 / 2 * a2 / a3
            S(2) = ReelTmp + ImgTmp
            S(3) = ReelTmp - ImgTmp
        End If
    End If
        
    Exit Sub
    
EquDeg2Solv:
    If a2 = 0 Then
        If a1 <> 0 Then
            ReDim S(1)
            S(1) = -A0_ / a1
        Else
            ReDim S(1)
            S(1) = "toute valeur de x est solution"
        End If
    Else
        ReDim S(2)
        dbtmp = 1 / 4 * (a1 / a2) ^ 2 - A0_ / a2
        If dbtmp < 0 Then
            dbtmp = -dbtmp
            ImgTmp = (dbtmp) ^ (1 / 2)
            ReelTmp = -1 / 2 * A0_ / a2
            S(1) = ReelTmp + " + i" + ImgTmp
            S(2) = ReelTmp - " - i" + ImgTmp
        Else
            ImgTmp = (dbtmp) ^ (1 / 2)
            ReelTmp = -1 / 2 * a1 / a2
            S(1) = ReelTmp + ImgTmp
            S(2) = ReelTmp - ImgTmp
        End If
    End If
End Sub

A voir également

Ajouter un commentaire Commentaire
Messages postés
9
Date d'inscription
vendredi 22 octobre 2004
Statut
Membre
Dernière intervention
14 février 2008

Bonjour
as tu essayé ce code, il me semble qu'il y a quelques petiits problèmes
Merci pour t'a réponse

Serge

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.