270 γραμμές
14 KiB
Markdown
270 γραμμές
14 KiB
Markdown
+++
|
||
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). Επίσης το πρόγραμμα μπορεί να βρεθεί στην διεύθυνση <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 και θέλουν να ασχοληθούν με αριθμητική ανάλυση.
|