💾 Archived View for magaz.hellug.gr › 09 › 05_calctut › index.gmi captured on 2024-08-31 at 12:09:57. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2024-02-05)
-=-=-=-=-=-=-
Βαγγέλης Ρόζος Νοε 1998
Το πρόγραμμα Calc πρόκειται για ένα προγραμματιζόμενο κομπιουτεράκι σε C.
Είναι γραμμένο σε C και ακολουθεί την βασική νοοτροπία του Unix δηλαδή πολλά μικρά αλληλεπιδρώντα εργαλεία για την επίλυση ενός προβλήματος. Το Calc μπορεί από το να εκτελέσει απλούς αριθμητικούς υπολογισμούς μέχρι να επιλύσει πολλαπλά ολοκληρώματα. Για όσους έχουν προμηθευτεί το Linux από την Infomagic το πρόγραμμα υπάρχει στο τέταρτο CD (/apps/math/calc). Επίσης το πρόγραμμα μπορεί να βρεθεί στην διεύθυνση http://reality.sgi.com/csp/ioccc/noll/calc-download.html[1].
1: http://reality.sgi.com/csp/ioccc/noll/calc-download.html
Βασικές πράξεις
Με μερικά παραδείγματα θα δώσουμε μια γενική εικόνα των δυνατοτήτων του προγράμματος. Πληκτρολογώντας :
>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/όνομα προγράμματος" Τα προγράμματα που θα χρησιμοποιηθούν στα επόμενα παραδείγματα βρίσκονται στην διεύθυνση http://www.hydro.civil.ntua.gr/~rozos/freesoft/calc/calc.html[2]
Για πρώτο παράδειγμα θα χρησιμοποιήσουμε το πρόγραμμα integr.cal που κάνει αριθμητική ολοκλήρωση με τον τύπο του Simpson. Ξεκινώντας το Calc στο ίδιο directory με το integr.cal δίνουμε:
2: http://www.hydro.civil.ntua.gr/~rozos/freesoft/calc/calc.html
> 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 και θέλουν να ασχοληθούν με αριθμητική ανάλυση.