Programa para el Método Newton Raphson

Dada una función f(x) en el número flotante x y una suposición inicial para la raíz, encuentre la raíz de la función en el intervalo. Aquí f(x) representa una ecuación algebraica o trascendental. 
Para simplificar, hemos supuesto que la derivada de la función también se proporciona como entrada.
Ejemplo:

Input: A function of x (for example x3 – x2 + 2),
       derivative function of x (3x2 – 2x for above example)
       and an initial guess x0 = -20
Output: The value of root is : -1.00
        OR any other value close to root.

Hemos discutido a continuación los métodos para encontrar la raíz en el conjunto 1 y el conjunto 2 
Conjunto 1: El método de bisección  
Conjunto 2: El método de la posición falsa
Comparación con los dos métodos anteriores: 
 

  1. En métodos anteriores, nos dieron un intervalo. Aquí se requiere un valor de estimación inicial de raíz.
  2. Se garantiza que los dos métodos anteriores convergen, Newton Raphson puede no converger en algunos casos.
  3. El método de Newton Raphson requiere derivada. Algunas funciones pueden ser difíciles o 
    imposibles de diferenciar.
  4. Para muchos problemas, el método de Newton Raphson converge más rápido que los dos métodos anteriores.
  5. Además, puede identificar raíces repetidas, ya que no busca cambios en el signo de f(x) explícitamente

La fórmula: 
a partir de la suposición inicial x 1 , el método de Newton Raphson utiliza la siguiente fórmula para encontrar el siguiente valor de x, es decir, x n+1 del valor anterior x n
 

newtonraphsonformula

Ventajas del método de Newton Raphson:

  • Es el mejor método para resolver las ecuaciones no lineales.
  • También se puede utilizar para resolver el sistema de ecuaciones no lineales, diferenciales no lineales y ecuaciones integrales no lineales.
  • El orden de convergencia es cuádrico, es decir, de segundo orden, lo que hace que este método sea más rápido en comparación con otros métodos.
  • Es muy fácil de implementar en la computadora.

Desventajas del método de Newton Raphson:

  • Este método se vuelve complicado si la derivada de la función f(x) no es simple.
  • Este método requiere una gran y sensible atención en cuanto a la elección de su aproximación.
  • En cada iteración, tenemos que evaluar dos cantidades f(x) y f'(x) para alguna x.

Algoritmo: 
Entrada: x inicial, func(x), derivFunc(x) 
Salida: Raíz de Func() 
 

  1. Calcule los valores de func(x) y derivFunc(x) para una x inicial dada
  2. Calcule h: h = func(x) / derivFunc(x)
  3. Mientras que h es mayor que el error permitido ε 
    1. h = func(x) / derivFunc(x)
    2. x = x – h

A continuación se muestra la implementación del algoritmo anterior. 
 

C++

// C++ program for implementation of Newton Raphson Method for
// solving equations
#include<bits/stdc++.h>
#define EPSILON 0.001
using namespace std;
 
// An example function whose solution is determined using
// Bisection Method. The function is x^3 - x^2  + 2
double func(double x)
{
    return x*x*x - x*x + 2;
}
 
// Derivative of the above function which is 3*x^x - 2*x
double derivFunc(double x)
{
    return 3*x*x - 2*x;
}
 
// Function to find the root
void newtonRaphson(double x)
{
    double h = func(x) / derivFunc(x);
    while (abs(h) >= EPSILON)
    {
        h = func(x)/derivFunc(x);
  
        // x(i+1) = x(i) - f(x) / f'(x) 
        x = x - h;
    }
 
    cout << "The value of the root is : " << x;
}
 
// Driver program to test above
int main()
{
    double x0 = -20; // Initial values assumed
    newtonRaphson(x0);
    return 0;
}

Java

// Java program for implementation of
// Newton Raphson Method for solving
// equations
class GFG {
     
    static final double EPSILON = 0.001;
     
    // An example function whose solution
    // is determined using Bisection Method.
    // The function is x^3 - x^2 + 2
    static double func(double x)
    {
        return x * x * x - x * x + 2;
    }
     
    // Derivative of the above function
    // which is 3*x^x - 2*x
    static double derivFunc(double x)
    {
        return 3 * x * x - 2 * x;
    }
     
    // Function to find the root
    static void newtonRaphson(double x)
    {
        double h = func(x) / derivFunc(x);
        while (Math.abs(h) >= EPSILON)
        {
            h = func(x) / derivFunc(x);
     
            // x(i+1) = x(i) - f(x) / f'(x)
            x = x - h;
        }
     
        System.out.print("The value of the"
                + " root is : "
                + Math.round(x * 100.0) / 100.0);
    }
     
    // Driver code
    public static void main (String[] args)
    {
         
        // Initial values assumed
        double x0 = -20;
        newtonRaphson(x0);
    }
}
 
// This code is contributed by Anant Agarwal.

Python3

# Python3 code for implementation of Newton
# Raphson Method for solving equations
 
# An example function whose solution
# is determined using Bisection Method.
# The function is x^3 - x^2 + 2
def func( x ):
    return x * x * x - x * x + 2
 
# Derivative of the above function
# which is 3*x^x - 2*x
def derivFunc( x ):
    return 3 * x * x - 2 * x
 
# Function to find the root
def newtonRaphson( x ):
    h = func(x) / derivFunc(x)
    while abs(h) >= 0.0001:
        h = func(x)/derivFunc(x)
         
        # x(i+1) = x(i) - f(x) / f'(x)
        x = x - h
     
    print("The value of the root is : ",
                             "%.4f"% x)
 
# Driver program to test above
x0 = -20 # Initial values assumed
newtonRaphson(x0)
 
# This code is contributed by "Sharad_Bhardwaj"

C#

// C# program for implementation of
// Newton Raphson Method for solving
// equations
using System;
class GFG {
     
    static double EPSILON = 0.001;
     
    // An example function whose solution
    // is determined using Bisection Method.
    // The function is x^3 - x^2 + 2
    static double func(double x)
    {
        return x * x * x - x * x + 2;
    }
     
    // Derivative of the above function
    // which is 3*x^x - 2*x
    static double derivFunc(double x)
    {
        return 3 * x * x - 2 * x;
    }
     
    // Function to find the root
    static void newtonRaphson(double x)
    {
        double h = func(x) / derivFunc(x);
        while (Math.Abs(h) >= EPSILON)
        {
            h = func(x) / derivFunc(x);
     
            // x(i+1) = x(i) - f(x) / f'(x)
            x = x - h;
        }
     
        Console.Write("The value of the"
                    + " root is : "
                    + Math.Round(x * 100.0) / 100.0);
    }
     
    // Driver code
    public static void Main ()
    {
         
        // Initial values assumed
        double x0 = -20;
        newtonRaphson(x0);
    }
}
 
// This code is contributed by nitin mittal

PHP

<?php
// PHP program for implementation
// of Newton Raphson Method for
// solving equations
$EPSILON = 0.001;
 
// An example function whose
// solution is determined
// using Bisection Method.
// The function is x^3 - x^2 + 2
function func($x)
{
    return $x * $x * $x -
           $x * $x + 2;
}
 
// Derivative of the above
// function which is 3*x^x - 2*x
function derivFunc($x)
{
    return 3 * $x *
               $x - 2 * $x;
}
 
// Function to
// find the root
function newtonRaphson($x)
{
    global $EPSILON;
    $h = func($x) / derivFunc($x);
    while (abs($h) >= $EPSILON)
    {
        $h = func($x) / derivFunc($x);
 
        // x(i+1) = x(i) -
        // f(x) / f'(x)
        $x = $x - $h;
    }
 
    echo "The value of the ".
           "root is : " , $x;
}
 
// Driver Code
$x0 = -20; // Initial values assumed
newtonRaphson($x0);
 
// This code is contributed by ajit
?>

Javascript

<script>
 
// JavaScript program for implementation of
// Newton Raphson Method for solving
// equations
 
    let EPSILON = 0.001;
       
    // An example function whose solution
    // is determined using Bisection Method.
    // The function is x^3 - x^2 + 2
    function func(x)
    {
        return x * x * x - x * x + 2;
    }
       
    // Derivative of the above function
    // which is 3*x^x - 2*x
    function derivFunc(x)
    {
        return 3 * x * x - 2 * x;
    }
       
    // Function to find the root
    function newtonRaphson(x)
    {
        let h = func(x) / derivFunc(x);
        while (Math.abs(h) >= EPSILON)
        {
            h = func(x) / derivFunc(x);
       
            // x(i+1) = x(i) - f(x) / f'(x)
            x = x - h;
        }
       
        document.write("The value of the"
                + " root is : "
                + Math.round(x * 100.0) / 100.0);
    }
 
 
// Driver program
 
        // Initial values assumed
        let x0 = -20;
        newtonRaphson(x0);
 
// This code is contributed by susmitakundugoaldanga.
</script>

Producción: 

The value of root is : -1.00 

¿Como funciona esto?  
La idea es dibujar una recta tangente a f(x) en el punto x 1 . El punto donde la línea tangente cruza el eje x debería ser una mejor estimación de la raíz que x 1 . Llame a este punto x 2 . Calcule f(x 2 ) y dibuje una recta tangente en x 2
 

newtonRaphsonMethod

Sabemos que la pendiente de la recta desde (x 1 , f(x 1 )) hasta (x 2 , 0) es f'(x 1 )) donde f’ representa la derivada de f. 
 

f'(x1) = (0 - f(x1)) / (x2 - x1) 

f'(x1) *  (x2 - x1) =  - f(x1)

x2 =  x1 - f(x1) / f'(x1) 

By finding this point 'x2', we move closer towards the root.
We have to keep on repeating the above step till we get really close to 
the root or we find it.

In general, 
xn+1 =  xn - f(xn) / f'(xn) 

Explicación alternativa usando la serie de Taylor: 
 

Let x1 be the initial guess. 

We can write x2 as below:
  xn+1  = xn + h ------- (1)
Here h would be a small value that can be positive or negative.

According to Taylor's Series, 
ƒ(x) that is infinitely differentiable can be written as below
f(xn+1) = f(xn  + h) 
       = f(xn) + h*f'(xn) + ((h*h)/2!)*(f''(xn)) + ...

Since we are looking for root of function, f(xn+1) = 0

f(xn) + h*f'(xn) + ((h*h)/2!)*(f''(xn)) + ... = 0

Now since h is small, h*h would be very small. 
So if we ignore higher order terms, we get

f(xn) + h*f'(xn) = 0

Substituting this value of h = xn+1 - xn from equation (1) we get, 
f(xn) + (xn+1  - xn)*f'(xn) = 0

xn+1 =  xn - f(xn) / f'(xn)  

Notas: 
 

  1. Generalmente usamos este método para mejorar el resultado obtenido por el método de bisección o el método de posición falsa.
  2. El método babilónico para la raíz cuadrada se deriva del método de Newton-Raphson.

Referencias:  
Métodos introductorios de análisis numérico por SS Sastry  
https://en.wikipedia.org/wiki/Newton’s_method  
http://www.cae.tntech.edu/Members/renfro/me2000/lectures/2004-09-07_handouts .pdf/at_download/file
Este artículo es una contribución de Abhiraj Smit . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *