You are on page 1of 6

// Método de NEWTON - RAPHSON para el cálculo de raíces

#include <iostream>

#include <iomanip> // setprecision

#include <cmath>

#include <windows.h>

#define PRECISION 10

#define MAX_ITERACIONES 100

#define INTERVALOS 6

using namespace std;

void tabula(double a, double b, int intervalos); // Muestra un # tabulado de intervalos

double f(double x); // Retorna el valor de la función evaluada en x

double f_derivada(double x); // Retorna la derivada de la función evaluada en x

void newton_raphson(double x0, double tolerancia, int max_interaciones); // Función que
calcula la raiz aproximada de una función

int main()

{

double a;

double b;

double tolerancia; // Tolerancia

double x0; // Primera aproximación

cout << setprecision(PRECISION); // Se establece la precisión

cout << "\nCalculo de las raices de una funcion aplicando el metodo de Newton - Raphson\n";

cin >> tolerancia. } .get(). cin. // Newton Raphson newton_raphson(x0. cin >> b. // Se ingresa el intervalo cout << "\na = ". cout << "b = ".b]:" << endl. cout << "\nEscoja el punto inicial adecuado: x0 = ". cout << "\nIngrese el intervalo inicial [a. return 0. MAX_ITERACIONES). tolerancia.get(). cin >> a. // Se pide ingresar la tolerancia cout << "Tolerancia = ". INTERVALOS). b. tabula(a. cin. cin >> x0.

for (int i = 0. double tolerancia.a) / intervalos. int intervalos) { int puntos = intervalos + 1.3. i++) { cout << "\t" << a << "\t\t" << f(a) << endl. } } double f(double x) { return sin(x)-(pow(x. a = a + ancho. double b. double ancho = (b . cout << "\n\tx\t\tf(x) " << endl. } double f_derivada(double x) { return cos(x)-2*x. int max_iteraciones) . } void newton_raphson(double x0. i < puntos.2)). //return -1 * exp(-x) + 3. //return exp(-x) + 3 * x .void tabula(double a.

x0). iteracion = 1. cout << "x0 = " << x0 << "\n" << "f(x0) = " << f(x0) << "\n" << "f'(x0) = " << f_derivada(x0) << endl.x0 int iteracion. f(x1). Sleep(500).f(x0) / f_derivada(x0). // Se sobrepasó la máxima cantidad de iteraciones permitidas break. f_derivada(x1). cout << "\nx" << iteracion << " = " << x1 << "\n" << "f(x" << iteracion << ") = " << f(x1) << "\n" . // Cálculo de la siguiente aproximación error = fabs(x1 . do { if (iteracion > max_iteraciones) { converge = false. // Diferencia entre dos aproximaciones sucesivas: x1 . // # de iteraciones bool converge = true. // El error es la diferencia entre dos aproximaciones sucesivas // Se imprimen los valores de la siguiente aproximación x1. // Se imprimen los valores de la primera aproximación cout << "\nAproximacion inicial:\n". error cout << "\a". // Siguiente aproximación double error. } else { x1 = x0 .{ double x1. cout << "\n\nIteracion #" << iteracion << endl.

} } } while (1). } else { cout << "\n\nSe sobrepasó la máxima cantidad de iteraciones permitidas" << endl. << "f'(x" << iteracion << ") = " << f_derivada(x1) << "\n" << "error = " << error << endl. } . break. if (error <= tolerancia) { // Condición de terminación converge = true. // La condición de terminación consiste en que que el error debe ser <= que la tolerancia dada // Si se cumple la condición de terminación. iteracion++. se pasa a la siguiente iteración } else { x0 = x1. Sleep(500). // Respuesta final cout << "\a". // Si no se cumple el criterio de terminación. if (converge) { cout << "\n\nPara una tolerancia de " << tolerancia << " la RAIZ APROXIMADA de f es = " << x1 << endl. // La diferencia entre dos aproximaciones sucesivas es también conocida como error. se ha encontrado la raiz aproximada buscada.

} .