martes, 3 de marzo de 2009

Newton-Raphson C#

El método de Newton-Raphson (para encontrar raíces). Aquí el programa se detiene cuando el valor del error porcentual es menor al indicado por el usuario. SOLO FUNCIONA PARA LA FUNCIÓN YA DADA. El usuario no puede meter la función:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/* Tarea de Newton Raphson
* Autor: Jonathan Astudillo López
* Fecha: 2 de marzo del 2009
*
*/

namespace NewtonRaphson
{
class ProgramNewtonRaphson
{
static double fx(double x)
{
return x-Math.Cos(x);//Función
}

static double dfx(double x)
{
return 1+Math.Sin(x);//Derivada
}

static void Main(string[] args)
{
double toler,x1,x0,ea;//variables
int i;
string answer;

Console.WriteLine("Programa Newton Raphson para la función x-cos(x)");
Console.ReadLine();

do
{

Console.WriteLine("Coloca el valor inicial, x0");//Pedir el valor de x0, me pareció interesante pedirselo al usario
x0 = Convert.ToDouble(Console.ReadLine());

Console.WriteLine("Coloca el valor de la tolerancia");
toler = Convert.ToDouble(Console.ReadLine());

x1 = x0 - (fx(x0) / dfx(x0));//Newton Raphson
i = 1;
ea = Math.Abs(((x1 - x0) / x1) * 100);

Console.WriteLine();
Console.WriteLine("# de itereación\t x0\t x1\t f(x0)\t df(x0)\t Error");
do
{
Console.WriteLine();
Console.WriteLine("{0} \t{1:0.0000000000}\t{2:0.0000} \t {3:0.0000} \t {4:0.0000} \t {5:0.0000}", i, x0, x1, fx(x0), dfx(x0), ea);
x1 = x0 - (fx(x0) / dfx(x0)); //esto es lo que será la nueva x1
i = i + 1; //en si no cambia los datos, solo nos indica el número de iteraciones que se han hecho
ea = Math.Abs(((x1 - x0) / x1) * 100);//lo que importa en el while

} while (Math.Abs(ea) > toler); //Se hará el ciclo mientras que ea sea mayor al valor dado en tol

Console.ReadLine();
Console.WriteLine("¿Quieres hacerlo de nuevo? Escribe SI para hacerlo de nuevo");
answer=Console.ReadLine();
} while (answer == "si" || answer == "SI" || answer == "Si" || answer == "sI");
}
}
}

2 comentarios: