ΕΡΓΑΣΙΑ 1 Ημερομηνία Ανάρτησης: 02/02/2017 Ημερομηνία Παράδοσης: 16/02/2017, 09:00 π.μ. Στόχος Στόχος αυτής της εργασίας είναι η χρησιμοποίηση δομών ελέγχου και βρόχων. Διαβάστε προσεχτικά το πρόβλημα και κατανοήστε τι πρέπει να γίνει. Όταν καταλάβετε πως λειτουργεί, τότε ξεκινάτε την υλοποίηση του στον υπολογιστή εφαρμόζοντας τη σύνταξη και σημασιολογία της γλώσσας προγραμματισμού Java. Ορισμός Η μέθοδος του Νεύτωνα είναι μια αλγοριθμική τεχνική για να βρίσκουμε τις ρίζες μιας εξίσωσης. Δείτε εδώ μια ωραία οπτική επεξήγηση. Έστω ότι η συνάρτηση f(x) είναι μια συνάρτηση του x (μπλε καμπύλη στο σχήμα). Θέλουμε να βρούμε τη ρίζα της εξίσωσης f(x) = 0, δηλαδή το σημείο που η μπλε καμπύλη τέμνει τον άξονα των x. Αν επιλέξουμε κάποιο σημείο έστω x0 και φέρουμε την εφαπτομένη της f(x) στο σημείο f(x 0 ) (βλέπε κόκκινη ευθεία) τότε η κλίση της ευθείας δίνεται από την πιο κάτω εξίσωση: Κλίση ευθείας = f (x 0 ) = f(x 0) x x 0 x 1 = x 0 f(x 0) 1 f (x 0 ) Με τον τρόπο αυτό βρήκαμε μια νέα τιμή του x η οποία είναι πιο κοντά στη ρίζα, δηλαδή στο σημείο που η f(x) τέμνει τον άξονα των x. Αν επαναλάβουμε την πιο πάνω διαδικασία με την εφαπτομένη στο σημείο x 1 θα βρούμε μια νέα τιμή του x, έστω x 2 η οποία θα είναι ακόμα πιο κοντά στη ρίζα. Έτσι μπορούμε να ορίσουμε τον επαναληπτικό τύπο: ΕΠΛ131 Εργασία 1. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 1
x n = x n 1 f(x n 1) f (x n 1 ) (1) για να υπολογίζουμε τιμές του x που πλησιάζουν στη ρίζα. Όταν πλησιάσουμε πολύ κοντά στη ρίζα, τότε μπορούμε να παρατηρήσουμε ότι οι υπολογιζόμενες τιμές του επαναληπτικού τύπου δεν αλλάζουν ουσιαστικά. Οπότε, μπορούμε να σταματήσουμε την επανάληψη όταν διαδοχικές υπολογιζόμενες τιμές απέχουν μεταξύ τους τιμή μικρότερη από eps όπως φαίνεται στην πιο κάτω συνθήκη τερματισμού: x n x n 1 < eps (2) Υπάρχει περίπτωση, λόγω λανθασμένης αρχικής τιμής x 0, να μην πλησιάζουμε (συγκλίνουμε) στη ρίζα αλλά να αποκλίνουμε. Στην περίπτωση αυτή, η συνθήκη (2) μπορεί να μην ικανοποιηθεί ποτέ και η επανάληψη να γίνει ατέρμονη. Οπότε, θα πρέπει να έχουμε ακόμα μια ασφαλιστική δικλείδα τερματισμού, όπως για παράδειγμα, μέγιστο όριο επαναλήψεων π.χ. 100 βήματα. Περιγραφή Να γράψετε ένα πρόγραμμα που να δέχεται σαν είσοδο από την γραμμή εντολών, τη συνάρτηση f(x) (μέχρι δευτέρου βαθμού το πολύ), την αρχική τιμή του x 0, την τιμή του eps και το μέγιστο όριο επαναλήψεων. Στη συνέχεια, να υπολογίζει τις διαδοχικές τιμές του x μέσω του επαναληπτικού τύπου που δώσαμε πιο πάνω και να τις εκτυπώνει. Αν για παράδειγμα, η εξίσωση είναι f(x) = x 2 5x + 6, το x 0 = 111.2, eps = 0.0001 και μέγιστο όριο επαναλήψεων 15 τότε η εντολή του προγράμματός σας θα είναι: java newton 1 2-5 1 6 0 111.2 0.0001 15 όπου 1 και 2 είναι ο συντελεστής και εκθέτης του x 2, -5 και 1 είναι ο συντελεστής και εκθέτης του 5x και 6 και 0 είναι ο συντελεστής και εκθέτης του 6x 0. Παραδείγματα Εκτέλεσης % java newton 1 2-5 1 6 0 111.2 0.0001 15 Step x1: 56.85114995 Step x2: 29.67787484 Step x3: 16.09353675 Step x4: 9.30596392 Step x5: 5.92134821 Step x6: 4.24720941 Step x7: 3.44514736 Step x8: 3.10482819 Step x9: 3.00908436 Step x10: 3.00008105 Step x11: 3.00000001 The solution is 3.00000001 ΕΠΛ131 Εργασία 1. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 2
% java newton 1 2-5 1 6 0-111.2 0.0001 15 Step x1: -54.35109938 Step x2: -25.92774842 Step x3: -11.71827132 Step x4: -4.61792717 Step x5: -1.07652488 Step x6: 0.67678744 Step x7: 1.51983342 Step x8: 1.88238737 Step x9: 1.98880145 Step x10: 1.99987734 Step x11: 1.99999998 Step x12: 2.00000000 The solution is 2.00000000 % java newton 1 2-5 1 6 0-111.2 0.0001 9 Step x1: -54.35109938 Step x2: -25.92774842 Step x3: -11.71827132 Step x4: -4.61792717 Step x5: -1.07652488 Step x6: 0.67678744 Step x7: 1.51983342 Step x8: 1.88238737 Step x9: 1.98880145 The solution is 1.98880145 % java newton 2 2-9 0 13.2 0.0001 200 Step x1: 6.77045455 Step x2: 3.71755356 Step x3: 2.46401352 Step x4: 2.14515110 Step x5: 2.12145271 Step x6: 2.12132035 Step x7: 2.12132034 The solution is 2.12132034 % java newton -2 2-9 0 13.2 0.0001 200 Step x1: 6.42954545 Step x2: 2.86482575 Step x3: 0.64702479 Step x4: -3.15394322 Step x5: -0.86357893 Step x6: 2.17364695... Step x195: 3.85321954 Step x196: 1.34268249 Step x197: -1.00440862 Step x198: 1.73791983 ΕΠΛ131 Εργασία 1. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 3
Step x199: -0.42569128 Step x200: 5.07267486 The solution is 5.07267486 Το πρόγραμμά σας πρέπει να εκτυπώνει ακριβώς τα ίδια αποτελέσματα που φαίνονται στα παραδείγματα εκτέλεσης πιο πάνω (οι πραγματικοί αριθμοί να τυπώνονται με ακρίβεια 8 δεκαδικών ψηφίων). Το τελευταίο παράδειγμα δεν έχει πραγματική λύση διότι οι ρίζες της εξίσωσης f(x) = 2x 2 9 είναι μιγαδικές. Στο παράδειγμα αυτό, δεν υπήρξε σύγκλιση σε κάποια ρίζα, αφού η επανάληψη σταμάτησε όταν φτάσαμε στο μέγιστο όριο επαναλήψεων (200). Ελέγχοι Να γίνονται οι εξής έλεγχοι: α) τουλάχιστον δίδονται δεδομένα για 1 όρο της εξίσωσης (και συντελεστής και εκθέτης) μαζί με τις 3 τιμές: x 0, eps και μέγιστο όριο επαναλήψεων, με άλλα λόγια στη γραμμή εντολών θα υπάρχουν τουλάχιστον 5 τιμές (αλλιώς μη επαρκή δεδομένα, δες παράδειγμα πιο κάτω που λείπει ο εκθέτης του όρου που έχει συντελεστή το -2), β) ο αριθμός των δεδομένων στη γραμμή εντολών είναι μονός αριθμός (αλλιώς ελλιπή δεδομένα, δες παράδειγμα πιο κάτω που λείπει ο εκθέτης του όρου που έχει συντελεστή το 9) γ) οι επιτρεπτοί εκθέτες είναι 2, 1 και 0 (αλλιώς μη επιτρεπτός εκθέτης, δες παράδειγμα πιο κάτω που ο εκθέτης του πρώτου όρου είναι το 3) Δείτε παραδείγματα πιο κάτω: % java newton -2 13.2 0.0001 200 Not sufficient input data % java newton -2 2 9 13.2 0.0001 200 Missing input data % java newton -2 3 9 0 13.2 0.0001 200 Not permitted exponent Παράδοση Όταν έχετε τελειώσει με τον πηγαίο κώδικα, μεταγλωττίστε το και βεβαιωθείτε ότι τρέχει σωστά. Παραδώστε τον πηγαίο κώδικα (userid_erg1.java) και τη λίστα δοκιμής (userid_erg1.txt) με όλα τα παραδείγματα εκτέλεσης που φαίνονται πιο πάνω ηλεκτρονικά μέσω του submit assignment κάτω από το Ασκήσεις Εργασία 1 στην ιστοσελίδα του μαθήματος μέχρι τις 16/02/2017 και ώρα 09:00 π.μ. Όπου userid βάλτε το username που σας δόθηκε από το τμήμα. ΕΠΛ131 Εργασία 1. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 4
Προσοχή: Το σύστημα ελέγχει το χρόνο παράδοσης εργασιών γι αυτό μην περιμένετε την τελευταία στιγμή να κάνετε submit την εργασία σας. Βαθμολογία Ένα πρόγραμμα για να πάρει όλες τις μονάδες είναι απαραίτητο να: χρησιμοποιεί σχόλια έχει ευθυγραμμισμένο κώδικας χρησιμοποιεί αυτό-επεξηγηματικά ονόματα για τις μεταβλητές δουλεύει σωστά κάνει όλους τους απαραίτητους ελέγχους Για όλα τα παραπάνω ακολουθήστε τις οδηγίες που περιγράφονται εδώ: http://introcs.cs.princeton.edu/java/11style/. Το αρχείο με το πηγαίο κώδικα πρέπει οπωσδήποτε να περιέχει μια συμπληρωμένη κατάλληλα επικεφαλίδα από σχόλια στην αρχή του αρχείου όπως: / Author: Γράψτε εδώ το όνομα σας Written:../../2017 Last updated:../../2017 Compilation: javac userid_erg1.java Execution: java userid_erg1 Γράψτε εδώ πληροφορίες σχετικά με το τι κάνει το πρόγραμμα / Κριτήρια αξιολόγησης Ανάγνωση δεδομένων εισόδου 25 Κατάλληλοι έλεγχοι 15 Υπολογισμός ρίζας με χρήση μεθόδου 40 Νεύτωνα Σωστά μηνύματα εξόδου 10 Ευανάγνωστος κώδικας, σχόλια, δομή 10 ΣΥΝΟΛΟ 100 Η εργασία είναι ατομική. Μπορείτε να συζητήσετε για αυτήν με τους συμφοιτητές σας, ωστόσο ποτέ δεν είναι αποδεκτό για σας να δείτε τον κώδικα κάποιου άλλου ή να κάνετε από κοινού τον κώδικα. Φυσικά, αν έχετε οποιεσδήποτε ερωτήσεις σχετικά με την εργασία, είμαστε πάντα στη διάθεσή σας για βοήθεια. Ανίχνευση αντιγραφής θα τιμωρείται με μηδενισμό. Κώδικας που δε μεταγλωττίζει ή δεν τρέχει (crashes) παίρνει αυτόματα βαθμολογία 0. ΕΠΛ131 Εργασία 1. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 5