+++ title = 'Εισαγωγή στο μαθηματικό πρόγραμμα Calc' date = '1998-11-01T00:00:00Z' description = '' author = 'Βαγγέλης Ρόζος' issue = ['Magaz 09'] issue_weight = 5 +++ ---------------------------------------------------------------------------------------------------------------------------------------------------------------- *Το πρόγραμμα Calc πρόκειται για ένα προγραμματιζόμενο κομπιουτεράκι σε C.* ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Είναι γραμμένο σε C και ακολουθεί την βασική νοοτροπία του Unix δηλαδή πολλά μικρά αλληλεπιδρώντα εργαλεία για την επίλυση ενός προβλήματος. Το Calc μπορεί από το να εκτελέσει απλούς αριθμητικούς υπολογισμούς μέχρι να επιλύσει πολλαπλά ολοκληρώματα. Για όσους έχουν προμηθευτεί το Linux από την Infomagic το πρόγραμμα υπάρχει στο τέταρτο CD (/apps/math/calc). Επίσης το πρόγραμμα μπορεί να βρεθεί στην διεύθυνση . **Βασικές πράξεις** Με μερικά παραδείγματα θα δώσουμε μια γενική εικόνα των δυνατοτήτων του προγράμματος. Πληκτρολογώντας : ---------------------------------------------------------------------------------------------------------------------------------------------------------------- >3*(4+1) το Calc επιστρέφει 15 Δίνοντας τώρα: >.*2 το Calc επιστρέφει 30 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Δηλαδή η τελεία σαν όρισμα ισοδυναμεί με το τελευταίο αποτέλεσμα (φυσικά 2\*1.2 θα μου δώσει 2.4). Χρήση μεταβλητών: ---------------------------------------------------------------------------------------------------------------------------------------------------------------- >old=.+19 >sqrt(old) το Calc επιστρέφει 7 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- To Calc μπορεί άνετα να χειριστεί μιγαδικούς αριθμούς: ---------------------------------------------------------------------------------------------------------------------------------------------------------------- >(2+3i)*(4-3i) το Calc επιστρέφει 17+6i ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Αν δώσω: ---------------------------------------------------------------------------------------------------------------------------------------------------------------- >1i*1i το Calc επιστρέφει -1 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- **Πίνακες** Τώρα μερικά παραδείγματα με πίνακες. Πρώτα δημιουργούμε τον 3\*3 πίνακα a με στοιχεία aij όπου i και j από 1 έως 3. ---------------------------------------------------------------------------------------------------------------------------------------------------------------- >mat a[1:3, 1:3] >a το Calc επιστρέφει [1,1] = 0 [1,2] = 0 [1,3] = 0 [2,1] = 0 [2,2] = 0 [2,3] = 0 [3,1] = 0 [3,2] = 0 [3,3] = 0 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Γέμισμα πίνακα με σταθερή τιμή: ---------------------------------------------------------------------------------------------------------------------------------------------------------------- >matfill(a,1) >a το Calc επιστρέφει [1,1] = 1 [1,2] = 1 [1,3] = 1 [2,1] = 1 [2,2] = 1 [2,3] = 1 [3,1] = 1 [3,2] = 1 [3,3] = 1 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Διαγώνιος πίνακας: ---------------------------------------------------------------------------------------------------------------------------------------------------------------- >matfill(a,0,1) >a το Calc επιστρέφει [1,1] = 1 [1,2] = 0 [1,3] = 0 [2,1] = 0 [2,2] = 1 [2,3] = 0 [3,1] = 0 [3,2] = 0 [3,3] = 1 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Δηλαδή ο μοναδιαίος πίνακας.\ Μερικές πράξεις με πίνακες τώρα. ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Ορισμός του πίνακα: >mat b[1:3, 1:3] ---------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Και εισαγωγή τιμών στον πίνακα: >b[1][1]=3.3 >b[1][2]=2 >b[1][3]=-1i >b[2][1]=5.2 >b[2][2]=2.1 >b[2][3]=-1 >b[3][1]=0.3 >b[3][2]=-9 >b[3][3]=4 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Πολλαπλασιασμός πινάκων: >a*b το Calc επιστρέφει mat [1:3,1:3] (9 elements, 9 nonzero): [1,1] = 3.3 [1,2] = 2 [1,3] = -1i [2,1] = 5.2 [2,2] = 2.1 [2,3] = -1 [3,1] = .3 [3,2] = -9 [3,3] = 4 Τον ίδιο πίνακα δηλαδή, αφού πολλαπλασιάστηκε με τον μοναδιαίο. ---------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Αναστροφή πίνακα: >mattrans(b) το Calc επιστρέφει mat [1:3,1:3] (9 elements, 9 nonzero): [1,1] = 3.3 [1,2] = 5.2 [1,3] = .3 [2,1] = 2 [2,2] = 2.1 [2,3] = -9 [3,1] = -1i [3,2] = -1 [3,3] = 4 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Αντιστροφή πίνακα: >(b^-1)*b το Calc επιστρέφει mat [1:3,1:3] (9 elements, 3 nonzero): [1,1] = 1 [1,2] = 0 [1,3] = 0 [2,1] = 0 [2,2] = 1 [2,3] = 0 [3,1] = 0 [3,2] = 0 [3,3] = 1 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- **Συναρτήσεις χρήστη** ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Μπορούμε να ορίσουμε νέες συναρτήσεις: >define f(x)=exp(1i*x) >f(3) το Calc επιστρέφει ~-.98999249660044545727+~.14112000805986722210i ---------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Ορισμός πιο σύνθετων συναρτήσεων: > define delta(x) >> { >> if (x==0) return 1; >> return 0;} > delta(0) το Calc επιστρέφει 1 > delta(1) το Calc επιστρέφει 0 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- **Προγραμματίζοντας το Calc** Το μεγαλύτερο όπλο του Calc είναι ότι προγραμματίζεται σε γλώσσα σχεδόν ίδια με την C. Γράφουμε το πρόγραμμα σε έναν editor και το σώζουμε με μορφή \*.cal Μετά μπορούμε να το φορτώσουμε μέσα από το Calc με την εντολή read \"Path/όνομα προγράμματος\" Τα προγράμματα που θα χρησιμοποιηθούν στα επόμενα παραδείγματα βρίσκονται στην διεύθυνση \ Για πρώτο παράδειγμα θα χρησιμοποιήσουμε το πρόγραμμα integr.cal που κάνει αριθμητική ολοκλήρωση με τον τύπο του Simpson. Ξεκινώντας το Calc στο ίδιο directory με το integr.cal δίνουμε: ---------------------------------------------------------------------------------------------------------------------------------------------------------------- > read integr το Calc επιστρέφει 1 20 integr(func string, var string, start, finish, tolerance) defined ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Ας υπολογίσουμε το ολοκλήρωμα `0.399*exp(-0.5*x^2)` (που αντιστοιχεί στην συνάρτηση πυκνότητας πιθανότητας κανονικής κατανομής με μέση τιμή 0 και διασπορά 1) ως προς x από -10 μέχρι 10 με ακρίβεια 0.001. ---------------------------------------------------------------------------------------------------------------------------------------------------------------- >integr('0.399*exp(-0.5*x^2)','x',-10,10,.001) το Calc επιστρέφει 1.000142 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Έστω ότι θέλουμε τώρα να σχεδιάσουμε την αθροιστική συνάρτηση κατανομής, δηλαδή να πλοτάρουμε όλες τις τιμές που δίνει το παραπάνω ολοκλήρωμα για άκρα ολοκλήρωσης από -οο (στην ουσία -10) έως x ε \[-οο, +οο\]. Εδώ θα χρησιμοποιήσουμε το πρόγραμμα plotf.cal σε συνδυασμό με το gnuplot. ---------------------------------------------------------------------------------------------------------------------------------------------------------------- >read plotf >plotf("integr('0.399*exp(-.5*x^2)','x',-5,x,.01)","x",-5,5,.5) ---------------------------------------------------------------------------------------------------------------------------------------------------------------- Μέσα από το gnuplot τώρα δίνουμε: ---------------------------------------------------------------------------------------------------------------------------------------------------------------- >plot [t=-10:10] 0.399*exp(-.5*t**2), 'plot.dat' using 1:4 with lines ---------------------------------------------------------------------------------------------------------------------------------------------------------------- **Συμπέρασμα** Πολλά αντικείμενα και ιδιότητες που έχει το Calc όπως οι λίστες, οι σχεσιακοί πίνακες, τα αντικείμενα ορισμένα από χρήστη και άλλα, δεν αναφέρονται όπως είναι φυσικό σε αυτό το κείμενο. Νομίζω ότι ο μέσος χρήστης δεν χρειάζεται παραπάνω από τρεις μέρες για να εξοικειωθεί με το πρόγραμμα και ίσως του πάρει δύο βδομάδες για να μάθει όλες του τις πτυχές. Σε αυτό βοηθάει το συνοπτικό help του. Σίγουρα το Calc δεν μπορεί να συγκριθεί με επαγγελματικά πακέτα όπως Mathematica ή Matlab αλλά είναι ιδανικό σε όσους αρέσει να προγραμματίζουν σε C και θέλουν να ασχοληθούν με αριθμητική ανάλυση.