Εισαγωγή στο μαθηματικό πρόγραμμα Calc
Βαγγέλης Ρόζος E.Rozos@hydro.civil.ntua.gr
Νοέμβριος 1998
Το πρόγραμμα Calc πρόκειται για ένα προγραμματιζόμενο
κομπιουτεράκι σε C.
Είναι γραμμένο σε C και ακολουθεί την βασική νοοτροπία
του Unix δηλαδή πολλά μικρά αλληλεπιδρώντα εργαλεία για
την επίλυση ενός προβλήματος. Το Calc μπορεί από το να
εκτελέσει απλούς αριθμητικούς υπολογισμούς μέχρι να
επιλύσει πολλαπλά ολοκληρώματα. Για όσους έχουν
προμηθευτεί το Linux από την Infomagic το πρόγραμμα
υπάρχει στο τέταρτο CD (/apps/math/calc). Επίσης το
πρόγραμμα μπορεί να βρεθεί στην διεύθυνση
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
Για πρώτο παράδειγμα θα χρησιμοποιήσουμε το πρόγραμμα
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 και
θέλουν να ασχοληθούν με αριθμητική ανάλυση.