Υπολογιστικά Mαθηματικά II Ζαφειράκογλου Απόστολος 1 Άσκηση Να υπολογιστεί με τη μέθοδο Monte Carlo το ολοκλήρωμα : I = ˆ1 dx 1 ˆ1 ˆ1 dx 2... (x 1 + x 2 + x 3 + x 4 + x 5 + x 6 + x 7 + x 8 + x 9 + x 1 ) dx 1 Στόχος της άσκησης είναι η εκτίμηση της τιμής του ολοκληρώματος με δύο τρόπους. Τόσο με τη μέθοδο Monte Carlo, όσο και με τη μέθοδο του τραπεζίου, καθώς και η σύγκριση των δύο μεθόδων. Ο αλγόριθμος που αναπτύχθηκε για το ολοκλήρωμα είναι ο ακόλουθος: 1 #include <iostream> 2 #include <cmath> 3 #include <cstdlib> 4 #include <fstream> 5 #include <ctime> 6 7 using namespace std; 8 9 double myrand(double fmin, double fmax) 1 { 11 double f = (double)rand() / RAND_MAX; 12 return fmin + f * (fmax fmin); 13 //return (rand()%1)+1; //random between 1,1 14 //return ((double) rand() / (RAND_MAX)); //random between,1 15 } 16 1
ΠΜΣ Υπολογιστικη ς Φυσικη ς 1 Άσκηση 17 double myfunc(double x1, double x2, double x3, double x4, double x5, double x6, double x7, double x8, double x9, double x1) 18 { 19 return (x1+x2+x3+x4+x5+x6+x7+x8+x9+x1)*(x1+x2+x3+x4+x5+x6+ x7+x8+x9+x1); 2 } 21 22 int main() 23 { 24 int N=1,i=; 25 double intgr=,thisx1,thisx2,thisx3,thisx4,thisx5,thisx6, thisx7,thisx8,thisx9,thisx1; 26 while (N<=1) 27 { 28 while (i<=n) 29 { 3 thisx1=myrand(,1);thisx2=myrand(,1);thisx3=myrand (,1);thisx4=myrand(,1);thisx5=myrand(,1);thisx6 =myrand(,1); 31 thisx7=myrand(,1);thisx8=myrand(,1);thisx9=myrand (,1);thisx1=myrand(,1); 32 33 intgr+=myfunc(thisx1,thisx2,thisx3,thisx4,thisx5, thisx6,thisx7,thisx8,thisx9,thisx1); 34 35 i++; 36 } 37 cout <<"The estimated value: "<< intgr/n<<" for N="<<N<<endl ; 38 N*=1; 39 } 4 return ; 41 } Το πρόγραμμα κατά την εκτέλεση δίνει το ακόλουθο output: 2
ΠΜΣ Υπολογιστικη ς Φυσικη ς 1 Άσκηση Διάγραμμα 1.1 N I est 1 34.4178 1 26.8935 1 25.5794 1 25.814 1 25.837 Πίνακας 1: Πίνακας εκτίμησης της τιμής του ολοκληρώματος σε σχέση με το N Πίνακας 2 Το ίδιο πρόβλημα με τη χρήση της γενικευμένης μεθόδου του τραπεζίου, παρουσιάζεται στον παρακάτω κώδικα: 3
ΠΜΣ Υπολογιστικη ς Φυσικη ς 1 Άσκηση 1 #include <iostream> 2 #include <cmath> 3 4 using namespace std; 5 6 double myfunc(double x1,double x2,double x3,double x4,double x5, double x6,double x7,double x8,double x9,double x1) 7 { 8 return (x1+x2+x3+x4+x5+x6+x7+x8+x9+x1)*(x1+x2+x3+x4+x5+x6+ x7+x8+x9+x1); 9 } 1 11 int main() 12 { 13 double result=; 14 double i1=,i2=,i3=,i4=,i5=,i6=,i7=,i8=,i9=,i1=,n =1,h=1/7; 15 while(i1<=n) 16 { 17 i2=; 18 while(i2<=n) 19 { 2 i3=; 21 while(i3<=n) 22 { 23 i4=; 24 while(i4<=n) 25 { 26 i5=; 27 while(i5<=n) 28 { 29 i6=; 3 while(i6<=n) 31 { 32 i7=; 33 while(i7<=n) 34 { 35 i8=; 36 while(i8<=n) 37 { 38 i9=; 39 while(i9<=n) 4 { 41 i1=; 4
ΠΜΣ Υπολογιστικη ς Φυσικη ς 1 Άσκηση 42 while(i1<=n) 43 { 44 result+=myfunc(i1,i2,i3,i4, i5,i6,i7,i8,i9,i1)*pow(h,1); 45 i1+=h; 46 } 47 i9+=h; 48 } 49 i8+=h; 5 } 51 i7+=h; 52 } 53 i6+=h; 54 } 55 i5+=h; 56 } 57 i4+=h; 58 } 59 i3+=h; 6 } 61 i2+=h; 62 } 63 i1+=h; 64 } 65 66 67 cout << result <<endl; 68 69 return ; 7 } Σχόλια: Συγκρίνοντας τις δύο παραπάνω μεθόδους, μπορούμε αβίαστα να καταλήξουμε στο ότι η μέθοδος εκτίμησης της τιμής του ολοκληρώματος Monte Carlo, υπερτερεί της αριθμητικής ολοκλήρωσης για τους ακόλουθους λόγους: i. Χρόνος εκτέλεσης: Πέραν του ότι η μέθοδος Monte Carlo συγκλίνει εμφανώς ταχύτερα, ο χρόνος εκτέλεσης του προγράμματος αυξάνεται γραμμικά με την αύξηση του πλήθος των τυχαίων σημείων. Αντίθετα η δεύτερη μέθοδος, αλλάζει γεωμετρικά το χρόνο εκτέλεσης σε κάθε αλλαγή του βήματος. Παρ ότι η μέθοδος αυτή είναι καλύτερη για μία διάσταση, όσο οι διαστάσεις αυξάνονται, τόσο πιο ασύμφορη γίνεται προγραμματιστικά. 5
ii. Σφάλμα: Η μέθοδος Monte Carlo σε συγκρίσιμο αριθμό σημείων, δίνει μικρότερο σφάλμα σε σχέση με τη μέθοδο του τραπεζίου. iii. Προγραμματιστική απλότητα: Ένα ακόμη μεγάλο προτέρημα είναι η προγραμματιστική απλότητα κατά τη δημιουργία του κώδικα. Είναι ευκολότερο να γίνει λάθος κατά τη συγγραφή του κώδικα της ολοκλήρωσης τραπεζίου, εξ αιτίας των embeded loops, και είναι σαφώς δυσκολότερη η γενίκευση του κώδικα για χρήση του σε άλλα προβλήματα (πχ πιο πολλών διαστάσεων). 2 Άσκηση Να υπολογιστεί η τιμή του ολοκληρώματος: όπου g(x) = x, x 2, x 3 ˆ I = g(x) e x dx Το πρόβλημα αυτής της άσκησης είναι η μορφή του ολοκληρώματος. Προφανώς πρέπει με κάποια κατάλληλη αλλαγή μεταβλητής να έρθει στη μορφή 1 () dx. Η ακόλουθη μέθοδος κάνει αυτό το μετασχηματισμό: I = g(x) e x dx = 1 g(x) e x dx + 1 g(x) e x dx Το δεύτερο ολοκλήρωμα με αλλαγή μεταβλητής: y = 1, παίρνει τη μορφή: x ˆ 1 g(x) e x dx = y2 y 1 = 1 g ( 1 y = ( ) 1 g y ) e y 1 1 g ( 1 y ) ( ) e y 1 d 1 y ( 1y 2 ) dy ( e 1 y y 2 ) dy Οπότε τελικά: 6
I = = g(x) e x dx 1 g(x) e x + = 1 g(x) e x + 1 = 1 ( g(x) e x + g 1 g(x) e x dx ( ) ( ) 1 g e y 1 dy y y 2 ( ) 1 ( ) ) e x 1 dx x x 2 Τα διαγράμμα των συναρτήσεων πρίν το μετασχηματισμό, δείχνουν το ζητούμενο εμβαδό. Διάγραμμα 2.1: g(x) = x Διάγραμμα 2.2: g(x) = x 2 Διάγραμμα 2.3: g(x) = x 3 Το ολοκλήρωμα πλέον έχει μετασχηματιστεί σε μία ολοκληρώσιμη μορφή για 7
τη μέθοδο Monte Carlo. Ο κώδικας που αναπτύχθηκε είναι ο ακόλουθος: 1 #include <iostream> 2 #include <cmath> 3 #include <cstdlib> 4 #include <fstream> 5 #include <ctime> 6 7 using namespace std; 8 9 1 double myrand(double fmin, double fmax) 11 { 12 double f = (double)rand() / RAND_MAX; 13 return fmin + f * (fmax fmin); 14 } 15 16 double g(double x) 17 { 18 //return x*x*x; //gia g(x)=x^3 19 return x*x*x; 2 } 21 22 double myfunc(double x) 23 { 24 // return g(x)/exp(x) + 1/(x*x*x*exp(1/x)); 25 return g(x)/exp(x)+g(1/x)/(x*x*exp(1/x)); 26 } 27 28 29 int main() 3 { 31 int i=,n=1;double result=,thisx=; 32 while(i<=n) 33 { 34 thisx=myrand(,1); 35 result+=myfunc(thisx)/n; 36 i++; 37 } 38 cout <<"The estimated value: "<<result; 39 return ; 4 41 } Αν στο παραπάνω κώδικα αλλάξουμε την μορφή της g(x) όπως στο comment 8
παίρνουμε την τιμή του ολοκληρώματος για τις διάφορες g(x). Διάγραμμα 2.4 Διάγραμμα 2.5 9
Διάγραμμα 2.6 Το ζητούμενο εμβαδό που υπολογίζεται φαίνεται στις ακόλουθες γραφικές παραστάσεις. Διάγραμμα 2.7 Διάγραμμα 2.8 1
Διάγραμμα 2.9 Ολοκλήρωμα Πραγματική Τιμή Monte Carlo x e x dx 1 1.137 x2 e x dx 2 2.619 x3 e x dx 6 6.221 Πίνακας 3: Πίνακας τιμών ολοκληρωμάτων και εκτιμήσεων 11