Σχολή Εφαρμοσμένων Μαθηματικών και Φυσικών Επιστημών Εθνικό Μετσόβιο Πολυτεχνείο Προγραμματισμός με Εφαρμογές στην Επιστήμη του Μηχανικού Ενότητα 1 Διάλεξη 4 Σιέττος Κωνσταντίνος
Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειτα σε άδειες χρήσης Crea%ve Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άδεια χρήσης άλλου τύπου, αυτή πρέπει να αναγράφεται ρητώς.
Εισαγωγή στη γλώσσα προγραµµατισµού Fortran 77 (µέρος ) Κωνσταντίνος Σιέττος
, j< Εντολές Εισόδου-Εξόδου/ Εξόδου/ Προσπέλαση αρχείων Γενικά τα αρχεία διακρίνονται σε δύο κατηγορίες: 1. Τα σειριακά αρχεία Η επεξεργασία των γραµµών των αρχείων γίνεται µε την σειρά (εγγραφή + ανάγνωση). Τα αρχεία άµεσης προσπέλασης Ορίζεται ο αριθµός των γραµµών (records) που θα διαβαστούν ή θα εγγραφούν Χρειάζεται η δήλωση του αρχείου ως άµεσης προσπέλασης (εντολή ACCESS)
, j< Εντολές Εισόδου-Εξόδου/ Εξόδου/ Προσπέλαση αρχείων Άνοιγµα αρχείων σειριακής προσπέλασης Προετοιµασία για άνοιγµα αρχείου για διάβασµα: open(unit = INTEGER, FILE = onomaarxeiou onomaarxeiou, status = 'OLD') Προετοιµασία για άνοιγµα αρχείου για γράψιµο: open(unit = INTEGER, FILE = onomaarxeiou, status = new') ή και για τα δύο open(unit = INTEGER, FILE = FILENAME, status = unknown )
, j< Εντολές Εισόδου-Εξόδου/ Εξόδου/ Προσπέλαση αρχείων Κλείσιµο αρχείων open(unit = INTEGER, FILE = FILENAME, status = unknown ) close (unit) Καλό είναι µετά την προσπέλαση του αρχείου να κλείνετε το αρχείο µε την εντολή close Rewind αρχείων: µεταφορά της ανάγνωσης στην «αρχή» του αρχείου. Rewind (unit)
, j< Οι εντολές read και write/ format READ(UNIT, f) metavlites WRITE(UNIT, f) metavlites f είναι ο ακέραιος αριθµός της εντολής FORMAT η οποία περιγράφει τις προδιαγραφές, δηλαδή πως έχει γραφεί (και συνεπώς πως θα πρέπει να διαβαστεί) το record (metavlites): FORMAT (προδιαγραφές)
, j< Οι εντολές read και write/ format Παράδειγµα: Να διαβαστούν τα στοιχεία από ένα αρχείο που έχει ανοιχθεί προηγουµένως ως unit=1 που περιέχει τα στοιχεία ενός πίνακα Α 5x5. open(unit = 1, file= pinakas, status = unknown ) do i=1,5 read(1,*) (A(i,j), j=1,5) 5 continue..
, j< Κωδικοί Προδιαγραφών για την εντολή Ο κωδικός προδιαγραφής Ιw FORMAT -Χρησιµοποιείται για την ανάγνωση και εγγραφή ακεραίων µε µήκος πεδίου w - Επιτρεπτές µορφές δεδοµένων εισόδου (sm sm), s είναι ενδεχόµενο πρόσηµο, m είναι ακολουθία ψηφίων -Κενά που βρίσκονται αριστερά του πρώτου ψηφίου διαβάζονται ως κενά ενώ όλα τα άλλα διαβάζονται ως µηδενικά Παράδειγµα Έστω η γραµµή δεδοµένων 13456-789 Read(1,1) K,L,M 1 Format(I,I4,I4) Οι µεταβλητές K,L,M παίρνουν τις τιµές Κ=1, L=3456, M=-789
, j< Κωδικοί Προδιαγραφών για την εντολή Ο κωδικός προδιαγραφής Fw.d FORMAT -Χρησιµοποιείται για την ανάγνωση και εγγραφή πραγµατικών αριθµών µε µήκος πεδίου w (w>=d+). To w συµπεριλαµβάνει και την υποδιαστολή -d είναι ένας ακέραιος που δηλώνει το µήκος πεδίου του δεκαδικού µέρους - Επιτρεπτές µορφές δεδοµένων εισόδου (sm, sm.n), S είναι ενδεχόµενο πρόσηµο, m,n είναι ακολουθία ψηφίων -Κενά που βρίσκονται αριστερά του πρώτου ψηφίου διαβάζονται ως κενά ενώ όλα τα άλλα διαβάζονται ως µηδενικά -Αν στον αριθµό που διαβάζεται δεν υπάρχει κλασµατικό σηµείο τότε χωρίζονται τόσα ψηφία όσα δηλώνονται µε το d -Αν το ακέραιο µέρος είναι µεγαλύτερο από w-d-1 τότε κατά την εγγραφή εµφανίζονται αστεράκια αντί του αριθµού Παράδειγµα Έστω η γραµµή δεδοµένων -345.5678975 Read(1,1) Α,Β 1 Format(F7.,F5.) Οι µεταβλητές A,B,C παίρνουν τις τιµές A=-345.56, B=789.75,
, j< Κωδικοί Προδιαγραφών για την εντολή Ο κωδικός προδιαγραφής Ew.d FORMAT -Χρησιµοποιείται για την ανάγνωση και εγγραφή πραγµατικών αριθµών γραµµένους µε εκθετικό τρόπο µε την µορφή S.mE+/ +/-xx µε µήκος πεδίου w. -Στην ανάγνωση ακολουθούνται οι κανόνες όπως µε το Fw.d -Στην εγγραφή Το S είναι το πρόσηµο του αριθµού m είναι ακολουθία ψηφίων το οποίο γίνεται ίσο µε d είτε µε στρογγύλεµα είτε µε προσθήκη µηδενικών xx είναι ακέραια σταθερά Παράδειγµα Έστω η γραµµή δεδοµένων 4567Ε Read(1,1) Α 1 Format(Ε6.3 Ε6.3) Η µεταβλητή A διαβάζεται A=456.7
, j< Κωδικοί Προδιαγραφών για την εντολή Ο κωδικός προδιαγραφής nx FORMAT -Χρησιµοποιείται για την παράλειψη n χαρακτήρων κατά την ανάγνωση ή την εγγραφή n κενών κατά την εγγραφή -Στην εγγραφή Παράδειγµα Έστω η γραµµή δεδοµένων Bac134567891.56 read(1,1) K,L,A write(*,1) K,L,A 1 Format(3x,I4,I3,f7.) Η µεταβλητή K διαβάζεται K=134 Η µεταβλητή L διαβάζεται L=567 Η µεταβλητή A διαβάζεται L=891.56 Αν όµως τα k,l ήταν Real µεταβλητές τότε Η µεταβλητή K θα διαβαζόταν K= Η µεταβλητή Lως L= και η µεταβλητή A διαβάζεται L=891.56
, j< To ξέρατε ότι.. Scientists from theswiss Federal Institute of Technology have taken a database listing 37 million companies and investors worldwide and analyzed The WHO OWNS WHAT Only 737 top holders accumulate 8% of the control
, j< Υποπρογράµµατα ή Επίλυση των επιµέρους προβληµάτων χωριστά Ένα τυπικό πρόγραµµα FORTRAN αποτελείται από το κύριο πρόγραµµα και από περισσότερα υποπρογράµµατα ύο κύριες κατηγορίες (α) Functions (b) subroutines
, j< Functions Το πιο απλό είδος υποπρογράµµατος Χρησιµοποιείται όταν χρειάζεται να εκτελεσθεί πολλές φορές κάποιο block εντολών µέσα στο κύριο πρόγραµµα ηλώνεται στην αρχή του προγράµµατος µετά τις δηλώσεις των µεταβλητών (Integer, Real, Double Precision κ.τ.λ.) Καλείται σε οποιοδήποτε σηµείο του κύριου προγράµµατος
, j< Functions Γενική µορφή δήλωσης µιας function όπου type function name(arguments) type: Integer, real, double precision, logical name: το όνοµα της συνάρτησης arguments: µεταβλητές εισόδου που χωρίζονται µε κόµµα. ηλώνονται µέσα στην function και θα πρέπει να είναι του ίδιου τύπου και διαστάσεων µε τις µεταβλητές που ορίζονται στο κύριο πρόγραµµα. Μπορεί να είναι και arrays, functions ή subroutines
, j< οµή Functions real function paradeigma(a,b,c) integer a,b,c real... Εντολές.. paradeigma = EXPRESSION. RETURN END Program main integer p,t,w real b double precision real paradeigma... Εντολές b= paradeigma(p,t,w).. END
, j< Κανόνες για την χρήση των Functions Ο τύπος και το πλήθος των µεταβλητών (arguments) που χρησιµοποιούνται στο κύριο πρόγραµµα και στην function θα πρέπει να είναι ο ίδιος. Τα ονόµατα των µεταβλητών δεν χρειάζεται να είναι τα ίδια. Ο τύπος της συνάρτησης θα πρέπει να είναι ο ίδιος τόσο στην δήλωση της στο κύριο πρόγραµµα όσο και στην περιγραφή της συνάρτησης. Το αποτέλεσµα της συνάρτησης θα πρέπει να ανατίθεται στο όνοµα της συνάρτησης. Κάθε συνάρτηση θα πρέπει να έχει τουλάχιστον ένα return. Η συνάρτηση (function) µπορεί να τοποθετηθεί είτε πριν είτε µετά από το κύριο πρόγραµµα. Μια συνάρτηση δεν μπορεί να καλέσει τον εαυτό της.
, j< Παράδειγµα για την χρήση των Functions Να γραφεί ένα πρόγραµµα µε την χρήση µιας function για τον υπολογισµό της σειράς για τους πρώτους Ν όρους: : 1- x^/! + x^4/ ^4/4! - real function cosfun(x,n) program main real x,term,, F real x,b integer N,i,k integer N integer fact real cosfun F=1. write(*,*) give x,n i= read(*,*) x,n k= integer function fact(m) b= cosfun(x,n) do while (i.lt.*n) integer m write(*,*) b term=*i/ fact(i) fact=1 end k=k+1 do 1 i=1,m F=F+(-1)**k*term fact=fact*i i=i+ 1 continue enddo return cosfun=f end end
, j< Subroutines-Υπορουτίνες Η υπορουτίνα είναι το πιο σύνηθες είδος υποπρογράµµατος και το πιο γενικό γιατί επιτρέπει τον υπολογισµό πολλών τιµών ταυτόχρονα (αριθµητικές, λογικές, χαρακτήρων) σε αντίθεση µε το υποπρόγραµµα-functi functiοn που δίνει στο κύριο πρόγραµµα µια µόνο µεταβλητή: αυτή του ονόµατος της. Έχει την ακόλουθη επικεφαλίδα : SUBROUTINE name (argmunets) όπου Name είναι το όνοµα της υπορουτίνας Τα ορίσµατα (arguments) είναι µεταβλητές εισόδου-εξόδουεξόδου
, j< Κάλεσµα υπορουτίνων και κανόνες Μια υπορουτίνα καλείται σε ένα σηµείο του κύριου προγράµµατος µε την εντολή CALL CALL name (arguments) Τα arguments θα πρέπει να είναι του ίδιου τύπου και διαστάσεων µε τις µεταβλητές που ορίζονται στο κύριο πρόγραµµα. Στο τέλος της υπορουτίνας θα πρέπει να έχει ένα return για να εξασφαλίζεται η µεταφορά του ελέγχου του προγράµµατος στο πρόγραµµα που την καλεί (κύριο πρόγραµµα ή άλλη υπορουτίνα) Στα ορίσµατα (arguments) πρέπει να εµπεριέχονται και οι µεταβλητές που θα µεταφερθούν στο πρόγραµµα που την καλεί. Αυτά µπορεί να είναι ίδια µε τα ορίσµατα εισόδου δηλαδή τις µεταβλητές που µεταβιβάζονται στην υπορουτίνα στην αρχή των υπολογισµών.
, j< Subroutines-Παράδειγµα Να γραφεί ένα κύριο πρόγραµµα που θα καλεί ένα υποπρόγραµµα το οποίο θα βρίσκει το αλγεβρικά µεγαλύτερο στοιχείο ενός µονοδιάστατου ανύσµατος µε πραγµατικά στοιχεία. program main parameter(n=1) real a(n) open(unit=1,file= vector.txt,status= unknown ) do 1 i=1,n read(1,*) a(i) 1 Continue amax=. call findmax(a,amax,n a,amax,n) write(*,*) amax end subroutine findmax(a,amax,n a,amax,n) real a(n) amax=a(1) do 1 i=1,n if(a(i).gt.amax) amax=a(i) 1 continue return end
, j< Subroutines-Παράδειγµα - Μέθοδος Newton-Raphson Να γραφεί ένα κύριο πρόγραµµα που θα καλεί ένα υποπρόγραµµα το οποίο θα βρίσκει τη λύση ενός συστήµατος µη-γραµµικών αλγεβρικών εξισώσεων µε τη µέθοδο Newton-Raphson Η αριθµητική µέθοδος Newton-Raphson Η µέθοδος Newton-Raphson είναι η πλέον διαδεδοµένη µέθοδος για την επίλυση συστηµάτων αλγεβρικών εξισώσεων της µορφής ( x) = F, F : n n R R
F n R : F = F x C ( x) F x ( ) Subroutines-Παράδειγµα- Μέθοδος Newton-Raphson ( ) F ( xc ) + F ( xc )( x xc Υποθέτοντας ότι η ) F είναι επαρκώς παραγωγίσιμη σε ένα διάστημα στο εμπεριέχει την λύση : F( ) = τότε η F( x) γύρω από ένα σημείο x C «κοντά» στο ως n R το οποίο μπορεί να αναπτυχθεί σε σειρά Taylor F ( x) F( x ) + F( x )( x x ) C c C Αν στην προηγούµενη σχέση αντικαταστήσουµε την ( ) = ( x ) F( x )[ F( x )] 1 C C c F τότε προκύπτει η σχέση
F n R : F = F x C ( x) F x ( ) Subroutines-Παράδειγµα - Μέθοδος Newton-Raphson ( ) F ( xc ) + F ( xc )( x xc Βάση της παραπάνω ) σχέσης η επαναληπτική διαδικασία Newton-Raphson δίνεται από την εξής αναδροµική σχέση x = x F ( n ) ( n ) ( x )[ F( x )] 1 ( n +1 ) ( n ) Βασική προϋπόθεση για την εφαρµογή της παραπάνω σχέσης είναι η συνθήκη ότι ο ( n ) Ιακωβιανός πίνακας δεν πρέπει να είναι ιδιάζων, δηλαδή det( F( x ). Η αναδροµική σχέση (1) επαναλαµβάνεται έως ότου x x ( n+ 1 ) ( n ) < tol. Αποδεικνύεται ότι αν η αρχική εκτίµηση ( ) x είναι επαρκώς κοντά στην λύση τότε η μέθοδος συγκλίνει τετραγωνικά στο.
F n R : F = F x C ( x) F x ( ) ( ) F ( xc ) + F ( xc )( x x k = C ) Subroutines-Παράδειγµα- Μέθοδος Newton-Raphson Set ( x k ) as initial guess Set tol as tolerance of convergence Do while error < tol ( k ) ( k ) ( k ) Solve the system F( x ) δ x = F( x ) Update the solution as x ( k+1 ) = x ( k ) +δ x ( k ) error = ( δ x k ) k=k+1 End do
F n R : F = F x C ( x) F x ( ) ( ) F ( x ) + F ( x )( x x ) Subroutines-Παράδειγµα - Μέθοδος Newton-Raphson Να γραφεί C ένα c κύριο C πρόγραµµα που θα καλεί ένα υποπρόγραµµα το οποίο θα βρίσκει τη λύση της εξίσωσης x^1.7658-3.589x +1.15 = program main c initial guess x=1. c tolerance tol=1.e-6 call newtonr(x,tol) write(*,*) x end subroutine newtonr(x,tol) error1=1. Do while(error1.gt.tol) call funeval (x,dx) error1=sqrt(d*) subroutine funeval(x,dx) x=x+dx fx=x**1.7658-3.589*x+1.15 enddo rjac=1.7658*x**.7658-3.589 return dx=-fx/ fx/rjac end return end
F n R : F = F x C ( ) Subroutines-Παράδειγµα - ( Μέθοδος ) Newton-Raphson σε ιαστάσεις x Να γραφεί ένα κύριο πρόγραµµα που θα καλεί ένα υποπρόγραµµα το οποίο θα F x ( ) F ( x ) + F ( x )( x x ) C c C βρίσκει τη λύση των εξισώσεων program main implicit real*8(a-h,o-z) parameter(n=) dimension x(n),dx(n) c initial guess x(1)=1. x()=.75 c tolerance tol=1.e-6 call newtonr(x,tol,n) write(*,*) x(1),x() end x1^1.7658-3.589x1*x +1.15 = x^1.3456-4.56*x1*x+.544.56*x1*x+.54 subroutine newtonr(x,tol,n) implicit real*8(a-h,o h,o-z) dimension x(n),dx(n) error1=1. Do while(error1.gt.tol) call funeval (x,dx,n) error1=sqrt(dx(1)**+dx()**) write(*,*) error1,x(1),x() pause x(1)=x(1)+dx(1) x()=x()+dx() enddo return end
F n R : F = F x C ( ) Subroutines-Παράδειγµα - ( Μέθοδος ) Newton-Raphson σε ιαστάσεις x Να γραφεί ένα κύριο πρόγραµµα που θα καλεί ένα υποπρόγραµµα το οποίο θα βρίσκει τη ( ) λύση F ( xc ) + των F ( xεξισώσεων c )( x xc ) x1^1.7658-3.589x1*x +1.15 = F x subroutine funeval(x,dx,n) implicit real*8(a-h,o-z) dimension dx(n),x(n),fx(n) dimension rjac(n,n n,n) c fx(1)=x(1)**1.7658-3.589* $x(1)*x()+1.15 fx()=x()**1.3456-4.56*x(1) 4.56*x(1) $*x()+.54 c rjac(1,1)=1.7658*x(1)**.7658 $-3.589*x() rjac(1,)= (1,)=-3.589*x(1) rjac(,1)= (,1)=-4.56*x() rjac(,)=1.3456*x()**.3456 $-4.56*x(1) call gelim(n,rjac, (n,rjac,-fx,dx) return end x^1.3456-4.56*x1*x+.544.56*x1*x+.54 subroutine gelim(n,sk,r1,u) implicit real*8(a-h,o-z) dimension sk(n,n),u(n),r1(n) do 1 i=1,n do j=1,n continue 1 continue do 3 r=1,n-1 do 4 i=r,n-1 p=sk(i+1,r)/sk(r,r) do 5 j=r+1,n sk(i+1,j)=sk(i+1,j)-p*sk(r,j) 5 continue r1(i+1)=r1(i+1)-p*r1(r) 4 continue 3 continue do 6 m=n,1,-1 if(m.eq.n) goto 1 do 7 l=n,m+1,-1 r1(m)=r1(m)-sk(m,l)*u(l) 7 continue 1 u(m)=r1(m)/sk(m,m) 6 continue return end
F n R : F = F x C ( x) F x ( ) οµή προγραµµάτων-ανακεφαλαίωση ( ) F ( x ) + F ( x )( x x ) C c C Μεγάλα προβλήµατα θα πρέπει να χωρίζονται σε µικρότερα υποπροβλήµατα Κάθε υπο-πρόβληµα πρόβληµα θα πρέπει να λύνεται χωριστά και µε τη σειρά που απαιτείται για την λύση του αρχικού σύνθετου Για κάθε υπο-πρόβληµα πρόβληµα γράφεται η αντίστοιχη υπο-ρουτίνα (subroutine) για την υπολογιστική επίλυση του Ένα τυπικό πρόγραµµα FORTRAN αποτελείται από Ένα κύριο (main) πρόγραµµα Από κανένα, ένα ή περισσότερα υπο-προγράµµατα α (subroutines)
F n R : F = F x C ( x) F x ( ) οµή προγραµµάτων-ανακεφαλαίωση ( ) F ( x ) + F ( x )( x x ) C c C Οι υπο-ρουτίνες µπορούν να εµφανίζονται πριν ή συνήθως µετά το main πρόγραµµα Η εκτέλεση του προγράµµατος αρχίζει από το main πρόγραµµα Μια υπορουτίνα ή συνάρτηση µπορεί να καλείται τόσο από το main πρόγραµµα όσο και από οποιαδήποτε άλλη υπορουτίνα.. Αυτό- καλέσµατα δεν είναι δυνατά. Tο main πρόγραµµα ή η υπορουτίνα περνάει πληροφορία στην καλούµενη υπορουτίνα ή συνάρτηση βάσει των ορισµάτων (arguments) Μετά το κάλεσµα της υπορουτίνας και την εκτέλεση των εντολών που περιέχονται σε αυτή, επιστρέφει τα αποτελέσµατα των υπολογισµών στο πρόγραµµα που την καλεί(main ή subroutine)
Ο µεταγλωτιστής της Fortran 77 Απλές κλήσεις του Μεταγλωτιστή Κλήση % f77 file.f Παραγόµενο αρχείο a.out Είδος Αρχείου εκτελέσιµο % f77 file1.f file.f -c µεταγλωτισµός file1.o file.o συνδέσιµο % f77 ο ο όνοµα-exe file1.o file.o όνοµα-exe εκτελέσιµο % f77 file.f o όνοµα-exe % f77 file.f -g % dbx όνοµα-exe για χρήση του dbx εκτελέσιµο Για ανεύρεση λαθών
F n R : F = F ( x) ( ) Enjoy the ride! x C
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικόυ έργου του διδάσκοντα Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα Ε.Μ.Π.» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικού πόρους.