Η αρχική σκέψη ήταν να γραφεί κώδικας, σε κάποια γλώσσα προγραμματισμού υψηλού επιπέδου, ο οποίος θα διερευνούσε και θα επέλυε την εξίσωση τρίτου βαθμού στη γενική της μορφή αx3x2x+δ=0, χωρίς τη χρήση εξαντλητικών μεθόδων (Bolzano, Horner κτλ), αλλά με μία μέθοδο ριζών η οποία θα προσέγγιζε τον τρόπο επίλυσης της δευτεροβάθμιας εξίσωσης.

Η ιδέα ήρθε όταν διδάσκοντας στην τάξη την σύνταξη απλών εκφράσεων και δομών ελέγχου, επελέγησαν για τις ανάγκες της διδασκαλίας κλασσικά εργαστηριακά παραδείγματα όπως η μελέτη των εξισώσεων πρώτου και δευτέρου βαθμού. Το ερώτημα που αυτόματα ετέθη ήταν : «Υπάρχουν άραγε αντίστοιχες μέθοδοι επίλυσης για εξισώσεις ανώτερου βαθμού;». Η εκκίνηση έγινε με την τριτοβάθμια, αν και επιφυλασσόμεθα και για την τετάρτου βαθμού. Την απάντηση στο παραπάνω ερώτημα βέβαια είχε δώσει αρκετούς αιώνες πριν ο Gerolamo Cardanο, το μόνο που έμενε ήταν να την «ξεθάψουμε», μιας και οι μαθηματικοί δεν την χρησιμοποιούν σχεδόν ποτέ για την επίλυση πολυωνύμων τέτοιου τύπου και να την «εφαρμόσουμε» σε ένα πρόγραμμα ηλεκτρονικού υπολογιστή προς έλεγχο των παραγόμενων ριζών.

Η γλώσσα προγραμματισμού που επελέγη τελικά ήταν η Visual Basic, λόγω της γενικότητας της χρήσης της, αν και αυτό είναι κάτι που δεν έχει ιδιαίτερη σημασία. Το πιο σημαντικό  από όλα είναι η μαθηματική μεθοδολογία που ακολουθήθηκε ώστε να γραφεί κώδικας που παράγει σωστά αποτελέσματα. Πρέπει βεβαίως να σημειωθεί, ότι οι ρίζες που παράγονται από το πρόγραμμα σε αρκετές περιπτώσεις είναι προσεγγιστικές. Αυτό συμβαίνει διότι ρίζες του τύπου ln(5), συν(13), π κτλ, επιστρέφονται ως άρρητοι αριθμοί 1.609437, 0.90746, 3.1415 αντίστοιχα. Επίσης κλασματικές ρίζες του τύπου ,  κτλ, επιστρέφονται ως πραγματικοί αριθμοί 0.3333333, 0.13846 κτλ.    

Η επίλυση εξισώσεων τρίτου βαθμού απαιτεί μια αρκετά σύνθετη και περίπλοκη μέθοδο η οποία παρουσιάζεται παρακάτω :

 

 

Βήμα 1ο : Ορίζουμε ως a,b,c,d τους σταθερούς όρους της εξίσωσης ax3+bx2+cx+d=0.

 

Βήμα 2ο : Ορίζουμε μια μεταβλητή f =

 

Βήμα 3ο : Ορίζουμε τη μεταβλητή g =

 

 

Βήμα 4ο : Τέλος ορίζουμε τη μεταβλητή h =

 

 

Περίπτωση 1. Αν h > 0, τότε υπάρχει μια πραγματική ρίζα και δύο μιγαδικές.

 

 

Βήμα 5ο : Ορίζουμε τη μεταβλητή R =

 

            Βήμα 6ο : Ορίζουμε τη μεταβλητή S =

 

            Βήμα 7ο : Ορίζουμε τη μεταβλητή T =

 

            Βήμα 8ο : Ορίζουμε τη μεταβλητή U =

 

            Έτσι οι ρίζες προκύπτουν ως εξής : x1 = (S+U)- (Πραγματική Ρίζα)

 

                                                                     x2 =  (Πρώτη Μιγαδική Ρίζα)

 

                                                                     x3 = (Δεύτερη Μιγαδική Ρίζα)

 

 

Περίπτωση 2. Αν h <= 0, τότε υπάρχουν τρεις πραγματικές ρίζες.

 

            Βήμα 5ο : Ορίζουμε τη μεταβλητή  i =

 

            Βήμα 6ο : Ορίζουμε τη μεταβλητή  j =

 

            Βήμα 7ο : Ορίζουμε τη μεταβλητή  k = τοξσυν()

 

            Βήμα 8ο : Ορίζουμε τη μεταβλητή L = -j

 

            Βήμα 9ο : Ορίζουμε τη μεταβλητή  M = συν

 

            Βήμα 10ο : Ορίζουμε τη μεταβλητή Ν = ημ

 

            Βήμα 11ο : Ορίζουμε τη μεταβλητή P =

 

            Έτσι οι ρίζες προκύπτουν ως εξής : x1 =

 

                                                                      x2 =

 

                                                                      x3 =

 

 

Περίπτωση 3.  Αν f = g = h = 0 (ειδική περίπτωση), τότε υπάρχουν τρεις πραγματικές ρίζες ίσες μεταξύ τους.

 

            Στην περίπτωση αυτή οι ρίζες προκύπτουν ως εξής :  x1 = x2 = x3 =

           

            Η γλώσσα προγραμματισμού η οποία επελέγη για την υλοποίηση της εφαρμογής είναι (όπως ήδη έχει αναφερθεί) η Visual Basic 6. Υπήρξαν δύο βασικά προβλήματα κατά τη διάρκεια της κωδικοποίησης.

§         Το πρώτο ήταν ότι η Visual Basic 6, δεν διαθέτει ενσωματωμένη συνάρτηση βιβλιοθήκης, η οποία να επιστρέφει το τόξο συνημιτόνου (arc cosine). Σημειώνεται ότι στις νεότερες εκδόσεις της γλώσσας (.ΝΕΤ), το παραπάνω πρόβλημα έχει λυθεί, με την ενσωμάτωση της συνάρτησης acos() στη βιβλιοθήκη της γλώσσας. Το τόξο συνημιτόνου αποτελεί μη εγγενή μαθηματική συνάρτηση η οποία μπορεί όμως να παραχθεί από τις υπάρχουσες εγγενείς.

Έτσι έχουμε : τοξσυν(x) =   ,  Το τόξο εφαπτομένης δίνεται από τη συνάρτηση βιβλιοθήκης της VB, atan(), οπότε μπορεί να γραφεί κώδικας ο οποίος θα υπολογίζει το τόξο συνημιτόνου.

§         Το δεύτερο ήταν ότι η VB, αφενός δεν έχει ενσωματωμένη συνάρτηση βιβλιοθήκης για τον υπολογισμό της τρίτης ρίζας, αφετέρου η ύψωση σε περιττή κλασματική δύναμη δεν λειτουργεί για κάποιο (άγνωστο) λόγο με αρνητικούς αριθμούς (αρνητικές υπόριζες ποσότητες).   Γι αυτό το λόγο υπολογίστηκαν οι τρίτες ρίζες στην απόλυτη τιμή των ποσοτήτων και στη συνέχεια προστέθηκε το αρνητικό πρόσημο.

 

Παρακάτω φαίνεται η φόρμα της Visual Basic, καθώς και ο κώδικας που γράφτηκε για την επίλυση του προβλήματος.

           

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Κώδικας Visual Basic 6

 

Private Sub Command1_Click()

   

    a = Val(ta)

    b = Val(tb)

    c = Val(tc)

    d = Val(td)

   

    f = ((3 * c / a) - ((b * b) / (a * a))) / 3

    g = ((2 * (b ^ 3) / (a ^ 3)) - ((9 * b * c) / (a ^ 2)) + (27 * d / a)) / 27

    h = ((g ^ 2) / 4) + ((f ^ 3) / 27)

   

    If f = 0 And g = 0 And h = 0 Then

        X1 = ((d / a) ^ (1 / 3)) * (-1)

        X2 = X1

        X3 = X1

    Else

        If h <= 0 Then

            i = (((g ^ 2) / 4) - h) ^ (1 / 2)

            j = i ^ (1 / 3)

       

            p1 = (-(g / (2 * i)))

            k = Atn(-p1 / Sqr((-p1) * p1 + 1)) + 2 * Atn(1)

            l = j * (-1)

            m = Cos(k / 3)

            n = Sqr(3) * Sin(k / 3)

            p = (b / (3 * a)) * (-1)

            X1 = (2 * j * Cos(k / 3)) - (b / (3 * a))

            X2 = l * (m + n) + p

            X3 = l * (m - n) + p

        Else

            r = (-(g / 2)) + (h ^ (1 / 2))

            If r < 0 Then

                s = -(Abs(r) ^ (1 / 3))

            Else

                s = r ^ (1 / 3)

            End If

            t = (-(g / 2)) - (h ^ (1 / 2))

            If t < 0 Then

                u = -(Abs(t) ^ (1 / 3))

            Else

                u = t ^ (1 / 3)

            End If

            X1 = (s + u) - (b / (3 * a))

            x = -(s + u) / 2 - (b / (3 * a))

            y = ((s - u) * Sqr(3)) / 2

            X2 = Str(x) + "+ i X " + Str(y)

            X3 = Str(x) + "- i X " + Str(y)

        End If

    End If

          

    tx1 = X1

    tx2 = X2

    tx3 = X3

   

End Sub