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

Επισυναπτόμενα αρχεία για μεταφόρτωση (download)

Συνδεθείτε για περισσότερες δυνατότητες αλληλεπίδρασης,
σχολιασμοί, εξωτερικοί σύνδεσμοι, βοήθεια, ψηφοφορίες, αρχεία, κτλ.

Αναζήτηση στο google.com για παρόμοια θέματα

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