Οδηγός Μελέτης - Εισαγωγή στον Προγραμματισμό

Α6.13 · Υπολογισμός αθροίσματος σειράς

Εργαστήριο 3, Άσκηση 1 · Δυσκολία ★★☆ · programming · Κεφάλαια: 6, 3

Σε αυτήν την άσκηση, θα γράψουμε ένα πρόγραμμα seq.c το οποίο θα υπολογίζει διάφορα αθροίσματα σειράς. Για κάθε ένα από αυτά, θα φτιάχνουμε μια διαφορετική συνάρτηση υπολογισμού.

1.1 Γράψτε μια συνάρτηση sum που να υπολογίζει το άθροισμα της σειράς:

\[\sum_{i=1}^{100} i\]

και να το εκτυπώνει στην οθόνη. Να χρησιμοποιηθεί η δομή επανάληψης while.

1.2 Γράψτε μια συνάρτηση basel που να υπολογίζει το άθροισμα της σειράς:

\[\sum_{i=1}^{100} \frac{1}{i^2}\]

και να το εκτυπώνει στην οθόνη. Να χρησιμοποιηθεί η δομή επανάληψης for.

Τι συμβαίνει αν αυξήσετε τους όρους; Ρίξτε μια ματιά στο Basel Theorem και ελέγξτε αν τα αποτελέσματά σας συμφωνούν με τα μαθηματικά.

Υπόδειξη: Χρησιμοποιήστε μία ενδιάμεση μεταβλητή για να αποθηκεύετε προσωρινά τον τρέχοντα όρο της σειράς.

1.3 Γράψτε μια συνάρτηση pi_approx που να προσεγγίζει το \(\pi\) χρησιμοποιώντας την έκφραση:

\[\pi = \sqrt{6 \cdot \sum_{i=1}^\infty \frac{1}{i^2}}\]

χρησιμοποιώντας τους 100 πρώτους όρους της σειράς και να τυπώνει το αποτέλεσμα. Να χρησιμοποιηθεί η δομή επανάληψης do...while. Για την υλοποίηση θα χρειαστείτε την συνάρτηση sqrt (square root).

double sqrt(double)

Απαιτείται η ενσωμάτωση του αρχείου επικεφαλίδας math.h.

Επιστρέφει την τετραγωνική ρίζα του αριθμού που δέχεται σαν όρισμα.

Στην μεταγλώττιση με τον gcc απαιτείται και η επιλογή -lm για να συμπεριληφθεί η μαθηματική βιβλιοθήκη.

1.3.1 Τροποποίηση της pi_approx μέχρι όριο ακρίβειας \(10^{-15}\).

Παρατηρήστε ότι οι όροι που προστίθενται στην σειρά γίνονται ολοένα και πιο μικροί, με αποτέλεσμα από ένα σημείο και μετά να είναι αρκούντως μικροί για να μην επηρεάζουν το αποτέλεσμα, αφού χρησιμοποιούμε αριθμητική πεπερασμένης ακρίβειας. Αλλάξτε το κριτήριο τερματισμού του υπολογισμού, ώστε ο υπολογισμός να σταματάει όταν ο τρέχων όρος που προστίθεται στην σειρά είναι μικρότερος από \(10^{-15}\).

1.3.2 Τροποποίηση της pi_approx ώστε να τυπώνει το αποτέλεσμα με ακρίβεια 8 δεκαδικών ψηφίων.

Η συνάρτηση printf() μπορεί να εκτυπώσει την τιμή πραγματικών μεταβλητών που δέχεται σαν όρισμα με επιθυμητή μορφοποίηση. Σύνταξη:

printf("%a.bf", var);

όπου:

Μέχρι πόσα ψηφία του \(\pi\) μπορείτε να υπολογίσετε / τυπώσετε; Αυτό το πρόβλημα έχει τυραννήσει γενιές και γενιές στα μαθηματικά και αργότερα - όταν οι αριθμοί έγιναν μεγάλοι - στην πληροφορική [1] [2].

1.4 Υλοποιήστε μια συνάρτηση eta_two η οποία να υπολογίζει το άθροισμα της σειράς:

\[S_{1} = \frac{1}{1^{2}} - \frac{1}{2^{2}} + \frac{1}{3^{2}} - \frac{1}{4^{2}} + \frac{1}{5^{2}} - \frac{1}{6^{2}} + \dots\]

ή αλλιώς γραμμένη ως:

\[S_{1} = \sum_{i=1}^\infty \frac{(-1)^{i-1}}{i^2}\]

Η συνάρτησή σας θέλουμε να ζητάει από τον χρήστη το πλήθος των όρων που θα χρησιμοποιήσει και να τυπώνει το αποτέλεσμα με ακρίβεια 6 δεκαδικών ψηφίων. Μπορείτε να χρησιμοποιήσετε όποια δομή επανάληψης επιθυμείτε.

Φαίνεται το αποτέλεσμά σας να συγκλίνει σε κάποιον αριθμό; Μπορείτε να το εξηγήσετε με την βοήθεια της συνάρτησης Dirichlet eta;

1.5 Εξάσκηση σε σειρές

Μπορείτε να κάνετε περισσότερη εξάσκηση, υλοποιώντας τις ακόλουθες συναρτήσεις στο πρόγραμμα seq.c:

\[S_{2} = \sum_{i=1}^\infty \frac{(-1)^{i+1}}{i} = \frac{1}{1} - \frac{1}{2} + \frac{1}{3} - \frac{1}{4} + \cdots\] \[S_{3} = \sum_{i=0}^\infty \frac{(-1)^{i}}{2i+1} = \frac{1}{1} - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \cdots\] \[S_{4} = \sum_{i=1}^\infty \frac{1}{i^4} = \frac{1}{1^4} + \frac{1}{2^4} + \frac{1}{3^4} + \frac{1}{4^4} + \cdots\] \[P = \prod_{i=1}^\infty \frac{2i}{2i-1}\cdot \frac{2i}{2i+1} = \frac{2}{1} \cdot \frac{2}{3} \cdot \frac{4}{3} \cdot \frac{4}{5} \cdot \frac{6}{5} \cdot \frac{6}{7} \cdots\] \[\frac{1}{\pi} = \frac{2\sqrt{2}}{9801} \sum_{k=0}^{\infty} \frac{(4k)! \cdot (1103 + 26390k)}{(k!)^4 \cdot 396^{4k}}\]

Υπόδειξη

Κάθε σειρά είναι ένας βρόχος με έναν συσσωρευτή (αρχικοποιημένο σε 0 για άθροισμα, σε 1 για γινόμενο) και έναν τρέχοντα όρο. Προσοχή στην ακέραια διαίρεση: το 1/(i*i) με ακέραιο i κάνει 0, οπότε ο υπολογισμός πρέπει να γίνεται σε double. Για τις εναλλασσόμενες σειρές κρατήστε ένα πρόσημο που αλλάζει σε κάθε βήμα αντί να καλείτε pow, και για το 1.3.1 ο έλεγχος τερματισμού συγκρίνει τον τρέχοντα όρο με το όριο.

Αριθμός στον οδηγό: Α6.13 (στο κεφάλαιο) · Μόνιμο αναγνωριστικό: lab-lab03-seq · Σύνδεσμος: https://progintro.github.io/study/questions/labs/lab-lab03-seq.html · Markdown (GitHub)