Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RESOLUTION D'UNE EQUATION DU TROISIEME DEGRE


Information sur la source

Catégorie :Maths Source .NET ( DotNet ) Classé sous : racine, degré, 3, cardan, équation Niveau : Débutant Date de création : 21/02/2006 Date de mise à jour : 06/10/2007 17:28:30 Vu : 23 861

Note :
Aucune note

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

Description

La fonction RacineDegre3(a,b,c,d) fournit une collection de reels (Double) qui sont les racines de l'equation a*x3 + b*x2 + c*x + d = 0
Par rapport à la contribution de "Geff" celle ci donne un résultat plus précis et la plage des solutions n'est pas limitée par des mini/maxi , mais elle ne traite que les équations du 3éme degré. Par rapport à la contribution de "Charmout", dont je me suis inspiré, la mienne ne fournit pas de racine double: La collection a 1, 2 ou 3 éléments suivant que l'équation a 1, 2 ou 3 racines. J'utilise la méthode de Cardan et je traite le cas spécifique où le déterminant est nul.
Ce code de 30 lignes est facile à insérer dans une application.
 

Source

  • Public Function Rac3(ByVal P3 As Double) As Double
  • Rac3 = Math.Pow(Math.Abs(P3), 1 / 3) * Math.Sign(P3)
  • End Function
  • Public Function RacineDegré3(ByVal a, ByVal b, ByVal c, ByVal d) As Collection
  • 'Resolution d'une équation du troisieme degre
  • 'a x^3 + b x^2 + c x + d = 0
  • Dim q, Dtrm As Double
  • Dim y, p, Cosinus, alpha As Double
  • RacineDegré3 = New Collection
  • y = -b / (3 * a)
  • p = c / a - b ^ 2 / (3 * a ^ 2)
  • q = b ^ 3 / (a ^ 3 * 13.5) + (d / a) - b * c / (3 * a ^ 2)
  • Dtrm = (q ^ 2 / 4) + (p ^ 3 / 27)
  • If Math.Abs(p) < 0.0000000001 Then p = 0
  • If Math.Abs(Dtrm) < 0.0000000001 Then Dtrm = 0
  • If (Dtrm < 0) Then ' Trois racines
  • If (p <> 0) Then Cosinus = (-q / 2) / Math.Sqrt(-p ^ 3 / 27)
  • If (Math.Abs(Cosinus) > 1) Then Cosinus = Math.Sign(Cosinus)
  • For k As Short = 0 To 2
  • RacineDegré3.Add(2 * Math.Sqrt(-p / 3) * Math.Cos((Math.Acos(Cosinus) + 2 * k * Math.Pi) / 3) + y)
  • Next k
  • ElseIf Dtrm = 0 Then ' Deux racines
  • RacineDegré3.Add((-3 * q) / (2 * p) + y)
  • RacineDegré3.Add(3 * q / p + y)
  • Else ' une racine
  • RacineDegré3.Add(Rac3(-q / 2 + Math.Sqrt(Dtrm)) + Rac3(-q / 2 - Math.Sqrt(Dtrm)) + y)
  • End If
  • End Function
    Public Function Rac3(ByVal P3 As Double) As Double
        Rac3 = Math.Pow(Math.Abs(P3), 1 / 3) * Math.Sign(P3)
    End Function

    Public Function RacineDegré3(ByVal a, ByVal b, ByVal c, ByVal d) As Collection
        'Resolution d'une équation du troisieme degre 
        'a x^3 + b x^2 + c x + d = 0 
        Dim q, Dtrm As Double
        Dim y, p, Cosinus, alpha As Double

        RacineDegré3 = New Collection
        y = -b / (3 * a)

        p = c / a - b ^ 2 / (3 * a ^ 2)
        q = b ^ 3 / (a ^ 3 * 13.5) + (d / a) - b * c / (3 * a ^ 2)
        Dtrm = (q ^ 2 / 4) + (p ^ 3 / 27)

        If Math.Abs(p) < 0.0000000001 Then p = 0
        If Math.Abs(Dtrm) < 0.0000000001 Then Dtrm = 0

        If (Dtrm < 0) Then      ' Trois racines
            If (p <> 0) Then Cosinus = (-q / 2) / Math.Sqrt(-p ^ 3 / 27)
            If (Math.Abs(Cosinus) > 1) Then Cosinus = Math.Sign(Cosinus)
            For k As Short = 0 To 2
                RacineDegré3.Add(2 * Math.Sqrt(-p / 3) * Math.Cos((Math.Acos(Cosinus) + 2 * k * Math.Pi) / 3) + y)
            Next k
        ElseIf Dtrm = 0 Then    ' Deux racines
            RacineDegré3.Add((-3 * q) / (2 * p) + y)
            RacineDegré3.Add(3 * q / p + y)
        Else                    ' une racine
            RacineDegré3.Add(Rac3(-q / 2 + Math.Sqrt(Dtrm)) + Rac3(-q / 2 - Math.Sqrt(Dtrm)) + y)
        End If
    End Function

Conclusion

La fonction RacineDegré3 est utilisée dans mon application MiCôplan (logiciel de dessin technique) disponible sur le site http://micoplan.free.fr
 

Historique

02 mars 2006 20:24:14 :
Formulation du titre et de la présentation pour un affichage plus propre
06 octobre 2007 17:28:30 :
Remplacement de "Pi" par "Math.Pi"

Commentaires et avis

signaler à un administrateur
Commentaire de RAPTISTA le 08/06/2007 17:16:35

Il te faut juste une petite declaration du nombre "pi=3.14..."

signaler à un administrateur
Commentaire de comemich le 06/10/2007 17:24:04

Oui, il serait judicieux de remplacer Pi par Math.Pi dans la ligne:
RacineDegré3.Add(2 * Math.Sqrt(-p / 3) * Math.Cos((Math.Acos(Cosinus) + 2 * k * Pi) / 3) + y)
ce qui donne
RacineDegré3.Add(2 * Math.Sqrt(-p / 3) * Math.Cos((Math.Acos(Cosinus) + 2 * k * Math.Pi) / 3) + y)

signaler à un administrateur
Commentaire de eBulle68 le 08/10/2007 11:19:16

Perso, ca marche pas chez moi, Excel reconnait pas:

RacineDegré3 = New Collection (je sais pas par quoi le remplacer)
Math.Sqrt (remplacé par Math.Sqr)
Math.Sign (remplacé par Math.Sgn)
For k As Short = 0 To 2 (je sais pas par quoi le remplacer)
Math.Acos (marche pas, c'est inouï! J'ai créé une fonction trouvée ici: http://www.vbfrance.com/infomsg_FONCTION-ARCCOSINUS_603879.aspx )
Math.pi (pareil)
Math.pow (remplacé par ...^... )

signaler à un administrateur
Commentaire de eBulle68 le 08/10/2007 11:44:38

pour la ligne RacineDegré3 = New Collection il me met " agrument non facultatif" et pour les autres, il connait pas ces fonctions.. du coup je sais pas trop quoi faire, ai-je oublié de charger une référence ou quelque chose?

signaler à un administrateur
Commentaire de comemich le 09/10/2007 00:27:16

Je pense que le VB.NET n'est pas reconnu comme language des macros Excel.

signaler à un administrateur
Commentaire de eBulle68 le 09/10/2007 08:46:50

Mais pourtant ca doit bien être adaptable, non?

signaler à un administrateur
Commentaire de comemich le 10/10/2007 00:23:48

Oui
Bien sûr...
On peut tout faire...
Mais c'est une autre paire de manches.
Et puis, il y a longtemps que je n'écris plus en VB6. Je ne me souviens pas très bien.
Si j'ai le temps, je regarderai ce que je peux faire.
Ce n'est pas insurmontable.
Faut voir...
Si c'est pas trop pressé.

signaler à un administrateur
Commentaire de eBulle68 le 10/10/2007 11:06:20

Non c'est pas trop pressé...
A vrai dire je cherche a faire une feuille de calcul me permettant a tout moment de connaitre la hauteur d'eau dans un bassin. J'ai une relation entre le volume et le temps, puis entre le volume et la hauteur d'eau, mais du fait du bassin bizarre (une sorte de lingot inversé), cette dernière est du 3eme degré, c'est à dire v=f(h) du type v=a*h^3 + b*h^2 + c*h + d

Voilà pourquoi je cherche une macro qui me permette de résoudre efficacement les polynômes du 3eme degré. Je suis pas très pressé, il s'agit d'un travail personnel avant tout. Me demandez pas trop pourquoi je fais ca, c'est plus un défi qu'autre chose... J'aimais bien les problèmes de vidange de baignoire quand j'étais petit ^^

signaler à un administrateur
Commentaire de eBulle68 le 17/10/2007 17:43:25

UP

signaler à un administrateur
Commentaire de Abdelelansari le 26/01/2008 15:38:17

je suis un prof de math et voila mon programme pour la resolution d'equation du 3 degre'
Const PI As Single = 3.14159265358979
Dim e As Long
Dim f As Long
Dim g As Long
Dim p As Long
Dim q As Long
Dim k As Long
Dim x As Integer
Dim t As Integer
Dim s1 As Long
Dim s2 As Long
Dim s3 As Long
Dim s4 As Long
Dim s5 As Long
Dim s6 As Long
a = Val(Text1.Text)
b = Val(Text2.Text)
c = Val(Text3.Text)
d = Val(Text4.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)
   Text1.Text = " Les trois solutions sont : " & s1 & " et " & s2 & " et " & s3
   Text2.Text = "  "
   Text3.Text = " "
   Text4.Text = " "
ElseIf k = 0 Then
   s4 = -e - ((4 * q) ^ (1 / 3))
   s5 = -e + ((q / 2) ^ (1 / 3))
   Text1.Text = " Les deux solutions sont : " & s4 & " et " & s5
   Text2.Text = "  "
   Text3.Text = "  "
   Text4.Text = "  "
Else
   s6 = -e + (((-q + Sqr(k)) / 2) ^ (1 / 3)) - (((q + Sqr(k)) / 2) ^ (1 / 3))
   Text1.Text = " La solution est : " & s6
   Text2.Text = "  "
   Text3.Text = "  "
   Text4.Text = "  "
End If
End Sub
je vous demande de faire analyse et me faire des remarques
Merci infiniment

signaler à un administrateur
Commentaire de comemich le 26/01/2008 18:31:13

Merci Abdelelansari

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

équation de deuxième degré [ par encgt ] bonsoir!je suis d&#233;butante dans la programmation avec vb et j'ai trouv&#233; ce site tr&#232;s int&#233;ressant ...je veux cr&#233;er une applicat résloveur d'équation du second degré [ par SesechXP ] Salut!J'ai fait un petit programme de résolution des équations du second degréalors venez le voir à l'adresse http://www.vbfrance.com/article.aspx?Val Résoudre un système d'équation??? [ par Anarpheus ] Quelqu'un aurait un programme en vb pour résoudre un système à x équations?? Si on pourrait avoir les codes sources avec... Merci c'est assez urgent.. Racine carré. --> Nombre entier ou non? [ par z980x ] Salut, voila mon problème :Je fais une opération avec un exposant 0.5 (Soit l'équivalent d'une racine carré)Je voudrais savoir comment faire pour véri Ecriture sur un fichier avec la racine de l executable [ par gagaet22 ] Bonjour, J utilise un fichier sur lequel j'écris.. sans probléme. Mais la ou ca se corse, c est que je ne sais pas comment accéder à un fichier qui es Solutions d'une equations du 3ème degré. [ par lesdentsduweb ] Bonjour !!Y'a-t-il un solveur sur VB pour résoudre une équation du 3ème degré.C'est à dire à partir des coefficients a,b,c,d de l'équation ax3 + bx² + équation diférentielle [ par mbourada ] je voudrai avoir un programme écrit en visual basic qui résoud une équation différentielle du premier ordre de la forme:a*dy/dt +y = b*e(t), avec e(t) problème d'insertion dans un fichier XML [ par zimounof ] Bonjour,Voila, j'ai un fichier XML avec cette structure :&lt;seances&gt; &lt;semaine num="I-1"&gt; &lt;seance/&gt; &l User Control Transparent avec degré de transparence [ par Afyn ] Bonjour, j'ai rouvé du code pour rendre une Form transparente, ainsi que ses Controls fils d'ailleurs, mais je n'ai pas réussi a faire fonctionner ce convertit une équation (fields) en inlineshape [ par rodolph ] Salut à tousJ'ai un problème avec VBA, j'ai envie de convertir des équations écrites avec "Microsoft Equation" et qui ne sont pas reconnus dans un doc


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.