ΠΟΛΥΩΝΥΜΑ. Γενικά περί πολυωνύμων Στη MATLAB τα πολυώνυμα αναπαριστώνται από διανύσματα που περιέχουν τους συντελεστές τους σε κατιούσα διάταξη. Για παράδειγμα το πολυώνυμο αναπαριστάται από το διάνυσμα ενώ το διάνυσμα παριστάνει το πολυώνυμο p ( x) = x x + p = [, -, ] q = [,, 7, -, ] q( x) = x + 7x x. Συναντήσαμε ήδη την εντολή lengh η οποία μας δίνει το μήκος ενός διανύσματος. Έτσι αν το διάνυσμα s παριστάνει το πολυώνυμο s(x), o βαθμός του s(x) είναι Παράδειγμα.. lengh(s) Είναι εύκολο να βρούμε το βαθμωτό πολλαπλάσιο ενός πολυωνύμου αφού αυτό αναπαριστάται από το βαθμωτό πολλαπλάσιο του αντίστοιχου διανύσματος. >> p=[, -, ]; >> q=[,, 7, -, ]; >> *p -9 >> -*q - -8 Είναι επίσης απλό να προσθέσουμε πολυώνυμα του ίδιου βαθμού: >> s=[,, -]; >> s+p
Γ. Γεωργίου & Χρ. Ξενοφώντος Παράδειγμα.. Για την πρόσθεση πολυωνύμων διαφορετικού βαθμού πρέπει να γράψουμε το διάνυσμα που αντιστοιχεί στο πολυώνυμο με το μικρότερο βαθμό σαν διάνυσμα ίσου μήκους με το διάνυσμα που αντιστοιχεί στο πολυώνυμο με τον μεγαλύτερο βαθμό. Για παράδειγμα, για να προσθέσουμε τα πολυώνυμα που αναπαριστώνται από τα διανύσματα p = [,,,, ] και q = [ -,, ] γράφουμε το δεύτερο σαν και υπολογίζουμε το άθροισμα p+qnew. qnew = [,, -,, ] Το ακόλουθο funcion m-file με το όνομα poladd.m κάνει ακριβώς αυτή τη δουλειά για μας. funcion pplusq=poladd(p,q) % % pplusq=poladd(p,q) % % Briskei o aroisma wn dianusmawn p kai q % pou aviproswpeuouv polwvuma. % degp = lengh(p); degq = lengh(q); if degp==degq pplusq =p + q; elseif degp>degq pplusq = p + [zeros(, degp-degq) q]; else pplusq = q + [zeros(, degq-degp) p]; end % End of POLYADD Ακολουθούν αποτελέσματα που πήραμε με το poladd.m: >> p = [,,,, ]; >> q = [-,, ]; >> poladd(p,q) >> p=[, -, ]; >> q=[,, 7, -, ]; >> poladd(p,q) 8-8
. Πολυώνυμα. Χρήσιμες συναρτήσεις για πολυώνυμα Οι σημαντικότερες εντολές για πολυώνυμα συνοψίζονται στον πιο κάτω πίνακα: polval Βρίσκει την τιμή ενός πολυωνύμου p(x) σε ένα σημείο x. Δομή: polval(p, x) p: το διάνυσμα που αντιστοιχεί στο πολυώνυμο p(x) x: το σημείο όπου υπολογίζεται το πολυώνυμο roos Βρίσκει τις ρίζες ενός πολυωνύμου p(x). Δομή: roos(p) p: το διάνυσμα που αντιστοιχεί στο πολυώνυμο p(x) conv Βρίσκει τη συνέλιξη (γινόμενο) δύο πολυωνύμων p(x) και q(x). Δομή: conv(p, q) p: το διάνυσμα που αντιστοιχεί στο πολυώνυμο p(x) q: το διάνυσμα που αντιστοιχεί στο πολυώνυμο q(x) deconv Βρίσκει τη αποσυνέλιξη (διαίρεση) δύο πολυωνύμων p(x) και q(x). Δομή: [s, r] = deconv(p, q) p: το διάνυσμα που αντιστοιχεί στο πολυώνυμο p(x) q: το διάνυσμα που αντιστοιχεί στο πολυώνυμο q(x) s: το πηλίκο της διαίρεσης r: το υπόλοιπο της διαίρεσης polder Βρίσκει την παράγωγο ενός πολυωνύμου p(x). Δομή: polder(p) p: το διάνυσμα που αντιστοιχεί στο πολυώνυμο p(x) 87
Γ. Γεωργίου & Χρ. Ξενοφώντος Παράδειγμα.. Θα βρούμε τις τιμές του πολυωνύμου σε διάφορα σημεία: p ( x) = x + x + x + x >> p=[,,,, ]; >> polval(p,) >> polval(p,) >> polval(p,-) Άρα, για να πάρουμε τη γραφική παράσταση του p(x) στο διάστημα [, ½] γράφουμε >> x=linspace(-,.); >> plo(x,polval(p,x)).. -. - -.. Μπορούμε επίσης να βρούμε τις ρίζες του πολυωνύμου με την εντολή roos: >> roos(p) -.8 -.7 +.8i -.7 -.8i 88
. Πολυώνυμα Παρατηρούμε ότι η MATLAB βρίσκει τόσο τις πραγματικές όσο και τις μιγαδικές ρίζες. Ας δοκιμάσουμε τώρα το εξής: >> q=[,,,, -]; >> roos(q) -.. +.i. -.i. (Βρήκαμε τις ρίζες του x =.) Παράδειγμα.. Θα πολλαπλασιάσουμε τα πολυώνυμα p ( x) = x + και q( x) = x + x + 8: >> p=[, ]; >> q=[,, 8]; >> z=conv(p,q) z = Βρήκαμε, δηλαδή, ότι z ( x) = p( x) q( x) = x + x + x + Θα διαιρέσουμε τώρα το z(x) με το q(x) z( x) q( x) >> [s, r] = deconv(z,q) s = r = (Η διαίρεση είναι φυσικά ακριβής.) Μπορούμε φυσικά να δοκιμάσουμε πιο εξεζητημένα παραδείγματα: >> p=[, -,,, -, ]; >> q=[,, ]; >> s=conv(p,q) s = - -7 - - >> [z,r]=deconv(p,q) z =. -..99 -.988 r = Columns hrough -... -.78 Column.988 89
Γ. Γεωργίου & Χρ. Ξενοφώντος Παράδειγμα.. Η παράγωγος του πολυωνύμου p ( x) = x x x + υπολογίζεται εύκολα ως εξής: >> p=[, -, -, ]; >> polder(p) 9-8 - Μπορούμε εύκολα να βρούμε τα στάσιμα σημεία του p(x): >> roos(polder(p)). -. Παράδειγμα.. Η εντολή pol βρίσκει το χαρακτηριστικό πολυώνυμο ενός τετραγωνικού πίνακα. Για παράδειγμα: >> A=[,, ;,, ; ] A = >> p=pol(a) p = -8 7 - Μπορούμε να βρούμε τις ρίζες του χαρακτηριστικού πολυωνύμου (δηλ. τις ιδιοτιμές του Α) με την >> roos(p)... ή πιο απλά με την εντολή eig: >> eig(a) 9
. Πολυώνυμα. Προσαρμογή δεδομένων και η εντολή polfi Μια από τις πιο κύριες εφαρμογές των πολυωνύμων είναι η προσαρμογή δεδομένων (curve fiing), που είναι επίσης γνωστή ως παλινδρόμηση (regression). Σε αυτή τη διαδικασία, έχουμε σαν δεδομένα ένα πεπερασμένο αριθμό σημείων (σαν αυτά που φαίνονται στο πιο κάτω γράφημα), και θέλουμε να βρούμε μια συνάρτηση, συνήθως πολυώνυμο μικρού βαθμού, που να αντιπροσωπεύει τα δεδομένα, δηλ. να προσαρμόσουμε το πολυώνυμο στα δεδομένα. Αν απαιτήσουμε το πολυώνυμο να περνά από όλα τα σημεία (όπως στο πιο κάτω γράφημα), τότε παίρνουμε το λεγόμενο πολυώνυμο παρεμβολής (inerpolan), του οποίου ο βαθμός είναι ίσος με τον αριθμό των σημείων πλην ένα. Αν δεν απαιτήσουμε το πολυώνυμο να περνά από όλα τα σημεία, αλλά να έχει βαθμό μικρότερο από τον αριθμό των σημείων πλην ένα, τότε αυτό μπορεί να γίνει με διάφορες μεθόδους, η πιο συνηθισμένη των οποίων είναι η μέθοδος των ελάχιστων τετραγώνων (leas squares mehod). Στα πιο κάτω γραφήματα φαίνονται δύο τέτοιες περιπτώσεις. 9
Γ. Γεωργίου & Χρ. Ξενοφώντος Στη MATLAB, τα πιο πάνω μπορούν να επιτευχθούν με την εντολή polfi, η οποία δουλεύει ως εξής: Έστω ότι τα ( xi, i), i=,..., N + είναι δεδομένα και έχουν αποθηκευτεί σε δύο διανύσματα x και, αντίστοιχα. Τότε, η εντολή p = polfi(x,, Μ) μας δίνει τους συντελεστές του πολυωνύμου p που έχει βαθμό Μ και που αντιπροσωπεύει τα δεδομένα. Σημειώνουμε ότι αν Μ = Ν, τότε παίρνουμε τους συντελεστές του πολυώνυμου παρεμβολής που περνά από όλα τα σημεία ( xi, i), ενώ αν Μ < N τότε παίρνουμε τους συντελεστές ενός πολυωνύμου που προσαρμόζει τα δεδομένα με την μέθοδο των ελάχιστων τετραγώνων. Αν Μ > N, τότε το πολυώνυμο δεν είναι μοναδικό. Όμως αυτή η περίπτωση δεν παρουσιάζει ενδιαφέρον. Παράδειγμα.. Έστω ότι έχουμε τα πιο κάτω δεδομένα: Τότε, >> x = [ 7]; >> = [ 9 ]; >> p = polfi(x,,) p =.8 -.89.9-7.9.9 το οποίο σημαίνει ότι το πολυώνυμο p x x x x x ( ) =.8.89 +.9 7.9 +.9 περνά από όλα τα δοθέντα σημεία, μια και έχουμε σημεία και το πολυώνυμο που κατασκευάσαμε έχει βαθμό. Για να βρούμε τη τιμή του p (x) σε κάποιο σημείο, π.χ. x =.7, χρησιμοποιούμε την εντολή polval, που έχουμε ήδη δει: >> polval(p,.7).8 Για να κάνουμε τη γραφική παράσταση του p (), [, 8], και να δείξουμε τα δεδομένα σημεία στους ίδιους άξονες, προχωρούμε ως εξής: >> = linspace(,7); >> P = polval(p,); >> plo(,p,x,,'o') >> xlabel('x') >> label('') >> legend('p_(x)','daa') 9
. Πολυώνυμα p () daa 7 8 Σημειώνουμε ότι χρησιμοποιήσαμε p, με p μικρό, για τους συντελεστές του πολυωνύμου, και P, με P κεφαλαίο, για τις τιμές του πολυωνύμου, έτσι ώστε να μην συγχύσουμε τα δύο. Ας δούμε τώρα τι παίρνουμε αν ζητήσουμε πολυώνυμα που έχουν βαθμό, και. >> p = polfi(x,,) p =.887.88 >> p = polfi(x,,) p =.8.99.887 >> p = polfi(x,,) p =.9 -... Τα πιο πάνω σημαίνουν ότι τα πολυώνυμα p ( x ) =.887 x+.88 p x x x ( ) =.8 +.99 +.887 p x x x x ( ) =.9. +. +. προσαρμόζουν τα δεδομένα, χωρίς κατά ανάγκη να περνούν από όλα τα σημεία ίσως να μην περνούν και από κανένα από αυτά. Παίρνουμε την γραφική παράσταση όλων των πολυωνύμων που έχουμε κατασκευάσει, στο ίδιο παράθυρο με την εντολή subplo, ως εξής: >> P = polval(p,); >> P = polval(p,); >> P = polval(p,); >> subplo(,,) >> plo(x,,'o',,p) 9
Γ. Γεωργίου & Χρ. Ξενοφώντος >> xlabel('') >> label('') >> legend('p_()','daa') >> subplo(,,) >> plo(x,,'o',,p) >> xlabel('') >> label('') >> legend('p_()','daa') >> subplo(,,) >> plo(x,,'o',,p) >> xlabel('') >> label('') >> legend('p_()','daa') >> subplo(,,) >> plo(x,,'o',,p) >> xlabel('') >> label('') >> legend('p_()','daa') p () p () daa daa 7 8 7 8 p () daa p () daa 7 8 7 8 Παράδειγμα.. Θα κατασκευάσουμε πολυώνυμα που προσαρμόζουν τα δεδομένα (.9,.9), (.,.), (,.), (,.), (,.), (8,.9) και (9.,.). Ορίζουμε τα διανύσματα x και ως 9
. Πολυώνυμα >> x = [.9,.,,,, 8, 9.]; >> = [.9,.,.,.,.,.9,.]; και με την εντολή polfi παίρνουμε τους συντελεστές των πολυωνύμων βαθμού,,, (μια και έχουμε 7 σημεία) ως εξής: >> p = polfi(x,,); >> p = polfi(x,,); >> p = polfi(x,,); >> p = polfi(x,,); >> p = polfi(x,,); >> p = polfi(x,,); Παίρνουμε την γραφική παράσταση των πιο πάνω πολυωνύμων, στο διάστημα [, ] ως εξής: >> = linspace(,); >> P = polval(p,); >> P = polval(p,); >> P = polval(p,); >> P = polval(p,); >> P = polval(p,); >> P = polval(p,); >> subplo(,,) >> plo(x,,'o',,p) >> xlabel('') >> label('p_()') >> legend('daa','p_()') >> subplo(,,) >> plo(x,,'o',,p) >> xlabel('') >> label('p_()') >> legend('daa','p_()') >> subplo(,,) >> plo(x,,'o',,p) >> xlabel('') >> label('p_()') >> legend('daa','p_()') >> subplo(,,) >> plo(x,,'o',,p) >> xlabel('') >> label('p_()') >> legend('daa','p_()') >> subplo(,,) >> plo(x,,'o',,p) >> xlabel('') >> label('p_()') >> legend('daa','p_()') >> subplo(,,) >> plo(x,,'o',,p) >> xlabel('') >> label('p_()') 9
Γ. Γεωργίου & Χρ. Ξενοφώντος >> legend('daa','p_()') 7 p () daa 7 p () daa 7 p () daa - 8-8 - 8 8 7 p () daa 7 p () daa p () daa - - 8 8-8 Προσαρμογή δεδομένων με μη-πολυωνυμικές συναρτήσεις Υπάρχουν περιπτώσεις για της οποίες δεν θέλουμε να προσαρμόσουμε πολυώνυμο στα δεδομένα, αλλά κάποια άλλη συνάρτηση που θα τα αντιπροσωπεύει καλύτερα. Αν, για παράδειγμα, πιστεύουμε ότι τα δεδομένα x και σχετίζονται με εκθετικό τρόπο, δηλ. θέλουμε να βρούμε σταθερές b και m, τέτοιες ώστε η συνάρτηση = be να προσαρμόζει τα δεδομένα, τότε πάλι μπορούμε να χρησιμοποιήσουμε την εντολή polfi. Αυτή τη φορά δεν θα δώσουμε σαν δεδομένα εισόδου τα διανύσματα x και, αλλά τα διανύσματα x και ln, και θα κάνουμε γραμμική προσαρμογή ως εξής: mx polfi(x, log(), ) mx Ο λόγος είναι απλός: Αν = be τότε, mx ln = ln be ln = ln b+ mx Y = mx+ B Y B 9
. Πολυώνυμα που μας λέει ότι θέλουμε να βρούμε ένα πολυώνυμο ου βαθμού για τα δεδομένα ( x, Y) = ( x,ln ). Παράδειγμα.. Έστω ότι έχουμε τα εξής δεδομένα.......... W..8.7...8.9..9.7. και θέλουμε να βρούμε μια κατάλληλη συνάρτηση = f() που τα αντιπροσωπεύει. Ορίζουμε τα διανύσματα >> =[..........]; >> W=[..8.7...8.9..9.7.]; και κάνουμε την γραφική τους παράσταση: >> plo(,w,'o') >> xlabel('') >> label('w') W Προφανώς, δεν θα ψάξουμε για πολυώνυμο ου βαθμού, μια και τα δεδομένα δεν φαίνεται να βρίσκονται πάνω σε μια ευθεία. Ας δούμε τι παίρνουμε αν χρησιμοποιήσουμε πολυώνυμα ου, ου και ου βαθμού. >> p=polfi(,w,); >> =:.:; >> p=polval(p,); >> plo(,w,'o',,p) >> xlabel('') >> label('w') >> legend('daa','p_(x)') W daa p (x) 97
Γ. Γεωργίου & Χρ. Ξενοφώντος >> p=polfi(,w,); >> =:.:; >> p=polval(p,); >> plo(,w,'o',,p) >> xlabel('') >> label('w') >> legend('daa','p_(x)') W daa p (x) >> p=polfi(,w,); >> =:.:; >> p=polval(p,); >> plo(,w,'o',,p) >> xlabel('') >> label('w') >> legend('daa','p_(x)') W 7 daa p (x) Τα πιο πάνω δίνουν ικανοποιητικά αποτελέσματα, αλλά ας δοκιμάσουμε και μια εκθετική συνάρτηση: >> p=polfi(,log(w),) p = -.8.7899 Αυτό σημαίνει ότι η συνάρτηση = be exp () m, όπου >> m=p(); >> b=exp(p()) b =.9889 προσαρμόζει τα δεδομένα. Ας δούμε την γραφική της παράσταση: >> _exp=b*exp(m*); >> plo(,w,'o',,_exp) >> xlabel('') >> label('w') >> legend('daa','b e^{m}') 98
. Πολυώνυμα daa b e m W Από ότι φαίνεται, τα δεδομένα σχετίζονται με εκθετικό τρόπο αφού το πιο πάνω αποτέλεσμα είναι το καλύτερο. 99
Γ. Γεωργίου & Χρ. Ξενοφώντος. Ασκήσεις. Τροποποιείστε το m-file poladd.m του παραδείγματος.. έτσι ώστε όταν το άθροισμά των πολυωνύμων p και q έχει βαθμό μικρότερο από το max{degp, degq} να μην εμφανίζονται περιττά μηδενικά στην αρχή του διανύσματος που αντιστοιχεί στο p+q.. Δημιουργήστε ένα funcion m-file με όνομα pconv.m και μεταβλητές εισόδου το πολυώνυμο p και ένα φυσικό αριθμό n που να βρίσκει το πολυώνυμο p n.. Χρησιμοποιώντας της εντολές πολυωνύμων βιβλιοθήκης της MATLAB, να κάνετε την γραφική παράσταση του.x x x x,. = + + για [ ]. Χρησιμοποιώντας της εντολές πολυωνύμων βιβλιοθήκης της MATLAB, να διαιρέσετε το πολυώνυμο x + x 7x 9x + x δια x + x+. Να γράψετε την απάντηση που σας δίνει η MATLAB σε μαθηματική μορφή.. Έστω f ( x) = x + x x x+ και gx ( ) = x + x+. Χρησιμοποιώντας της εντολές πολυωνύμων βιβλιοθήκης της MATLAB, να: (α) Βρείτε τις ρίζες της συνάρτησης f ( x) g( x) και να τις εντοπίσετε στην γραφική της παράσταση (με βέλη και κείμενο). (β) Βρείτε μια παράσταση για την συνάρτηση ( f ( xgx ) ( )). gx ( ) (γ) Βρείτε μια παράσταση για την συνάρτηση f ( x).. Γράψτε ένα funcion m-file με όνομα polin.m, το οποίο να υπολογίζει το ολοκλήρωμα ενός πολυωνύμου p θέτοντας τη σταθερά ολοκλήρωσης ίση με. Για παράδειγμα για το p = [ ] το m-file πρέπει να δίνει polin(p) = [....] Σε τι διαφέρουν οι polder(polin(p)) και polin(polder(p));.7 Έστω f ( x) = x x + 8x. Χρησιμοποιώντας της εντολές πολυωνύμων, καθώς και άλλες εντολές βιβλιοθήκης της MATLAB, να βρείτε τα μέγιστα και ελάχιστα σημεία της συνάρτησης (αν υπάρχουν), όπως και τα σημεία καμπής (αν υπάρχουν). Να βρείτε, επίσης, τις ρίζες της συνάρτησης (δηλ. τα σημεία που περνά από τον από τον άξονα των x) και να εντοπίσετε όλες αυτές τις πληροφορίες στη γραφική παράσταση της f ( x ) με βέλη και κείμενο..8 Έστω ότι έχουμε τα εξής δεδομένα: x.. 7...8..9.....7 8.9 Να προσαρμόσετε τα πιο πάνω με πολυώνυμα βαθμού,, και. Για το καθένα, να κατασκευάσετε ένα γράφημα που να δείχνει το πολυώνυμο μαζί με τα σημεία (στο ίδιο γράφημα). Τι παρατηρείτε όταν το πολυώνυμο έχει βαθμό ;.9 Να γράψετε ένα m-file, που να καλείται powerfi.m, το οποίο να παίρνει σαν δεδομένα εισόδου δυο διανύσματα Χ και Υ (του ιδίου μεγέθους) και να δίνει σαν
. Πολυώνυμα m δεδομένα εξόδου τα b και m, έτσι ώστε η συνάρτηση = bx να προσαρμόζει τα δεδομένα. Να χρησιμοποιήσετε το m-file σας για τα πιο κάτω δεδομένα και να να κατασκευάσετε ένα γράφημα που να δείχνει τη συνάρτηση μαζί με τα δοθέντα σημεία (στο ίδιο γράφημα). Χ..9..7. 7. Υ.8..7 9.. Έστω τα δεδομένα: x.....7..9.9..9.79. (α) Να προσαρμόσετε τα πιο πάνω με πολυώνυμα βαθμού,,,, και. Για το καθένα, να κατασκευάσετε ένα γράφημα που να δείχνει το πολυώνυμο μαζί με τα σημεία (στο ίδιο γράφημα). Τι παρατηρείτε όταν το πολυώνυμο έχει βαθμό ; (β) Για κάθε πολυώνυμο παρεμβολής p i υπολογίσετε τις τιμές Υ i στα πιο πάνω σημεία καθώς και τη νόρμα του διανύσματος Υ i. Πως μεταβάλλεται η νόρμα αυτή με το βαθμό του πολυωνύμου παρεμβολής;
Γ. Γεωργίου & Χρ. Ξενοφώντος