Αριθμητικός υπολογισμός ρίζας με τη μέθοδο Newton-Raphson στη C++
Το βίντεο έχει διάρκεια 29:23. Πιθανά να χρειάζεται λίγος χρόνος για την προβολή του.
C++
πρόγραμμα
αριθμητική μέθοδος
ρίζα
εξίσωση
προσέγγιση
σύγκλιση
μέθοδος Newton-Raphson
Έστω πως θέλουμε να υπολογίσουμε μια ρίζα του πολυωνύμου:
$$ {x}^{3}-6\,{x}^{2}-x+30 = 0 $$
Η μέθοδος Newton–Raphson βασίζεται σε μια επαναληπτική διαδικασία.
Αν $$x_0$$ είναι μια προσέγγιση της ρίζας τότε η
$$
x_{1} = x_0 - \frac{f(x_0)}{f'(x_0)}
$$
αποτελεί μια καλύτερη προσέγγιση.
Η μέθοδος μπορεί να επαναληφθεί:
$$
x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}
$$
μέχρι να πάρουμε μια ικανοποιητική προσέγγιση.
Συνήθως σταματάμε όταν:
$$
|x_{n+1} - x_n| < \epsilon
$$
Ακολουθεί ένα παράδειγμα υλοποίησης:
#include <iostream> #include <math.h> #include <stdio.h> using namespace std; #define MAXITER 100 const double eps = 1e-6; /* ακρίβεια προσέγγισης */ const double h = 1e-4; /* αριθμητική παράγωγος */ double f (double x) { return exp(x) - x - 2; } double ff (double x, double h) { return ( f(x+h) - f(x-h) ) / ( 2*h ); } int main() { bool rootFound = false; double d; /* διαφορά δύο διασοχικών προσεγγίσεων */ double x[MAXITER]; /* πίνακας τιμών x */ int i = 0; cout << "Εύρεση ρίζας με τη μέθοδο Newton-Raphson." << endl; cout << "-----------------------------------------" << endl; cout << "Αρχική τιμή του x: "; cin >> x[0]; printf(" i x f(x) d\n"); printf("--------------------------------------------------\n"); do { x[i+1] = x[i] - f(x[i]) / ff(x[i], h); d = fabs(x[i+1] - x[i]); printf("%5d %14.8f %14.8f %14.8f\n", i+1, x[i+1], f(x[i+1]), d); if (d < eps) { rootFound = true; break; } i++; if (i >= MAXITER) { rootFound = false; break; } } while (rootFound == false); if (rootFound == true) printf("\nΒρέθηκε x=%.14f\n", x[i]); else printf("\nΔεν βρέθηκε ρίζα\n"); return 0; }
σχολιασμοί, εξωτερικοί σύνδεσμοι, βοήθεια, ψηφοφορίες, αρχεία, κτλ.
Εκπαιδευτικό υλικό από τον
Αθανάσιο Σταυρακούδη
σας παρέχετε κάτω από την άδεια
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 License.
Σας παρακαλώ να ενημερωθείτε για κάποιους επιπλέον περιορισμούς
http://stavrakoudis.econ.uoi.gr/stavrakoudis/?iid=401.