ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ - ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΑΡΙΘΜΗΤΙΚΗ ΑΝΑΛΥΣΗ, 3 Ο ΕΞΑΜΗΝΟ, 2010-2011 ΔΙΔΑΣΚΩΝ: Δρ Ιωάννης Αθ. Σταυράκης 3 η Σειρά Ασκήσεων 07.12.2010 Άσκηση 1. Δίνονται τα ακόλουθα ζεύγη τιμών: x 1,1 1,2 1,3 1,4 f(x ) 0,6415 0,6282 0,6097 0,5872 Να προσδιοριστεί η f(1,24) χρησιμοποιώντας τετραγωνική παρεμβολή με τις προς τα εμπρός ή τις προς τα πίσω διαφορές. Να γίνει η σύγκριση με το Mathematica. Σύμφωνα με την εκφώνηση ζητείται ο προσδιορισμός της τιμής της συνάρτησης f(x) για x = 1,24 χρησιμοποιώντας τετραγωνική παρεμβολή. Για τον προσδιορισμό του πολυώνυμο παρεμβολής 2 ου βαθμού είτε με τις προς τα εμπρός είτε με τις προς τα πίσω διαφορές απαιτούνται 3 σημεία παρεμβολής. Επομένως, ως σημεία παρεμβολής μπορούν να χρησιμοποιηθούν τα 3 πρώτα σημεία ή τα 3 τελευταία σημεία. Για τον προσδιορισμό του πολυωνύμου παρεμβολής 2 ου βαθμού (τετραγωνική παρεμβολή) με τις προς τα εμπρός διαφορές χρησιμοποιείται ο τύπος: όπου f(x) P (x) = f + s 1 f + s 2 f, s = x x h Για τον υπολογισμό των προς τα εμπρός διαφορών f, για k = 1,2, κατασκευάζεται ο παρακάτω πίνακας των προς τα εμπρός διαφορών. x f f f 1,1 0,6415-0,0133 1,2 0,6282-0,0052-0,0185 1,3 0,6097-0,004-0,0225 1,4 0,5872 Επιλέγοντας ως σημεία παρεμβολής τα 3 πρώτα, ισχύει ότι x = 1,1 και h = 0,1. Με βάση τον παραπάνω πίνακα προκύπτουν: f = 0,6415, f = 0,0133 και f = 0,0052.
Οπότε το πολυώνυμο παρεμβολής 2 ου βαθμού είναι ίσο με: P (x) = f + s 1 f + s 2 f = f + s f + 1 2 s(s 1) f = = 0,6415 + x 1,1 0,1 ( 0,0133) + 1 x 1,1 x 1,2 2 0,1 0,1 ( 0,0052) = = 0,6415 0,133(x 1,1) 0,26(x 1,1)(x 1,2) = = 0,6415 0,133x + 0,1463 0,26x + 0,598x 0,3432 = = 0,4446 + 0,465x 0,26x Στο Mathematica ο προσδιορισμός του πολυωνύμου παρεμβολής 2 ου βαθμού για τα 3 πρώτα ζεύγη τιμών γίνεται δίνοντας: Expand[InterpolatingPolynomial[{{1.1,0.6415},{1.2,0.6282},{1.3,0.6097}},x ]] και προκύπτει: 0.4446+0.465 x-0.26 x 2. Για x = 1,24 η συνάρτηση παίρνει την τιμή f(1,24) P (1,24) = 0,621424. Επιλέγοντας ως σημεία παρεμβολής τα 3 τελευταία, ισχύει ότι x = 1,2 και h = 0,1. Με βάση τον παραπάνω πίνακα προκύπτουν: f = 0,6282, f = 0,0185 και f = 0,004. Οπότε το πολυώνυμο παρεμβολής 2 ου βαθμού είναι ίσο με: P (x) = f + s 1 f + s 2 f = f + s f + 1 2 s(s 1) f = = 0,6282 + x 1,2 0,1 ( 0,0185) + 1 x 1,2 x 1,3 2 0,1 0,1 ( 0,004) = = 0,6282 0,185(x 1,2) 0,2(x 1,2)(x 1,3) = = 0,6282 0,185x + 0,222 0,2x + 0,5x 0,312 = = 0,5382 + 0,315x 0,2x Στο Mathematica ο προσδιορισμός του πολυωνύμου παρεμβολής 2 ου βαθμού για τα 3 τελευταία ζεύγη τιμών γίνεται δίνοντας: Expand[InterpolatingPolynomial[{{1.2,0.6282},{1.3,0.6097},{1.4,0.5872}},x] ] και προκύπτει: 0.5382+0.315 x-0.2 x 2.
Για x = 1,24 η συνάρτηση παίρνει την τιμή f(1,24) P (1,24) = 0,62128. Για τον προσδιορισμό του πολυωνύμου παρεμβολής 2 ου βαθμού (τετραγωνική παρεμβολή) με τις προς τα πίσω διαφορές χρησιμοποιείται ο τύπος: όπου f(x) P (x) = f s 1 f + s 2 f, s = x x h Για τον υπολογισμό των προς τα πίσω διαφορών f, για k = 1,2, κατασκευάζεται ο παρακάτω πίνακας των προς τα εμπρός διαφορών. x f f f 1,1 0,6415-0,0133 1,2 0,6282-0,0052-0,0185 1,3 0,6097-0,004-0,0225 1,4 0,5872 Επιλέγοντας ως σημεία παρεμβολής τα 3 πρώτα, ισχύει ότι x = 1,3 και h = 0,1. Με βάση τον παραπάνω πίνακα προκύπτουν: f = 0,6097, f = 0,0185 και f = 0,0052. Οπότε το πολυώνυμο παρεμβολής 2 ου βαθμού είναι ίσο με: P (x) = f s 1 f + s 2 f = f s f + 1 2 s(s 1) f = = 0,6097 1,3 x 0,1 ( 0,0185) + 1 1,3 x 1,2 x 2 0,1 0,1 ( 0,0052) = = 0,6097 + 0,185(1,3 x) 0,26(1,3 x)(1,2 x) = = 0,6097 + 0,2405 0,185x 0,4056 + 0,65x 0,26x = = 0,4446 + 0,465x 0,26x Στο Mathematica ο προσδιορισμός του πολυωνύμου παρεμβολής 2 ου βαθμού για τα 3 πρώτα ζεύγη τιμών γίνεται δίνοντας: Expand[InterpolatingPolynomial[{{1.1,0.6415},{1.2,0.6282},{1.3,0.6097}},x ]] και προκύπτει: 0.4446+0.465 x-0.26 x 2.
Για x = 1,24 η συνάρτηση παίρνει την τιμή f(1,24) P (1,24) = 0,621424. Επιλέγοντας ως σημεία παρεμβολής τα 3 τελευταία, ισχύει ότι x = 1,4 και h = 0,1. Με βάση τον παραπάνω πίνακα προκύπτουν: f = 0,5872, f = 0,0225 και f = 0,004. Οπότε το πολυώνυμο παρεμβολής 2 ου βαθμού είναι ίσο με: P (x) = f s 1 f + s 2 f = f s f + 1 2 s(s 1) f = = 0,5872 1,4 x 0,1 ( 0,0225) + 1 1,4 x 1,3 x 2 0,1 0,1 ( 0,004) = = 0,5872 + 0,225(1,4 x) 0,2(1,4 x)(1,3 x) = = 0,5872 + 0,315 0,225x 0,364 + 0,54x 0,2x = = 0,5382 + 0,315x 0,2x Στο Mathematica ο προσδιορισμός του πολυωνύμου παρεμβολής 2 ου βαθμού για τα 3 τελευταία ζεύγη τιμών γίνεται δίνοντας: Expand[InterpolatingPolynomial[{{1.2,0.6282},{1.3,0.6097},{1.4,0.5872}},x] ] και προκύπτει: 0.5382+0.315 x-0.2 x 2. Για x = 1,24 η συνάρτηση παίρνει την τιμή f(1,24) P (1,24) = 0,62128. Άσκηση 2. Για τα παρακάτω δεδομένα: x 0,55 0,80 1,95 3,60 5,75 8,40 f(x ) 1,3307 1,3570 1,4635 2,6217 9,2239 62,1446 Να γραφεί πρόγραμμα σε Fortran για τον υπολογισμό των f(1,60), f(2,53) και f(4,56) εφαρμόζοντας τις μεθόδους παρεμβολής: 1. Lagrange, 2. Newton και 3. Ελαχίστων Τετραγώνων για πολυώνυμο 3 ου βαθμού (η επίλυση του γραμμικού συστήματος να γίνει με τη μέθοδο LU ή τη μέθοδο Cholesky). Σε κάθε περίπτωση να γίνει η σύγκριση των αποτελεσμάτων με τις αντίστοιχες μεθόδους του Mathematica. 1. Το πολυώνυμο παρεμβολής Lagrange δίνεται από τη σχέση:
όπου n = 5. x x P (x) = f(x x x ) Παρακάτω φαίνεται ο πηγαίος κώδικας σε γλώσσα προγραμματισμού Fortran για την παρεμβολή Lagrange. Ο κώδικας γράφτηκε σε περιβάλλον linux (Ubuntu 10.10) και μεταγλωττίστηκε με τον compiler gfortran έκδοση 4.4.5. program lagrange implicit none integer n,m,i,j,k parameter (n=6,m=3) double precision x(n),f(n),xx(m),ff(m),s,p x(1)=0.55d0; x(2)=0.80d0; x(3)=1.95d0; x(4)=3.60d0; x(5)=5.75d0; x(6)=8.40d0; f(1)=1.3307d0 f(2)=1.3570d0 f(3)=1.4635d0 f(4)=2.6217d0 f(5)=9.2239d0 f(6)=62.1446d0 xx(1)=1.60d0 xx(2)=2.53d0 xx(3)=4.56d0 open(unit=10,file="lagrange.txt") do k=1,m s=0.0d0 do i=1,n p=1.0d0 do j=1,n if (j.ne.i) then p=p*(xx(k)-x(j))/(x(i)-x(j)) end if s=s+p*f(i) ff(k)=s write(10,*) 'f(',xx(k),' ) =',ff(k) close(10) stop end
Τα αποτελέσματα που προκύπτουν με την παρεμβολή Lagrange είναι τα εξής: f( 1.6000000000000001 ) = 1.3980677122837641 f( 2.5299999999999998 ) = 1.6935102387448990 f( 4.5599999999999996 ) = 4.3282832558943296 2. Το πολυώνυμο παρεμβολής Newton δίνεται από τη σχέση: P (x) = f[x ] + f[x, x ](x x ) + f[x, x, x ](x x )(x x ) + + f[x, x, x,, x ](x x )(x x ) (x x ) όπου n = 5. Παρακάτω φαίνεται ο πηγαίος κώδικας σε γλώσσα προγραμματισμού Fortran για την παρεμβολή Newton. Ο κώδικας γράφτηκε σε περιβάλλον linux (Ubuntu 10.10) και μεταγλωττίστηκε με τον compiler gfortran έκδοση 4.4.5. program newton implicit none integer n,m,i,j,k parameter (n=6,m=3) double precision x(n),f(n),xx(m),ff(m),a(n),s,p x(1)=0.55d0; x(2)=0.80d0; x(3)=1.95d0; x(4)=3.60d0; x(5)=5.75d0; x(6)=8.40d0; f(1)=1.3307d0 f(2)=1.3570d0 f(3)=1.4635d0 f(4)=2.6217d0 f(5)=9.2239d0 f(6)=62.1446d0 xx(1)=1.60d0 xx(2)=2.53d0 xx(3)=4.56d0 call coeff(n,x,f,a) open(unit=10,file="newton.txt") do k=1,m s=a(n) do i=n-1,1,-1 s=a(i)+(xx(k)-x(i))*s ff(k)=s write(10,*) 'f(',xx(k),' ) =',ff(k) close(10) stop end
Η υπορουτίνα coeff υπολογίζει τους συντελεστές του πολυωνύμου με την βοήθεια των διαιρεμένων διαφορών. subroutine coeff(n,x,f,a) implicit none integer n,i,j double precision x(n),f(n),a(n),divdif(n,n) do i=1,n divdif(i,1)=f(i) do j=2,n do i=j,n divdif(i,j)=(divdif(i,j-1)-divdif(i-1,j-1))/(x(i)-x(i-j+1)) do i=1,n a(i)=divdif(i,i) enddo return end Τα αποτελέσματα που προκύπτουν με την παρεμβολή Newton είναι τα εξής: f( 1.6000000000000001 ) = 1.3980677122837641 f( 2.5299999999999998 ) = 1.6935102387448990 f( 4.5599999999999996 ) = 4.3282832558943296 3. Η μέθοδος των Ελαχίστων Τετραγώνων προσδιορίζει ένα πολυώνυμο της μορφής: P (x) = a + a x + + a x, όπου οι συντελεστές a του πολυωνύμου προκύπτουν από την επίλυση του συστήματος: s s s s s s a u =, s s s a u όπου s = x και u = x f. Στην περίπτωση μας, ο βαθμός του πολυωνύμου είναι ίσος με 3 (n = 3) και το πλήθος των σημείων παρεμβολής 6 (m = 5). Παρακάτω φαίνεται ο πηγαίος κώδικας σε γλώσσα προγραμματισμού Fortran για τη μέθοδο των Ελαχίστων Τετραγώνων. Ο κώδικας γράφτηκε σε linux (Ubuntu 10.10) και μεταγλωττίστηκε με τον compiler gfortran έκδοση 4.4.5. a u
program squares implicit none integer n,m,nn,i,j,k parameter (n=6,m=3,nn=3) double precision x(n),f(n),xx(m),ff(m),a(nn+1),s x(1)=0.55d0; x(2)=0.80d0; x(3)=1.95d0; x(4)=3.60d0; x(5)=5.75d0; x(6)=8.40d0; f(1)=1.3307d0 f(2)=1.3570d0 f(3)=1.4635d0 f(4)=2.6217d0 f(5)=9.2239d0 f(6)=62.1446d0 xx(1)=1.60d0 xx(2)=2.53d0 xx(3)=4.56d0 call coeff(n,x,f,nn,a) open(unit=10,file="squares.txt") write(10,*) "Least Squares Method" write(10,*) "Polynomial degree is",nn write(10,*) write(10,*) "Polynomial Coefficients" do i=1,nn+1 write(10,*) 'a_',i-1,' =',a(i) write(10,*) do k=1,m s=a(1) do i=2,nn+1 s=s+a(i)*xx(k)**(i-1) ff(k)=s write(10,*) 'f(',xx(k),' ) =',ff(k) close(10) stop end Η παράμετρος nn δηλώνει τον βαθμό του πολυωνύμου. Στην υπορουτίνα coeff υπολογίζονται οι συντελεστές του πολυωνύμου. Η επίλυση του συστήματος γίνεται με την μέθοδο Cholesky, της οποίας ο κώδικας είναι ο ίδιος με εκείνον της 2 ης Σειράς Ασκήσεων και παραλείπεται. subroutine coeff(n,x,f,nn,a) implicit none integer n,nn,i,k,j,ipvt(nn+1),info double precision x(n),f(n),a(nn+1)
double precision s,sx(2*nn+1),u(nn+1),aa(nn+1,nn+1) do k=1,2*nn+1 s=0.0d0 do i=1,n s=s+x(i)**(k-1) sx(k)=s do k=1,nn+1 s=0.0d0 do i=1,n s=s+(x(i)**(k-1))*f(i) u(k)=s do i=1,nn+1 do j=1,nn+1 aa(i,j)=sx((i-1)+j) call choleskydecomp(nn+1,aa,ipvt,info) call choleskysolve(nn+1,aa,u,ipvt,info) do k=1,nn+1 a(k)=u(k) return end Τα αποτελέσματα που προκύπτουν για πολυώνυμο 3 ου βαθμού είναι: Least Squares Method Polynomial degree is 3 Polynomial Coefficients a_ 0 = -1.6818166947511497 a_ 1 = 5.9140718523616451 a_ 2 = -2.5960273838403212 a_ 3 = 0.33276389343325891 f( 1.6000000000000001 ) = 2.4978690738988889 f( 2.5299999999999998 ) = 2.0527440763569760 f( 4.5599999999999996 ) = 2.8578743262876340 Η σύγκριση των αποτελεσμάτων, και για την παρεμβολή Lagrange και για την παρεμβολή Newton, με το Mathematica γίνεται δίνοντας:
data={{0.55,1.3307},{0.80,1.3570},{1.95,1.4635},{3.60,2.6217},{5.75,9.223 9},{8.40,62.1446}}; Polyonymo[x_]=InterpolatingPolynomial[data,x]; N[Polyonymo[{1.60,2.53,4.56}]] Τα αποτελέσματα που προκύπτουν είναι: {1.39807,1.69351,4.32828}. Η σύγκριση των αποτελεσμάτων για τη μέθοδο των Ελαχίστων Τετραγώνων με το Mathematica γίνεται δίνοντας: data={{0.55,1.3307},{0.80,1.3570},{1.95,1.4635},{3.60,2.6217},{5.75,9.223 9},{8.40,62.1446}}; PSquares3[x_]=Fit[data,{1,x,x 2,x 3 },x]; N[PSquares3[{1.60,2.53,4.56}]] και προκύπτουν τα αποτελέσματα: {2.49787,2.05274,2.85787}.