======Καλωσορίσατε στην GNU/Octave!====== Το wiki αυτό είναι μια εισαγωγή στην γλώσσα υψηλού επιπέδου GNU/Octave, μια ελεύθερη γλώσσα προγραμματισμού εναλλακτική της Matlab. Για πιο σοβαρή ενασχόληση με την γλώσσα είναι καλύτερο κάποιος να διαβάσει το [[http://www.gnu.org/software/octave/doc/interpreter/index.html | εγχειρίδιο αναφοράς της GNU/Octave]] ======Ιστορία====== Στο δεύτερο μισό της δεκαετίας του 1970 αναπτύχθηκαν σε ForTran βιβλιοθήκες ρουτινών για την επίλυση προβλημάτων αριθμητικής ανάλυσης. Οι βιβλιοθήκες αυτές [[ http://netlib.org/linpack/ | LINPACK]] και [[http://netlib.org/eispack/ | EISPACK]] περιέχονται σήμερα στην συλλογή [[http://netlib.org/ | netlib.org]] ενώ, τώρα πια, έχουν αντικατασταθεί από άλλες. Ένας από τους συντάκτες αυτών των βιβλιοθηκών ο Cleve Moler καθώς και οι Little and Steve Bangert, οι οποίοι μετέγραψαν τις παραπάνω βιβλιοθήκες σε C ίδρυσαν την εταιρία Mathworks το 1984 και ξεκίνησαν την ανάπτυξη και εκμετάλλευση της [[http://www.mathworks.com/products/matlab/ | Matlab]]. H Octave πρωτοαναπτύχθηκε το 1988 στο πλαίσιο προπτυχιακού μαθήματος στο Παν. του Τέξας. Η κανονική της ανάπτυξη ξεκίνησε το 1992 ενώ το 1994 είχαμε την πρώτη έκδοση 1.0. Έκτοτε αναπτύσσεται αδιάλειπτα ως [[http://www.fsf.org/about/what-is-free-software | ελεύθερο λογισμικό]] με την άδεια [[http://www.gnu.org/copyleft/gpl.html | GNU General Public License]]. Σήμερα είναι πλήρως συμβατή με την matlab ενώ εμπλουτίζεται διαρκώς με πληθώρα ελεύθερων πρόσθετων βιβλιοθηκών. ======Ξεκινάμε; Εγκατάσταση==== Για να χρησιμοποιήσει κάποιος την γλώσσα GNU/Octave θα πρέπει πρώτα να την εγκαταστήσει στον υπολογιστή του. [[https://foss.ntua.gr/wiki/index.php/Octave:_%CE%BC%CE%B9%CE%B1_%CE%B5%CE%BB%CE%B5%CF%8D%CE%B8%CE%B5%CF%81%CE%B7_%CE%B5%CE%BD%CE%B1%CE%BB%CE%BB%CE%B1%CE%BA%CF%84%CE%B9%CE%BA%CE%AE_%CF%84%CE%BF%CF%85_Matlab | Εδώ]] υπάρχει ένα wiki για την εγκατάσταση της octave και τις πρώτες πληροφορίες για κάθε σύστημα. Εμείς εδώ θα ξεκινήσουμε με την χρήση και τον προγραμματισμό σε octave. Εκτελείται με την εντολή octave και αφού μας ενημερώσει για την έκδοση και την άδεια χρήσης περιμένει τις εντολές μας: [chiossif@anacoda ~]$ octave GNU Octave, version 3.8.0 Copyright (C) 2013 John W. Eaton and others. This is free software; see the source code for copying conditions. There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, type 'warranty'. Octave was configured for "x86_64-unknown-linux-gnu". Additional information about Octave is available at http://www.octave.org. Please contribute if you find this software useful. For more information, visit http://www.octave.org/get-involved.html Read http://www.octave.org/bugs.html to learn how to submit bug reports. For information about changes from previous versions, type 'news'. octave:1> ======Χρήση της octave ως αριθμομηχανής====== Γράψτε: octave:1> 2+3 ans = 5 Η απάντηση είναι 5. Σωστά; :-) Οι πράξεις που υποστηρίζονται είναι + για την πρόσθεση, - για την αφαίρεση, * για τον πολλαπλασιασμό, / για την διαίρεση και ^ για την ύψωση σε δύναμη. Μπορείτε να βάζετε παρενθέσεις και φυσικά ισχύει η προτεραιότητα των πράξεων όπως την ξέρουμε :-) Αντέχει... μην την φοβάστε. Όλα τα υπολογίζει: octave:2> 32411 * 32413 ans = 1.0505e+09 octave:3> format long octave:4> 32411 * 32413 ans = 1050537743 octave:5> format short octave:6> 32411 * 32413 ans = 1.0505e+09 Όπως βλέπετε με την εντολή format ρυθμίζουμε το πλήθος των σημαντικών ψηφίων τα οποία θα εμφανίζονται ως απάντηση. Η επιλογή long καλύπτει κάθε ανάγκη και δεν επιδέχεται βελτίωση. ======Περιβάλλον χρήσης====== Μέχρι εδώ έχουμε δει να δίνει απλές απαντήσεις. Τι γίνεται όμως αν θέλουμε πιο σύνθετες πράξεις/συναρτήσεις; Υποστηρίζονται όλες οι [[http://octave.sourceforge.net/functions_by_alpha.php|συναρτήσεις]]: από τις πιο απλές όπως sin cos log ln έως και εξαιρετικά σύνθετες: cos Συνημίτονο sin Ημίτονο tan Εφαπτομένη exp Εκθετική e^x log Λογάριθμος log10 Λογάριθμος με βάση 10 sinh Υπερβολικό ημίτονο cosh Υπερβολικό συνημίτονο tanh Υπερβολική εφαπτομένη acos τόξο συνημιτόνου acosh τόξο υπερβολικού συνημιτόνου asin τόξο ημιτόνου asinh τόξο υπερβολικού ημιτόνου atan τόξο εφαπτομένης atan2 τόξο εφαπτομένης με δύο ορίσματα x/y atanh τόξο υπερβολικής εφαπτομένης abs απόλυτη τιμή sign πρόσημο round στρογγυλοποίηση στον πλησιέστερο ακέραιο floor στρογγυλοποίηση προς τα κάτω ceil στρογγυλοποίηση προς τα πάνω fix στρογγυλοποίηση προς το μηδέν rem υπόλοιπο ακέραιας διαίρεσης Οι τριγωνομετρικές συναρτήσεις είναι σε ακτίνια. Υποστηρίζονται [[ http://www.gnu.org/software/octave/doc/interpreter/Mathematical-Constants.html | σταθερές]] όπως τα pi,e, i ή j κ.α. Έχουμε σταθερές και δεν θα έχουμε μεταβλητές; octave:7> rad2grad=200/pi; octave:8> atan(1)*rad2grad ans = 50 Όπως βλέπετε η μεταβλητή ans είναι αυτόματη απάντηση/αποτέλεσμα της τελευταίας ενέργειας. Αν χρησιμοποιήσω ; στο τέλος μιας γραμμής δεν την εμφανίζει. Ο τύπος όλων των μεταβλητών είναι πραγματικοί αριθμοί ενώ υποστηρίζονται και μιγαδικοί: octave:9> a=2+3i; octave:10> b=1-2j; octave:11> c=a*b c = 8 - 1i Για τις συναρτήσεις σε μιγαδικούς αριθμούς δείτε περισσότερα [[http://www.gnu.org/software/octave/doc/interpreter/Complex-Arithmetic.html|εδώ]] ======Πίνακες και διανύσματα====== Η octave υποστηρίζει πίνακες και διανύσματα. Δείτε ένα παράδειγμα: octave:12> A=[1 2; 3 4]; octave:13> B=[2 1; 4 3]; octave:14> C=A+B C = 3 3 7 7 octave:15> D=A*B D = 10 7 22 15 octave:16> E=A.*B E = 2 2 12 12 Υποστηρίζονται οι πράξεις +,-,* ως πολλαπλασιασμός πινάκων και .* ως βαθμωτός πολλαπλασιασμός, / και ./ αντίστοιχα και \ και .\ ως αριστερή διαίρεση: octave:17> F=A.\B F = 2.00000 0.50000 1.33333 0.75000 octave:18> G=A\B G = 0 1 1 0 Ο πολλαπλασιασμός πινάκων δεν είναι αντιμεταθετικός. Έτσι διαίρεση γίνεται με πολλαπλασιασμό με τον αντίστροφο είτε από δεξιά ( Α/Β == Α*Β^(-1) ) είτε από αριστερά (Α\Β == Β^(-1)*Α). Προσοχή στο .\ ;-) Αν έχω ένα σύστημα Α*Χ=Β μπορώ να πάρω αμέσως την λύση. Δείτε πως: octave:19> A A = 1 2 3 4 octave:20> B=[17 ;39] B = 17 39 octave:21> X=A\B X = 5.0000 6.0000 Τέλος υπάρχουν και οι [[https://www.gnu.org/software/octave/doc/interpreter/Special-Utility-Matrices.html|ειδικοί]] πίνακες όπως οι eye, ones, zeros: octave:22> eye(3) ans = Diagonal Matrix 1 0 0 0 1 0 0 0 1 octave:23> ones(2,2) ans = 1 1 1 1 octave:24> zeros(12) ans = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 octave:25> zeros(1,2) ans = 0 0 octave:26> zeros(3,1) ans = 0 0 0 Πριν φύγουμε από τους πίνακες θα πρέπει να δούμε τον ειδικό χαρακτήρα : με τον οποίο ορίζουμε εύρη τιμών. Έτσι μπορούμε, όταν θέλουμε, να επιλέξουμε μια συγκεκριμένη γραμμή ή στήλη από ένα διάνυσμα ή τμήμα ενός πίνακα. Παραδείγματα: octave:27> A A = 1 2 3 4 octave:28> A(1, :) ans = 1 2 για την πρώτη γραμμή και octave:29> A(:, 1) ans = 1 3 για την πρώτη στήλη. Τι σημαίνει όμως το [https://www.gnu.org/software/octave/doc/interpreter/Ranges.html|εύρος τιμών]; Το εύρος ορίζεται ως αρχή:βήμα:τέλος έτσι: octave:30> 1:3:10 ans = 1 4 7 10 Σε περίπτωση που το βήμα είναι 1, μπορεί να παραληφθεί: octave:31> 1:10 ans = 1 2 3 4 5 6 7 8 9 10 Μια σημαντική λέξη κλειδί που μπορεί να χρησιμοποιηθεί είναι το end. Σε περίπτωση λοιπόν που θέλουμε να επιλέξουμε μια γραμμή ή μια στήλη ενός πίνακα από την αρχή μέχρι το τέλος μπορούμε να γράψουμε: octave:32> Α(1:end, 1) ans = 1 3 Έστω λοιπόν πως ορίζουμε έναν πίνακα δύο διαστάσεων: octave:33> A = [16 2 3 13; 5 11 10 8; 9 7 6 12; 4 14 15 1] A = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 Μπορώ να εξάγω με τον χαρακτήρα : τις γραμμές ως εξής: octave:34> A(2:4,1:2) ans = 5 11 9 7 4 14 Επίσης μπορώ να εξάγω τα στοιχεία της τελευταίας στήλης ως εξής: octave:35> A(:,end) ans = 13 8 12 1 Με το εύρος τιμών είδαμε πως μπορούμε να κόβουμε έναν πίνακα σαν σπανακόπιτα. ;-) Πως μπορούμε όμως να τον ξανασυνδέσουμε; Στο ακόλουθο παράδειγμα βλέπουμε πως σχηματίζεται ένας νέος πίνακας από άλλους: octave:36> A=[1 2;3 4]; octave:37> B=[5 6;7 8]; octave:38> C=zeros(2); octave:39> D=eye(2); octave:40> E=[ A B; C D] E = 1 2 5 6 3 4 7 8 0 0 1 0 0 0 0 1 ======Εντολές ελέγχου====== Μπορούμε να ελέγχουμε την ροή εκτέλεσης εντολών στην octave; Φυσικά και μπορούμε. Αρκεί να ξέρουμε κατ'αρχήν τους λογικούς τελεστές : Σύμβολο Σημασία Παράδειγμα == ίσο if x == y ~= όχι ίσο if x ~= y > μεγαλύτερο από if x > y >= μεγαλύτερο ή ίσο από if x >= y < μικρότερο από if x < y <= μικρότερο ή ίσο από if x <= y && ΚΑΙ if x == 1 & y > 2 || Ή if x == 1 | y > 2 ~ ΌΧΙ x = ~y [[https://www.gnu.org/software/octave/doc/interpreter/Operator-Precedence.html|Εδώ]] θα βρείτε όλους τους τελεστές της octave και την προτεραιότητά τους. =====Εντολή ελέγχου if===== Η εντολή ελέγχου ροής είναι η if και η γενική μορφή της είναι η παρακάτω: if συνθήκη1 ΟΜΑΔΑ Α ... elseif συνθήκη2 ΟΜΑΔΑ Β else ΟΜΑΔΑ Ω end Εάν η συνθήκη1 είναι αληθής, τότε εκτελείται η ομάδα εντολών Α και το πρόγραμμα συνεχίζει μετά την end. Εάν η συνθήκη1 είναι ψευδής, η επόμενη συνθήκη (συνθήκη2 στο elseif) ελέγχεται και η ομάδα εντολών Β εκτελείται άμα είναι αληθής. Μπορεί να υπάρχουν όσες συνθήκες elseif χρειάζονται ανά περίπτωση. Η τελική ομάδα εντολών, μετά το else, εκτελείται στην περίπτωση που όλες οι συνθήκες είναι ψευδείς. Οι εντολές elseif και else είναι προαιρετικές ενώ μετά την ολοκλήρωση κάθε ομάδας εντολών η εκτέλεση συνεχίζεται μετά το end. ΠΡΟΣΟΧΉ: Είναι αδύνατη η εκτέλεση περισσοτέρων από μία ομάδων εντολών διότι αν μία συνθήκη προκύψει ΑΛΗΘΉΣ εκτελούνται οι εντολές της ομάδας της και δεν εξετάζεται άλλη μέχρι την ολοκλήρωση της εντολής. octave:1> a=1; octave:2> b=2; octave:3> if a>b > c=3 > else > c=4 > end c = 4 Προσέξτε τον χαρακτήρα > στο παραπάνω παράδειγμα. Τον συναντάμε όταν μία εντολή καταλαμβάνει περισσότερες από μία γραμμές και μέχρι την ολοκλήρωσή της. =====Εντολή ελέγχου switch===== Σε περίπτωση που σε ένα πρόγραμμα χρειάζονται πολλές if/elseif εντολές προκειμένου να επιλεγεί το αποτέλεσμα μέσα από μια ποικιλία διαφορετικών εντολών, είναι καλύτερα να χρησιμοποιηθεί η εντολή switch. Η εντολή ακολουθεί το παρακάτω πρότυπο: switch x case x1, .... case x2, .... otherwise, .... end Στην εντολή switch, η τιμή του x συγκρίνεται με κάθε μια από την λίστα με τα case, και αν βρεί μια ίση με αυτή τότε εκτελεί την αντίστοιχη ομάδα εντολών. Σε περίπτωση που κανένα case δεν είναι αληθές, εκτελείται η ομάδα εντολών που βρίσκεται μέσα στο otherwise, αν αυτό υπάρχει. Ακολουθεί ένα παράδειγμα εφαρμογής της εντολής: octave:10> a=1; octave:11> switch a > case 0 > disp("a is zero"); > case 1 > disp("a is one"); > otherwise > disp("a is unknown"); > end a is one Η συνάρτηση disp εμφανίζει την τιμή ενός αριθμού ή μια παράσταση χαρακτήρων. Στο συγκεκριμένο παράδειγμα χρησιμοποιείται για να εκτυπώσει στην οθόνη μια σειρά από χαρακτήρες. Μπορεί όμως να χρησιμοποιηθεί και με μεταβλητές. πχ. disp(a) θα εκτυπώσει την τιμή του a. ======Εντολές επανάληψης====== =====Εντολή επανάληψης for===== Στον προγραμματισμό είναι πολύ συνήθης η χρήση της εντολής επανάληψης for, η οποία επαναλαμβάνει μια ομάδα εντολών για προκαθορισμένες τιμές και με ένα προκαθορισμένο βήμα. Στην γλώσσα octave η χρήση του πρέπει να αποφεύγεται. Προσπαθήσετε να χρησιμοποιήσετε τις πράξεις με διανύματα, εύρη τιμών και συναρτήσεις αντί για αυτή την εντολή διότι είναι περίπου σαράντα φορές πιο αργή. Παρόλα αυτά υπάρχουν σπάνιες περιπτώσεις που η χρήση του for δεν μπορεί να αποφευχθεί. Η σύνταξη του είναι η ακόλουθη: for variable = vector statements end όπου το vector (διάνυσμα) περιλαμβάνει και τον αριθμό του βήματος. Ακολουθεί ένα παράδειγμα: octave:12> for n=1:5 > nf(n) = factorial(n); > end octave:13> nf nf = 1 2 6 24 120 όπου σχηματίζεται ένας νέος πίνακας με τα παραγοντικά των αριθμών 1 έως 5. Αυτό το παράδειγμα έγινε μόνο για την επίδειξη της εντολής και είναι ατυχές όπως το 99% των περιπτώσεων χρήσης της for, αφού μπορούμε να έχουμε το ίδιο αποτέλεσμα έτσι: octave:14> n=1:5 n = 1 2 3 4 5 octave:15> nf=factorial(n) nf = 1 2 6 24 120 ΠΡΟΣΟΧΗ: Πριν χρησιμοποιήσετε μία εντολή for βεβαιωθείτε ότι δεν μπορείτε να κάνετε την δουλειά σας με πιο εύκολο και σύντομο τρόπο. Στην αρχή είναι λίγο δύσκολο, ειδικά για όσους είναι προγραμματιστές σε παλαιότερες γλώσσες προγραμματισμού όπως Fortran, Pascal, Basic ή C/C++ αλλά ας μην ξεχνάμε πως δεν έχουμε λόγο να γράφουμε κώδικα στην octave αν δεν χρησιμοποιούμε την δύναμή της. =====Εντολή επανάληψης while===== Σε περίπτωση που δεν ξέρουμε ακριβώς πόσες επαναλήψεις μπορεί να χρειαστούμε και απλά χρειαζόμαστε μια επαναληπτική διαδικασία μέχρι να εκπληρωθεί μια συνθήκη, η octave μας παρέχει την επαναληπτική εντολή while: while expression statements end Παράδειγμα: octave:16> x=1; octave:17> while 1+x>1 > x=x/2; > end octave:18> format long octave:19> x x = 1.11022302462516e-16 Ας θυμηθούμε εδώ ότι παρότι στον Η/Υ μπορούμε να αποθηκεύουμε πολύ μικρότερους αριθμούς από το 1e-16 η ακρίβεια των υπολογισμών δεν είναι αντίστοιχη. Όπως σε κάθε αναπαράσταση [[https://en.wikipedia.org/wiki/Floating_point | αριθμού κινητής υποδιαστολής]] η ακρίβεια υπολογισμών είναι ανάλογη με το μέγεθος της [[https://en.wikipedia.org/wiki/Significand| μάντισσας]] (πλήθος σημαντικών ψηφίων) και πάντα πεπερασμένη. Και μια και θυμηθήκαμε αυτό ας θυμηθούμε και το άλλο: για τον ίδιο λόγο αποφεύγουμε τον έλεγχο ισότητας πραγματικών αριθμών. Αντί για το: a==b επιλέγουμε το abs(a-b) eps ans = 2.22044604925031e-16 Μόλις ένα bit μεγαλύτερος από το x στο παραπάνω παράδειγμα ;-) ======Συναρτήσεις====== Ε, αν δεν έχει η octave συναρτήσεις τότε ποιος έχει; Κι είναι τόσο απλές που με ένα παράδειγμα θα γίνουν πλήρως κατανοητές. Ας ξεκινήσουμε: έχουμε την συνάρτηση fifi(x) = 2*x για x θετικό και 3*x για κάθε άλλη περίπτωση. Να πως γράφεται: octave:1> function y=fifi(x) > if x>0 > y=2*x > else > y=3*x > endif > endfunction octave:2> fifi(2) y = 4 ans = 4 octave:3> fifi(-2) y = -6 ans = -6 Ας τα δούμε αναλυτικά: Οι εντολές function και endfunction ορίζουν την αρχή και το τέλος της συνάρτησης. Η συνάρτηση έχει όνομα fifi ενώ x και y είναι οι τοπικές της μεταβλητές για να δείξουμε τι θέλουμε να κάνουμε. Στο παράδειγμά μας με y είναι η μεταβλητή που επιστρέφεται η τιμή αποτέλεσμα (αν υπάρχει) ενώ με x δίνεται η τιμή ορισμού (μπορεί να είναι περισσότερες από μία). Το σώμα της συνάρτησης ακολουθεί με χρήση των παραπάνω μεταβλητών και όποιων άλλων θέλουμε και όσο πολύπλοκο θέλουμε. Η δύναμη της octave φαίνεται αν συνεχίσουμε το παράδειγμα: octave:4> a=[1 -2; 3 -4]; octave:5> b=fifi(a); y = 3 -6 9 -12 octave:6> b b = 3 -6 9 -12 Τι να πω; Τα πάντα όλα κάνει η octave. Και ας μην ξεχνάμε το τεράστιο πλήθος συναρτήσεων (μια ιδέα πήραμε [[http://octave.sourceforge.net/functions_by_alpha.php|νωρίτερα]]) οι οποίες είναι ήδη γραμμένες ;-) Καλά όλα αυτά αλλά θα πρέπει κάθε φορά να φτιάχνω την συνάρτηση και να την γράφω; Δεν μπορεί... κάπως θα γίνεται... Φτιάχνουμε ένα αρχείο με το όνομα fifi.m, περιεχόμενα την συνάρτησή μας όπως πριν: function y=fifi(x) if x>0 y=2*x; else y=3*x; endif endfunction και το αποθηκεύουμε στον φάκελο εργασίας μας. (Σημείωση: η στοίχιση είναι προαιρετική και εδώ έγινε γιατί έτσι με έμαθαν να κάνω οι δάσκαλοί μου καλή τους ώρα ;-) ) Τώρα ανοίγουμε τo περιβάλλον και: octave:1> a=[1 -2; 3 -4]; octave:2> b=fifi(a); octave:3> b b = 3 -6 9 -12 Καλό, έτσι; Προσοχή λοιπόν στο όνομα της συνάρτησης και του αρχείου. Και μετά κάνουμε ότι θέλουμε :-) ======Ομαδική εκτέλεση εντολών====== Ομαδική εκτέλεση εντολών είδαμε με μορφή συνάρτησης σε αρχείο m. Εδώ επιπλέον θα δούμε ότι μπορούμε να αποθηκεύουμε πίνακες (γενικά κάθε μεταβλητή) σε αρχεία τύπου mat και φυσικά να εκτελούμε αρχεία συναρτήσεων / ομαδικών εντολών τύπου m. Εδώ: octave:1> A=[ 1 1; 2 1;3 1; 4 1]; octave:2> B=[ 6;5;7;10]; octave:3> save pinAB.mat A B αποθηκεύσαμε στο αρχείο pinAB.mat τους πίνακες A και B. Το αρχείο αυτό έχει περιεχόμενα: [chiossif@home-6400 ~]$ cat pinAB.mat # Created by Octave 3.6.4, Sun Jan 26 13:42:21 2014 EET # name: A # type: matrix # rows: 4 # columns: 2 1 1 2 1 3 1 4 1 # name: B # type: matrix # rows: 4 # columns: 1 6 5 7 10 (Η εντολή cat είναι εντολή στο τερματικό bash του [[https://www.archlinux.org/|Archlinux]] το οποίο χρησιμοποιώ και για αυτό το wiki :-) Προφανώς είμαι εκτός octave) και μετά μπορούμε με την load: octave:1> load pinAB.mat octave:2> X=A\B X = 1.4000 3.5000 octave:3> s=sqrt(sum((A*X-B).^2)/(rows(A)-columns(A))) s = 1.4491 δεν ξέρω αν το καταλάβατε αλλά μόλις λύσαμε ένα σύστημα με ΜΕΤ και υπολογίσαμε και σίγμα ;-) Αν μάλιστα φτιάξουμε ένα αρχείο MET.m με περιεχόμενα: load pinAB.mat X=A\B s=sqrt(sum((A*X-B).^2)/(rows(A)-columns(A))) στον φάκελο εργασίας μαζί με το pinAB.mat που είδαμε μόλις πριν, τότε αρκεί μία εντολή: octave:1> MET X = 1.4000 3.5000 s = 1.4491 για να γίνουν όλα :-) ======Βιβλιοθήκη επεξεργασίας εικόνας====== Ναι... υπάρχει και είναι [[http://octave.sourceforge.net/image/ | εδώ]]. Εγκαταστήστε την και ξεκινάμε. Κατ'αρχήν και πάντα παραδοσιακά κατεβάζουμε στον υπολογιστή μας την [[https://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png| Λέννα]]. Με την ευκαιρία [[http://www.lenna.org/full/len_full.html|εδώ]] ολόκληρη η Λέννα για περισσότερες δοκιμές και [[http://www.cs.cmu.edu/~chuck/lennapg/|εδώ]] η ιστορία της ;-) Ξεκινάμε... (to be written - curently starring at [[http://www.lenna.org/full/len_full.html| Lenna's portait]] ;-) ) ======Άλλες βιβλιοθήκες και πρόσθετο υλικό====== ======Επίλογος; Όχι. Τώρα ξεκινάμε... ;-)====== ======Μέτα την παράσταση====== Με όλα όσα αναφέρθηκαν παραπάνω, έχετε τη δυνατότητα να κάνετε οποιοδήποτε πρόγραμμα υπολογισμών της Σχολής μας και μάλιστα να είναι και αρκετά σταθερό και φιλικό προς τον χρήστη. Επίσης να σημειωθεί ότι αυτό το wiki είναι //ελεύθερο// όπως και η GNU/Octave. Μπορεί ο καθένας να έρθει να συμπληρώσει πράγματα, να διαγράψει ή να τροποποιήσει. Ο προσανατολισμός του είναι ερασιτεχνικός και κομμένος και ραμμένος στις απαιτήσεις τις σχολής μας. Στόχος του είναι να αποτελεί ένα πρακτικό εργαλείο και όχι να σας μάθει να προγραμματίζετε σαν επαγγελματίες. Επιπρόσθετα θα σας ενθαρρύναμε ότι πρόγραμμα γράφετε να είναι ανοιχτό και ελεύθερο προς όλους. Να μπορεί δηλαδή ο καθένας να διαβάσει τον κώδικα του και να τον τροποποιήσει ανάλογα με τις ανάγκες του. Μεταφράζοντας τα 4 στοιχεία τα οποία πρέπει να έχει ένα πρόγραμμα για να θεωρείται ελεύθερο (όλη την φιλοσοφία μπορείτε να την βρείτε εδώ : http://www.gnu.org/philosophy/free-sw.html) : => Πρέπει να παρέχει την ελευθερία σε τρίτους να το εκτελούν για οποιοδήποτε λόγο. => Πρέπει να παρέχει την ελευθερία σε τρίτους να μελετούν πως δουλεύει το πρόγραμμα και να το προσαρμόζουν στις δικές τους ανάγκες. Η ελεύθερη πρόσβαση στον κώδικα είναι προαπαιτούμενη => Πρέπει να παρέχει την ελευθερία σε τρίτους να διανέμουν αντίτυπα του προγράμματος για να βοηθήσουν τον πλησίον τους. => Πρέπει να παρέχει την ελευθερία σε τρίτους να βελτιώνουν το πρόγραμμα και να δημοσιεύουν τις βελτιώσεις στο ευρύ κοινό, ώστε να επωφελείται από αυτές ολόκληρη η κοινότητα. Η ελεύθερη πρόσβαση στον κώδικα είναι προαπαιτούμενη. **Τέλος ας σημειωθεί ότι ο όρος //free software// πρέπει να αντιλαμβάνεται ως //freedom of speech// και όχι ως //free beer//. ;)**