Εισαγωγή στο μαθηματικό πρόγραμμα Calc
Description: This is issue 09 of Magaz, the Hellenic LinuxMagazine
Keywords: magaz hellenic greek hellas greece hellug linux magazine

Magaz, The Greek Linux Magazine
Τεύχος #09
Περιληπτικά Περιεχόμενα Αναλυτικά Περιεχόμενα Mirrors Links Πληροφορίες Συντάκτες Αναζήτηση Επικοινωνία
# Εισαγωγή στο μαθηματικό πρόγραμμα 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 και θέλουν να ασχοληθούν με αριθμητική ανάλυση.