Résolution equation du 3ème degré


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

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.