Πρώτο commit
Αυτό το commit περιλαμβάνεται σε:
commit
8ec8e9bee2
451 αρχεία άλλαξαν με 46736 προσθήκες και 0 διαγραφές
270
content/articles/09/05_calctut.md
Κανονικό αρχείο
270
content/articles/09/05_calctut.md
Κανονικό αρχείο
|
@ -0,0 +1,270 @@
|
|||
+++
|
||||
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 και θέλουν να ασχοληθούν με αριθμητική ανάλυση.
|
Φόρτωση…
Προσθήκη πίνακα
Προσθήκη υπερσυνδέσμου
Παράθεση σε νέο ζήτημα