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
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.