Μαρία Λουκά Εργαστήριο Matlab Πολυώνυμα - Παρεμβολή Τμήμα Πληροφορικής και Τηλεπικοινωνιών.
Στη MATLAB τα πολυώνυμα αναπαριστώνται από πίνακες που περιέχουν τους συντελεστές τους σε φθίνουσα διάταξη. Για παράδειγμα το πολυώνυμο p(x)=x 2-3x+5 αναπαριστάται από τον πίνακα p = [1, -3, 5 ] Ενώ ο πίνακας q = [ 1, 0, 7, -1, 0 ] παριστάνει το πολυώνυμο q(x)=x 4 +7x 2 -x H εντολή length επιστρέφει το μήκος της μεγαλύτερης διάστασης ενός πίνακα X. Για διανύσματα, το μήκος είναι απλά το πλήθος των στοιχείων. Το μήκος ενός κενού πίνακα είναι το 0. Παράδειγμα 1: X = zeros(3,7); L = length(x)=7 Παράδειγμα 2: v = 5:10= 5 6 7 8 9 10, L = length(v)=6
Η r = roots(p) υπολογίζει όλες τις ρίζες ενός πολυωνύμου όπου p ο πίνακας που περιέχει τους συντελεστές του πολυωνύμου. Παράδειγμα 1: Για τη λύση της εξίσωσης 3x 2-2x-4=0, να δημιουργηθεί ένας πίνακας που να αναπαριστά το πολυώνυμο και στη συνέχεια να βρεθούν οι ρίζες του. Επομένως έχουμε: p = [3-2 -4]; % ο πίνακας r = roots(p) Απάντηση: Οι ρίζες του πολυωνύμου είναι οι: r = 1.5352-0.8685
Παράδειγμα 2: Για τη λύση της εξίσωσης x 4-1=0, να δημιουργηθεί ένας πίνακας που να αναπαριστά το πολυώνυμο και στη συνέχεια να βρεθούν οι ρίζες του. Επομένως έχουμε: p = [1 0 0 0-1];% ο πίνακας r = roots(p) Απάντηση: Οι ρίζες του πολυωνύμου είναι οι: r = -1.0000 + 0.0000i 0.0000 + 1.0000i 0.0000-1.0000i 1.0000 + 0.0000i
Μπορούμε όμως να κάνουμε και την αντίστροφη διαδικασία, δηλαδή να υπολογίσουμε τους συντελεστές ενός πολυωνύμου, του οποίου γνωρίζουμε μόνο τις ρίζες. Σε αυτήν την περίπτωση θα χρησιμοποιήσουμε την εντολή poly(r), όπου r ένας πίνακας που περιέχει τις ρίζες του πολυωνύμου που ψάχνουμε. Έστω για παράδειγμα ότι θέλουμε να βρούμε το πολυώνυμο που έχει για ρίζες τα x = 3 και x = 4. Θα δημιουργήσουμε πρώτα τον πίνακα με τις ρίζες αυτές, ο οποίος θα είναι ο: r = [3 4] ενώ στη συνέχεια θα δώσουμε την εντολή: p = poly(r) η οποία θα μου δώσει τους συντελεστές του πολυωνύμου με τις παραπάνω ρίζες p= 1-7 12 Το πολυώνυμο δηλαδή είναι το x 2-7x+12.
Επίσης με τη συνάρτηση poly μπορούμε να υπολογίσουμε τους συντελεστές του χαρακτηριστικού πολυωνύμου ενός πίνακα Α nxn Παράδειγμα: Έστω A = [1 2 3; 4 5 6; 7 8 0], τότε η p = poly(a) επιστρέφει το διάνυσμα 1.0000-6.0000-72.0000-27.0000, οι τιμές του οποίου είναι οι συντελεστές του χαρακτηριστικού πολυωνύμου det(a-λi)=0. Αν στη συνέχεια χρησιμοποιήσουμε την r=roots(p) θα υπολογίσουμε τις ρίζες του ανωτέρω πολυωνύμου, οι οποίες είναι οι 12.1229-5.7345-0.3884
Για να υπολογίσουμε τις τιμές ενός πολυωνύμου μπορούμε στη Matlab να χρησιμοποιήσουμε την εντολή polyval(p,x), όπου p ο πίνακας που περιέχει τους συντελεστές του πολυωνύμου που μας ενδιαφέρει, και x το σημείο ή τα σημεία για τα οποία θέλουμε να υπολογίσουμε την τιμή του πολυωνύμου. Έστω για παράδειγμα ότι θέλουμε να υπολογίσουμε την τιμή του πολυωνύμου y=3x 3-5x για x = 5. Καταρχήν θα πρέπει να δημιουργήσουμε τον πίνακα με τους συντελεστές του πολυωνύμου, ο οποίος θα είναι της μορφής: p = [3 0-5 0] αφού λείπουν οι όροι δεύτερης και μηδενικής τάξης. Για να υπολογίσουμε τελικά την τιμή που ζητάμε θα πρέπει να δώσουμε την εντολή: y = polyval(p,5) Tο αποτέλεσμα της εντολής αυτής είναι y=350.
Την εντολή polyval μπορούμε να τη χρησιμοποιήσουμε και στην περίπτωση που θέλουμε να υπολογίσουμε ταυτόχρονα τις τιμές ενός πολυωνύμου σε διάφορα σημεία. Έστω για παράδειγμα ότι θέλουμε να υπολογίσουμε τις τιμές του παραπάνω πολυωνύμου στα στοιχεία x=1, x=3, x=7 και x=15. Αρχικά, μπορούμε να εισάγουμε όλες τις τιμές που μας ενδιαφέρουν κατευθείαν στην εντολή y=polyval (p, [1, 3, 7, 15]) όπου τις τιμές που μας ενδιαφέρουν θα τις εισάγουμε μέσα σε αγκύλες. Το αποτέλεσμα θα είναι το: y= -2 66 994 10050 Εναλλακτικά μπορούμε να δημιουργήσουμε έναν πίνακα με τις τιμές που μας ενδιαφέρουν και να εισάγουμε αυτόν στην εντολή polyval, δηλ. x=[1,3, 7, 15] y=polyval(p,x) Το αποτέλεσμα θα είναι το ίδιο.
Η τελευταία αυτή εναλλακτική μας δυνατότητα μας βοηθάει προφανώς στην περίπτωση όπου θέλουμε να σχεδιάσουμε τη γραφική παράσταση ενός πολυωνύμου. Έστω για παράδειγμα ότι θέλουμε να σχεδιάσουμε τη γραφική παράσταση του παραπάνω πολυωνύμου, για τιμές του x από -50 μέχρι 50. Όπως έχουμε αναφέρει ήδη, για να σχεδιάσουμε τη γραφική παράσταση μιας συνάρτησης πρέπει να δώσουμε στο πρόγραμμα δυο πίνακες που να περιέχουν το πεδίο ορισμού (x) και το πεδίο τιμών (y) της. Αρχικά, λοιπόν πρέπει να δημιουργήσουμε έναν πίνακα που να περιέχει το πεδίο ορισμού που μας ενδιαφέρει. Αυτός θα είναι ένας πίνακας της μορφής: x =[-50:1:50] αν υποθέσουμε ότι επιλέγουμε για βήμα το 1. Στη συνέχεια με χρήση των εντολών polyval και plot έχουμε τη γραφική παράσταση.
Έχουμε λοιπόν: p=[3 0-5 0] x= [-50:1:50]; y=polyval(p,x); plot(x,y)
Μέθοδος ελαχίστων τετραγώνων Η εντολή p = polyfit(x,y,n) επιστρέφει κατά φθίνουσα διάταξη τους συντελεστές ενός πολυωνύμου p(x) βαθμού n όπως αυτοί προκύπτουν από την εφαρμογή της μεθόδου ελαχίστων τετραγώνων για τα δεδομένα y. Το μήκος του p είναι n+1. Το πολυώνυμο είναι το p(x)=p 1 x n +p 2 x n 1 +...+p n x+p n+1. Το πρώτο όρισμα x της συνάρτησης polyfit αναπαριστά τα δεδομένα στον άξονα x, το δεύτερο όρισμα y αναπαριστά τα δεδομένα στον άξονα y και τέλος το τρίτο όρισμα n δηλώνει τη τάξη του πολυωνύμου. Παράδειγμα 1: x= [0, 0.3, 0.8, 1.1, 1.6, 2.3] y= [0.5, 0.92, 1.14, 1.25, 1.25, 1.40] p1= polyfit(x,y,1); Αποτέλεσμα: p1= 0.3387 0.7323 Δηλ. y=0.3387*x+0.7323
Παράδειγμα 2: Για x, y του παραδείγματος 1, η p2= polyfit(x,y,2), δίνει αποτέλεσμα έναν πίνακα τριών στοιχείων, τους συντελεστές δηλ. ενός πολυωνύμου βαθμού 2. p2= -0.2113 0.8203 0.5872 Το πολυώνυμο δηλ. είναι το y= -0.2113*x 2 +0.8203*x+0.5872
Σχέση μεταξύ των συναρτήσεων polyfit και polyval Σε σχέση με το παράδειγμα 1 της polyfit έχουμε τα ακόλουθα παραδείγματα: Παράδειγμα 1α: x_interest=1.5; y_interest=polyval(p1, x_interest); Το αποτέλεσμα θα είναι το: y_interest=1.2404=0.3387*(1.5)+0.7323 Δηλαδή με τη χρήση της συνάρτησης polyval πήραμε την τιμή του πολυωνύμου p1 όταν x_interest=1.5.
Παράδειγμα 1β: Το διάνυσμα x_interest δημιουργείται σαν μια ακολουθία αριθμών x_interest=[0: 0.1: 3] δηλ. είναι το x_interest=0, 0.1, 0.2,.,3 και y_interest=polyval(p1,x_interest) δηλ. έχουμε το y_interest=0.3387*(x_interest)+0.7323 και το αποτέλεσμα θα είναι το y_interest= 0.7323, 0.7662, 0.8001,, 1.7484 Συμπέρασμα: Θα πάρουμε δηλαδή την τιμή του πολυωνύμου p1 για κάθε τιμή του x_interest. Η γραφική παράσταση που προκύπτει είναι η:
plot(x_interest, y_interest);
Σε σχέση με το παράδειγμα 2 της polyfit έχουμε τα ακόλουθα παραδείγματα: Παράδειγμα 2α: x_interest=1.5; y_interest=polyval(p2, x_interest); Το αποτέλεσμα θα είναι το: y_interest=1.3425=-0.2113*(1.5) 2 +0.8203*(1.5)+0.5874 Δηλαδή με τη χρήση της συνάρτησης polyval πήραμε την τιμή του πολυωνύμου p2 όταν x_interest=1.5.
Παράδειγμα 2β: Το διάνυσμα x_interest δημιουργείται σαν μια ακολουθία αριθμών x_interest=[0: 0.1: 3] δηλ. είναι το x_interest=0, 0.1, 0.2,.,3 και y_interest=polyval(p2,x_interest) δηλ. έχουμε το y_interest=-0.2113*(x_interest)2+0.8203*(x_interest)+0.5874 και το αποτέλεσμα θα είναι το y_interest= 0.5874, 0.6673, 0.7430,, 1.1469 Συμπέρασμα: Θα πάρουμε δηλαδή την τιμή του πολυωνύμου p2 για κάθε τιμή του x_interest. Η γραφική παράσταση που προκύπτει είναι η:
plot(x_interest, y_interest);
Για τον πολλαπλασιασμό μεταξύ πολυωνύμων θα χρησιμοποιήσουμε την εντολή conv(p1,p2), όπου p1 και p2 τα πολυώνυμα που θέλουμε να πολλαπλασιάσουμε, ενώ για τη διαίρεση μεταξύ πολυωνύμων θα χρησιμοποιήσουμε την εντολή deconv(p1,p2), όπου p1 το πολυώνυμο - διαιρετέος και p2 το πολυώνυμο - διαιρέτης. Τα ονόματα των παραπάνω εντολών προέρχονται από τις αγγλικές λέξεις convolution (συνέλιξη) και deconvolution (αποσυνέλιξη). Έστω για παράδειγμα ότι θέλουμε να πολλαπλασιάσουμε μεταξύ τους τα πολυώνυμα y=2x 2 +5x και y=3x 3 +6. Καταρχήν θα πρέπει να δημιουργήσουμε τους πίνακες με τους συντελεστές τους. Αυτοί θα είναι της μορφής: p1 = [2 5 0] και p2 = [3 0 0 6] Για τον πολλαπλασιασμό των δύο πολυωνύμων θα χρησιμοποιήσουμε τελικά την εντολή: w = conv(p1,p2) Tο αποτέλεσμα θα είναι:
w= 6 15 0 12 30 0 το οποίο αντιστοιχεί στο πολυώνυμο y=6x 5 +15x 4 +12x 2 +30x, το οποίο είναι και το γινόμενο των παραπάνω πολυωνύμων. Παράδειγμα 2: Έστω ότι θέλουμε να διαιρέσουμε το πολυώνυμο y=3x 2 +5x+1 με το πολυώνυμο y=4x+7. Καταρχήν θα δημιουργήσουμε κατά τα γνωστά τους πίνακες με τους συντελεστές τους, οι οποίοι θα είναι δύο πίνακες της μορφής: p1 = [3 5 1] και p2= [4 7] Για τη διαίρεση μεταξύ των δύο πολυωνύμων θα χρησιμοποιήσουμε την εντολή: [q,r] = deconv(p1,p2) Προσοχή: Στην περίπτωση της διαίρεσης πρέπει να χρησιμοποιήσουμε δύο πίνακες για να αποθηκεύσουμε το αποτέλεσμα, έναν για το πηλίκο της διαίρεσης και έναν για το υπόλοιπο αυτής.
Το αποτέλεσμα είναι: q= 0.7500-0.0625 r= 0 0 1.4375 δηλ. ο υπολογιστής μας επιστρέφει ως πηλίκο της διαίρεσης το πολυώνυμο y=0.75x-0.0625 και ως υπόλοιπο της το y = 1.4375.
Πεπερασμένες Διαφορές Υποθέτουμε ότι έχουμε ένα πίνακα τιμών μιας συνάρτησης f(x). Οι πρώτης τάξης προς τα εμπρός διαφορές στο σημείο x n ορίζονται από τις σχέσεις Δf n = f(x n+1 ) f(x n ) = f n+1 f n Στη συνέχεια δίνεται το script divdiff.m που υλοποιεί τον πίνακα των προς τα εμπρός διαφορών με δύο τρόπους: Παράδειγμα: X=[0 1 2 3]; % Τιμές εισόδου για το X Y=[1 2 9 28]; % Τιμές εισόδου για το Y n = length(x); D = zeros(n,n); % Αν ήθελα αρχικοποίηση με κενό, ώστε να μη φαίνονται % τα μηδενικά, θα έγραφα D=[]; D(:,1) = Y'; disp('d'); disp(d);
Πεπερασμένες Διαφορές α τρόπος for j=2:n, for k=j:n, D(k,j) = (D(k,j-1)-D(k-1,j-1)); disp('d'); disp(d); end end Αποτέλεσμα: 1 0 0 0 2 1 0 0 9 7 6 0 28 19 12 6
Πεπερασμένες Διαφορές β τρόπος for i=1:4 D(i,1)=X(i); D(i,2)=Y(i); end for j=3:8 for k=1:n-1 D(k,j) = (D(k+1,j-1)-D(k,j-1)); disp('d'); disp(d); end n=n-1; end Αποτέλεσμα 0 1 1 6 6 1 2 7 12 0 2 9 19 0 0 3 28 0 0 0
Πολυώνυμο παρεμβολής με διηρημένες διαφορές του Newton Μη ισαπέχοντα σημεία Στη συνέχεια δίνεται η συνάρτηση newpoly.m που υλοποιεί τη μέθοδο του πολυωνύμου παρεμβολής με διηρημένες διαφορές του Newton, και βρίσκει την προσεγγιστική τιμή της συνάρτησης f(x)=1+x 3, για x 0 =1.5. function [C,D] = newpoly(x,y) n = length(x); % Δημιουργία πίνακα διηρημένων διαφορών D = zeros(n,n); D(:,1) = Y'; for j=2:n, for k=j:n, D(k,j) = (D(k,j-1)-D(k-1,j-1))/(X(k)-X(k-j+1)); disp('x(k)-x(k-j+1)');disp(x(k)-x(k-j+1)); %το βήμα disp('d'); disp(d); end end
Πολυώνυμο παρεμβολής με διηρημένες διαφορές του Newton Μη ισαπέχοντα σημεία % Προσδιορισμός του πολυωνύμου C = D(n,n); for k=(n-1):-1:1, C = conv(c,poly(x(k))); m = length(c); C(m) = C(m) + D(k,k); disp('c'); disp(c); end a=(diag(d))'; % Υπολογισμός των a i % disp('a'); disp(a); xp=1.5; fp=a(1)+a(2)*xp+a(3)*xp*(xp-1)+a(4)*xp*(xp-1)*(xp-2); disp('fp');disp(fp);
Πολυώνυμο παρεμβολής με διηρημένες διαφορές του Newton Μη ισαπέχοντα σημεία Στη συνέχεια δίνεται το script σε MATLAB που καλεί τη συνάρτηση που υλοποιεί τη μέθοδο του πολυωνύμου παρεμβολής με τις διηρημένες διαφορές του Newton (newton_poly.m): X=[0 1 2 3]; % Τιμές εισόδου του X Y=[1 2 9 28]; % Τιμές εισόδου του Y c=newpoly(x,y);% Εύρεση πολυωνύμου με την παρεμβολή Newton xx=[-3:0.02: 3]; % πεδίο ορισμού του x yy=polyval(c,xx); % τιμή y για κάθε x που ανήκει στο [-3,3] clf plot(xx,yy,'b-',x,y,'*') % γραφική παράσταση πολυωνύμου
Πολυώνυμο παρεμβολής με διηρημένες διαφορές του Newton Μη ισαπέχοντα σημεία X(k)-X(k-j+1) 1 D 1 0 0 0 2 1 0 0 9 0 0 0 28 0 0 0 X(k)-X(k-j+1) 1 D 1 0 0 0 2 1 0 0 9 7 0 0 28 0 0 0 X(k)-X(k-j+1) 1 D 1 0 0 0 2 1 0 0 9 7 0 0 28 19 0 0 X(k)-X(k-j+1) 2 D 1 0 0 0 2 1 0 0 9 7 3 0 28 19 0 0
Πολυώνυμο παρεμβολής με διηρημένες διαφορές του Newton Μη ισαπέχοντα σημεία X(k)-X(k-j+1) 2 D 1 0 0 0 2 1 0 0 9 7 3 0 28 19 6 0 X(k)-X(k-j+1) 3 D 1 0 0 0 2 1 0 0 9 7 3 0 28 19 6 1 Απάντηση: Το πολυώνυμο έχει συντελεστές 1 0 0 1 δηλ. είναι το x 3 +1 Η προσεγγιστική τιμή του στο x 0 =1.5 είναι fp 4.3750
Πολυώνυμο παρεμβολής με διηρημένες διαφορές του Newton Μη ισαπέχοντα σημεία Και η γραφική του παράσταση στο [-3,3] είναι η
Πολυώνυμο παρεμβολής με διηρημένες διαφορές του Newton Μη ισαπέχοντα σημεία Αν X=[1 2 4 5]; Y=[0 2 12 20]; Τότε a 0 2 1 0 p(x)=x 2 -x p(1.5)=3.75 Και η γραφική του παράσταση στο [-5,5] είναι η διπλανή: