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