ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ ΑΡΙΘΜΗΤΙΚΗ ΑΝΑΛΥΣΗ, 3 Ο ΕΞΑΜΗΝΟ, 2008-2009 ΔΙΔΑΣΚΩΝ: Δρ Ιωάννης Αθ. Σταυράκης 07.01.2009 Δίνονται τα ακόλουθα ζεύγη τιμών: Να προσδιοριστεί πολυώνυμο παρεμβολής 4 ου βαθμού: με τη χρήση του Mathematica,! με τις προς τα εμπρός διαφορές και " με τις προς τα πίσω διαφορές. Στο Mathematica ο προσδιορισμός του πολυωνύμου παρεμβολής 4 ου βαθμού για τα δοθέντα ζεύγη τιμών γίνεται δίνοντας: InterpolatingPolynomial[{{1,2},{2,5},{3,10},{4,17},{5,26}},x] και προκύπτει: 1+x 2.! Για τον προσδιορισμό του πολυωνύμου παρεμβολής με τις προς τα εμπρός διαφορές χρησιμοποιείται ο τύπος: όπου, με Συνεπώς, με βάση τα παραπάνω προκύπτει: και. και το πολυώνυμο παρεμβολής παίρνει τη μορφή: Για τον υπολογισμό των προς τα εμπρός διαφορών, για, κατασκευάζεται ο πίνακας των προς τα εμπρός διαφορών..
1 2 3 2 5 2 5 0 3 10 2 0 7 0 4 17 2 9 5 26 Με βάση τον παραπάνω πίνακα προκύπτουν:,, και. Οπότε το πολυώνυμο παρεμβολής 4 ου βαθμού είναι ίσο με: " Για τον προσδιορισμό του πολυωνύμου παρεμβολής με τις προς τα πίσω διαφορές χρησιμοποιείται ο τύπος: όπου, με Συνεπώς, με βάση τα παραπάνω προκύπτει: και. και το πολυώνυμο παρεμβολής παίρνει τη μορφή: Για τον υπολογισμό των προς τα πίσω διαφορών, για, κατασκευάζεται ο πίνακας των προς τα πίσω διαφορών..
1 2 3 2 5 2 5 0 3 10 2 0 7 0 4 17 2 9 5 26 Με βάση τον παραπάνω πίνακα προκύπτουν:,, και. Οπότε το πολυώνυμο παρεμβολής 4 ου βαθμού είναι ίσο με: Για τα παρακάτω δεδομένα: Να γραφτεί πρόγραμμα σε Fortran για τον υπολογισμό των και εφαρμόζοντας τις μεθόδους παρεμβολής: Lagrange, Newton και " Ελαχίστων Τετραγώνων. Σε κάθε περίπτωση να γίνει η σύγκριση των αποτελεσμάτων με τις αντίστοιχες μεθόδους του Mathematica. Το πολυώνυμο παρεμβολής Lagrange δίνεται από τη σχέση: όπου.
Παρακάτω φαίνεται ο πηγαίος κώδικας σε γλώσσα προγραμματισμού Fortran για την παρεμβολή Lagrange. Ο κώδικας γράφτηκε σε περιβάλλον Mandrake Linux 10.1 και μεταγλωττίστηκε με τον compiler g77 έκδοση 3.4.1. program lagrange implicit none integer n,m,i,j,k parameter (n=11,m=3) double precision x(n),f(n),xx(m),ff(m),s,p x(1)=0.0d0; f(1)=16.0d0 x(2)=14.0d0; f(2)=19.0d0 x(3)=27.0d0; f(3)=36.0d0 x(4)=33.0d0; f(4)=48.0d0 x(5)=41.0d0; f(5)=53.0d0 x(6)=48.0d0; f(6)=90.0d0 x(7)=62.0d0; f(7)=119.0d0 x(8)=74.0d0; f(8)=120.0d0 x(9)=89.0d0; f(9)=96.0d0 x(10)=99.0d0; f(10)=114.0d0 x(11)=114.0d0; f(11)=36.0d0 xx(1)=7.0d0 xx(2)=57.0d0 xx(3)=107.0d0 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( 7. ) = 431.316261 f( 57. ) = 125.496192 f( 107. ) = 860.844413! Το πολυώνυμο παρεμβολής Newton δίνεται από τη σχέση: όπου. Παρακάτω φαίνεται ο πηγαίος κώδικας σε γλώσσα προγραμματισμού Fortran για την παρεμβολή Newton. Ο κώδικας γράφτηκε σε περιβάλλον Mandrake Linux 10.1 και μεταγλωττίστηκε με τον compiler g77 έκδοση 3.4.1. program newton implicit none integer n,m,i,j,k parameter (n=11,m=3) double precision x(n),f(n),xx(m),ff(m),a(n),s,p x(1)=0.0d0; f(1)=16.0d0 x(2)=14.0d0; f(2)=19.0d0 x(3)=27.0d0; f(3)=36.0d0 x(4)=33.0d0; f(4)=48.0d0 x(5)=41.0d0; f(5)=53.0d0 x(6)=48.0d0; f(6)=90.0d0 x(7)=62.0d0; f(7)=119.0d0 x(8)=74.0d0; f(8)=120.0d0 x(9)=89.0d0; f(9)=96.0d0 x(10)=99.0d0; f(10)=114.0d0 x(11)=114.0d0; f(11)=36.0d0 xx(1)=7.0d0 xx(2)=57.0d0 xx(3)=107.0d0 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( 7. ) = 431.316261 f( 57. ) = 125.496192 f( 107. ) = 860.844413 Η σύγκριση των αποτελεσμάτων, και για την παρεμβολή Lagrange και για την παρεμβολή Newton, με το Mathematica γίνεται δίνοντας: data={{0,16},{14,19},{27,36},{33,48},{41,53},{48,90},{62,119},{74,120}, {89,96},{99,114},{114,36}}; Polyonymo[x_]=InterpolatingPolynomial[data,x]; N[Polyonymo[{7,57,107}]] Τα αποτελέσματα που προκύπτουν είναι: {431.316,125.496,860.844}.
" Η μέθοδος των Ελαχίστων Τετραγώνων προσδιορίζει ένα πολυώνυμο της μορφής:, όπου οι συντελεστές του πολυωνύμου προκύπτουν από την επίλυση του συστήματος:, όπου και. Στην περίπτωση μας, ο βαθμός του πολυωνύμου είναι ίσος με 1 ( ) και το πλήθος των σημείων παρεμβολής 11 ( ). Παρακάτω φαίνεται ο πηγαίος κώδικας σε γλώσσα προγραμματισμού Fortran για τη μέθοδο των Ελαχίστων Τετραγώνων. Ο κώδικας γράφτηκε σε περιβάλλον Mandrake Linux 10.1 και μεταγλωττίστηκε με τον compiler g77 έκδοση 3.4.1. program squares implicit none integer n,m,nn,i,j,k parameter (n=11,m=3,nn=1) double precision x(n),f(n),xx(m),ff(m),a(nn+1),s x(1)=0.0d0; f(1)=16.0d0 x(2)=14.0d0; f(2)=19.0d0 x(3)=27.0d0; f(3)=36.0d0 x(4)=33.0d0; f(4)=48.0d0 x(5)=41.0d0; f(5)=53.0d0 x(6)=48.0d0; f(6)=90.0d0 x(7)=62.0d0; f(7)=119.0d0 x(8)=74.0d0; f(8)=120.0d0 x(9)=89.0d0; f(9)=96.0d0 x(10)=99.0d0; f(10)=114.0d0 x(11)=114.0d0; f(11)=36.0d0 xx(1)=7.0d0 xx(2)=57.0d0 xx(3)=107.0d0 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 υπολογίζονται οι συντελεστές του πολυωνύμου. Η επίλυση του συστήματος γίνεται με την μέθοδο Gauss με μερική οδήγηση, της οποίας ο κώδικας είναι ο ίδιος με εκείνον της 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 gaussdecomp(nn+1,aa,ipvt,info) call gausssolve(nn+1,aa,u,ipvt,info)
do k=1,nn+1 a(k)=u(k) return end Τα αποτελέσματα που προκύπτουν για πολυώνυμου 1 ου βαθμού είναι: Least Squares Method Polynomial degree is 1 Polynomial Coefficients a_ 0 = 31.9265871 a_ 1 = 0.658581601 f( 7. ) = 36.5366583 f( 57. ) = 69.4657383 f( 107. ) = 102.394818 Θέτοντας την τιμή 2 στην παράμερο nn, προκύπτουν τα αποτελέσματα για πολυώνυμο 2 ου βαθμού: Least Squares Method Polynomial degree is 2 Polynomial Coefficients a_ 0 = -12.101508 a_ 1 = 3.05660143 a_ 2 = -0.0207854741 f( 7. ) = 8.27621379 f( 57. ) = 94.5927681 f( 107. ) = 76.9819521 Τέλος, θέτοντας την τιμή 3 στην παράμερο nn, προκύπτουν τα αποτελέσματα για πολυώνυμο 3 ου βαθμού: Least Squares Method Polynomial degree is 3 Polynomial Coefficients a_ 0 = 14.9691522 a_ 1 = -0.529600782 a_ 2 = 0.0635634659 a_ 3 = -0.000501614907 f( 7. ) = 14.2045026 f( 57. ) = 98.4040389 f( 107. ) = 71.5401591
Η σύγκριση των αποτελεσμάτων για τη μέθοδο των Ελαχίστων Τετραγώνων με το Mathematica γίνεται δίνοντας: data={{0,16},{14,19},{27,36},{33,48},{41,53},{48,90},{62,119},{74,120}, {89,96},{99,114},{114,36}}; PSquares1[x_]=Fit[data,{1,x},x]; N[PSquares1[{7,57,107}]] Τα αποτελέσματα που προκύπτουν για πολυώνυμο 1 ου βαθμού είναι: {36.5367,69.4657,102.395}. Για την περίπτωση πολυωνύμου 2 ου βαθμού: PSquares2[x_]=Fit[data,{1,x,x 2 },x]; N[PSquares2[{7,57,107}]] και προκύπτουν τα αποτελέσματα: {8.27621,94.5928,76.982}. Τέλος, για την περίπτωση πολυωνύμου 3 ου βαθμού: PSquares3[x_]=Fit[data,{1,x,x 2,x 3 },x]; N[PSquares3[{7,57,107}]] και προκύπτουν τα αποτελέσματα: {14.2045,98.404,71.5402}.