Magaz, The Greek Linux Magazine
Magaz Logo

Εισαγωγή στο μαθηματικό πρόγραμμα 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 και θέλουν να ασχοληθούν με αριθμητική ανάλυση.


Valid HTML 4.01!   Valid CSS!