|
|||||||
|
|
|
|||||
|
|
|||||||
Supongamos f continua en [ a , b ] tal que
f(a) * f(b) <= 0
y además que existe una única raíz t en dicho intervalo.
Algoritmo
Datos : a , b , EPSILON y f(x)
Paso 1) pastc = 2b - a
Paso 2) c = b - f(b) * (b -a)
f(b) - f(a)
Paso 3) SI ( f(a) * f(c) <= 0) ENTONCES
b = c
SINO
a = c
Paso 4) SI ( Valor Absoluto(c - pastc ) <= EPSILON ) ENTONCES
raiz = c y fin
SINO
seguir
Paso 5) pastc = c y volver a Paso 2)
Implementación
class RegulaFalse
{
public static double EPSILON = 0.00005;
public final static int MAX_ITER = 500;
private double a,b,c,pastc;
private int cont;
public void asignarDatos(double a,double b)
{
this.a = a;
this.b = b;
this.cont = 0;
}
public int numIteraciones( )
{
return cont;
}
public double raiz(Evaluar e)
{
pastc = 2*b - a;
while(true)
{
double aux = e.f(b) - e.f(a);
if (aux != 0.0 )
c = b - ( e.f(b) * (b - a) ) / aux;
else
break;
if ( e.f(a) * e.f(c) <= 0 )
b = c;
else
a = c;
if (Math.abs(c - pastc) <= EPSILON) break;
pastc = c;
cont++;
if (cont > MAX_ITER ) break;
}
return c;
}
}
Programa de prueba
Consiste en encontrar la raíz de la función Exponencial de x, menos x elevado a cinco, usando Regula False, con su respectivas interfaces e implementaciones.
Interfaz
interface Evaluar
{
double f(double x);
}
Función a evaluar e implementación de la interfaz
class funcExp implements Evaluar
{
public double f (double x)
{
return Math.exp(x) - Math.pow(x,5);
}
}
Código fuente del programa de prueba
class pruebaExp
{
public static void main(String arg[ ])
{
RegulaFalse r = new RegulaFalse( );
funcExp exp = new funcExp( );
r.asignarDatos(1.0 , 2.0);
System.out.println("\n\tPrograma de prueba para Regula False");
System.out.println("\t------------------------------------");
System.out.println("\n\tf(1.0) : " + exp.f(1.0));
System.out.println("\tf(2.0) : " + exp.f(2.0));
System.out.println("\n\traiz : " + r.raiz(exp));
System.out.println("\n\tnumero de iteraciones : " + r.numIteraciones( ));
System.out.println( );
}
}
bajar archivos