Αριθμητικοί αλγόριθμοι Υπολογισμός μέσω διαδοχικών προσεγγίσεων Κάνουμε μια πρώτη προσέγγιση για την απάντηση Χρησιμοποιούμε την προηγούμενη εκτίμηση για να παράγουμε μια καλύτερη Τερματίζουμε αν η εκτίμηση είναι αρκετά κοντά στην πραγματική τιμή
Υπολογισμός της τετραγωνικής ρίζας με τη μέθοδο Newton 1.Άρχισε κάνοντας μια αυθαίρετη εκτίμηση, g (guess) για την τετραγωνική ρίζα 2.Αν η εκτίμηση είναι αρκετά κοντά στην πραγματική τετραγωνική ρίζα, ο αλγόριθμος τερματίζει 3.Διαφορετικά, κάνε νέα εκτίμηση βρίσκοντας τη μέση τιμή του g και του x/g, όπου x ο αριθμός του οποίου ζητείται ο υπολογισμός της ρίζας 4.Αποθήκευσε τη νέα εκτίμηση στη g και επανάλαβε τη διαδικασία από το Βήμα 2.
Μέθοδος Newton (1) #define Epsilon 0.0000001 double Sqrt(double x) { double g; if (x == 0) return (0); if (x < 0) Error("Sqrt called with negative argument %g", x); g = x; while (fabs(x- g * g) >= Epsilon) { g = (g + x / g) / 2; return (g);
Μέθοδος Newton (2) double Sqrt(double x) { double g; if (x == 0) return (0); if (x < 0) Error("Sqrt called with negative argument %g", x); g = x; while (!ApproximatelyEqual(x, g * g)) { g = (g + x / g) / 2; return (g);
Σύγκριση x y min x, y Epsilon bool ApproximatelyEqual(double x, double y) { double num, den; num = fabs(x - y); den = MinF(fabs(x), fabs(y)); if (num + den == num) return (x == y); return (num / den < Epsilon);
Εύρεση του μικρότερου δύο αριθμών double MinF(double x, double y) { if (x < y) { return (x); else { return (y);
Η σειρά του Ζήνωνα 1 i=1 2 = 1 i 2 1 4 1 8 1 16 1 32 1 64 1 128 Ο υπολογισμός γίνεται σε ένα βρόχο while όπου sum = sum + term term /= 2 και αρχικά sum = 0.0 term = 0.5
Τερματισμός των επαναλήψεων Η while έχει την εξής μορφή while (συνθήκη) { sum += term; term /= 2; Η συνθήκη για τον τερματισμό είναι ο όρος (term) που προστίθεται στο sum να είναι αμελητέα μικρός sum == sum + term Εναλλακτικά: θέτουμε term <= 0.00000001
Το πρόγραμμα υπολογισμού της σειράς #include <stdio.h> #include "genlib.h" main() { double sum, term; Άσκηση: Γράψτε μια συνάρτηση για τον υπολογισμό της σειράς. sum = 0.0; term = 0.5; while (sum!= sum + term) { sum += term; term /= 2; printf("the sum of Zeno's series is %g\n", sum);
Υπολογισμός του αναπτύγματος Taylor Εφαρμόζουμε τον τύπο του αναπτύγματος Taylor f x = i =0 στη συνάρτηση f n a x a n n! 1 2 f x = x και για a = 1
Προκύπτει η σειρά x=1 1 2 x 1 1 4 coeff xpower factorial x 1 2 3 2! 8 x 1 3 3! 15 16 x 1 4 4! coef = 1 2 i 1 xpower= x 1 i factorial = i 1!
Υπολογισμός των όρων της σειράς Σε κάθε επανάληψη, i coeff *= (0.5 - i); xpower *= (x - 1); factorial *= (i + 1); term = coeff * xpower / factorial;
Η συναρτηση TSquare() double TSqrt(double x) { double sum, factorial, coeff, term, xpower; int i; factorial = coeff = xpower = 1; sum = 0; term = 1; for (i = 0; sum!= sum + term; i++) { sum += term; coeff *= (0.5 - i); xpower *= (x - 1); factorial *= (i + 1); term = coeff * xpower / factorial; return (sum);
Περιοχή σύγκλισης Ο τύπος της σειράς απαιτεί το x να βρίσκεται στο διάστημα 0 x 2 Για οποιοδήποτε πραγματικό αριθμό y έξω από το παραπάνω διάστημα ισχύει y=x 4 k, 0 x 2, k N Τότε y= 4 κ x= 4 κ x=2 κ x
Υπολογισμός ρίζας κάθε αριθμού με σειρά Taylor double Sqrt(double x) { double result, correction; if (x == 0) return (0); if (x < 0) Error("Sqrt called with negative argument %g", x); correction = 1; while (x >= 2) { x /= 4; correction *= 2; return (TSqrt(x) * correction);
Άσκηση 8, σελ. 267 Υπολογισμός της σταθεράς π σύμφωνα με την παρακάτω σειρά π 6 1 2 1 2 1 3 1 2 3 1 2 3 4 1 5 1 2 5 1 2 3 4 5 6 1 7 1 2 7
Λύση #include <stdio.h> main() { double term; double sum; int i; term = 0.5; sum = 0.5; for (i = 3; sum!= sum + term; i += 2) { term *=.25 ; term *= (i - 2.0) / i; /* SOS */ term *= (i - 2.0) / (i - 1.0); sum = sum + term; printf("%g\n", sum * 6.0);
Τύποι ακεραίων Ακέραιοι int τουλάχιστον 2 bytes (32767) long short Για παράδειγμα: 2 bytes στην Turbo C και 4 bytes στον compiler gcc(x) του εργαστηρίου Μη προσημασμένοι ακέραιοι unsigned unsigned int unsigned long unsigned short
Τύποι αριθμών κινητής υποδιαστολής double float
Μορφοποίηση με την printf Ενότητα 3.5 του βιβλίου. %d ακέραιος δεκαδικός %f αριθμός κινητής υποδιαστολής %e και %E εκθετικός αριθμός %g γενική μορφή για πραγματικούς αριθμούς, χρησιμοποιείται η πιο σύντομη από τις %f και %e. %s Αλφαριθμητικό %% Σύμβολο ποσοστού (!).
Επιπλέον μορφοποιήσεις %.5 f αριθμός κινητής υποδιαστολής με 5 δεκαδικά ψηφία %-s Αλφαριθμητικό με αριστερή στοίχιση %-14s Αλφαριθμητικό με αριστερή στοίχιση, πλάτος δεκατεσσάρων χαρακτήρων %-14.14s Αλφαριθμητικό με αριστερή στοίχιση, πλάτος δεκατεσσάρων χαρακτήρων και αποκοπή των επιπλέον χαρακτήρων Πειραματιστείτε!