Αριθμητικός υπολογισμός ρίζας με τη μέθοδο Newton-Raphson στη C++

Το βίντεο έχει διάρκεια 29:23. Πιθανά να χρειάζεται λίγος χρόνος για την προβολή του.


C++ πρόγραμμα αριθμητική μέθοδος ρίζα εξίσωση προσέγγιση σύγκλιση μέθοδος Newton-Raphson

Έστω πως θέλουμε να υπολογίσουμε μια ρίζα του πολυωνύμου:

$$ {x}^{3}-6\,{x}^{2}-x+30 = 0 $$

netwton root

Η μέθοδος 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 $$

NewtonIteration Ani

Ακολουθεί ένα παράδειγμα υλοποίησης:

#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 License
Εκπαιδευτικό υλικό από τον Αθανάσιο Σταυρακούδη σας παρέχετε κάτω από την άδεια Creative Commons Attribution-NonCommercial-ShareAlike 4.0 License.
Σας παρακαλώ να ενημερωθείτε για κάποιους επιπλέον περιορισμούς
http://stavrakoudis.econ.uoi.gr/stavrakoudis/?iid=401.