Αριθμητικός υπολογισμός ρίζας με τη μέθοδο 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.
