Documente Academic
Documente Profesional
Documente Cultură
El mtodo mitad
En estas pginas estudiaremos los procedimientos numricos para hallar las races de
una ecuacin trascendente, y para hallar las races de un polinomio. El clculo de las
races de un polinomio puede efectuarse con los mismos procedimientos que para una
ecuacin en general, sin embargo, aprovechando las propiedades de dichas races se
elaboran mtodos especficos para este tipo de ecuaciones. Entre estos ltimos, hemos
de destacar el mtodo de Graeffe muy apropiado para ser codificado y usado en los
ordenadores.
En las primeras pginas, describiremos dos procedimientos para obtener las races de
una ecuacin trascendente: el mtodo de las aproximaciones sucesivas y el
procedimiento del punto medio. Existen otros procedimientos como el grfico, de las
partes proporcionales, el mtodo de las tangentes o mtodo de Newton. Cada
procedimiento tiene, sin duda, sus ventajas e inconvenientes, e incluso se pueden
combinar varios procedimientos a la vez.
Mtodo mitad
Races simples
Races mltiples
El pozo de potencial
El mtodo de Graeffe
Para calcular las races de un polinomio, crearemos una clase especfica, cuyas
funciones miembro realizan distintas tareas, entre otras las siguientes:
Descripcin
La condicin de terminacin
Ejemplos
Cdigo fuente
Descripcin
El mtodo de las aproximaciones sucesivas es uno de los procedimientos ms
importantes y ms sencillos de codificar. Supongamos la ecuacin
donde f(x) es una funcin continua que se desea determinar sus races reales. Se
sustituye f(x) por la ecuacin equivalente
(1)
Tal como nos sugiere la representacin grfica de la funcin en la figura, la raz buscada
est en el intervalo 0 a . Tomamos una aproximacin inicial a la raz x0, en dicho
intervalo y aplicamos la frmula (1), su codificacin no presenta grandes dificultades.
double x=0.5;
while(true){
x=Math.cos(x);
}
La condicin de finalizacin
Primero, introducimos el valor inicial x, la primera aproximacin, calculamos el valor
del coseno de x, el valor devuelto (segunda aproximacin), lo guardamos de nuevo en la
variable x, y repetimos el proceso indefinidamente. El cdigo aunque correcto, necesita
terminarse en algn momento, cumpliendo una determinada condicin. Cuando el valor
absoluto del cociente entre la diferencia de dos trminos consecutivos de la sucesin y
uno de los trminos, sea menor que cierta cantidad
El criterio de convergencia
No todas las ecuaciones pueden resolverse por este mtodo, solamente si el valor
absoluto de la derivada de la funcin (x) en la vecindad de la raz es menor que la
unidad (la pendiente de la recta bisectriz del primer cuadrante es uno). En la figura,
podemos ver como es imposible encontrar la solucin marcada por un puntito negro en
la interseccin entre la curva y la recta bisectriz del primer cuadrante, ya que la sucesin
xi diverge.
Por ejemplo, la ecuacin
tiene una raz en el intervalo (1, 2) ya que f(1)=-1<0 y f(2)=5>0. Esta ecuacin puede
escribirse de la forma
En este caso,
y por tanto,
Ejemplos
Resolver por el mtodo de aproximaciones sucesivas las siguientes ecuaciones. Primero
hay que ponerlas de la forma x=f(x).
Cdigo fuente
Descripcin
Raz simple
Cdigo fuente
Descripcin
El mtodo mitad es uno de los mtodos ms sencillos de comprender y es muy
conveniente para dar rpidamente con la raz de la ecuacin dada, sin embargo, el
nmero de clculos aumenta sustancialmente a medida que se desea mayor exactitud.
El procedimiento mitad se basa en el teorema de Bolzano que dice que si tenemos una
funcin y=f(x), de variable real y continua en el intervalo (a, b), y el signo de la funcin
en el extremo a es distinto al signo de la funcin en el extremo b del intervalo, existe al
menos un valor c dentro de dicho intervalo (a, b) tal que f(c)=0, c es por tanto, la raz
buscada, vase la figura.
Supongamos una ecuacin
Para hallar la raz de la funcin en el intervalo (a, b), se divide el intervalo en la mitad.
(3)
Como los puntos extremos de la izquierda a1, a2, ... an, ...forman una sucesin creciente
y acotada, y los de la derecha b1, b2, ... bn, ... una sucesin acotada decreciente, existe un
lmite comn que es la raz buscada.
Las condiciones de terminacin del proceso
Para poder codificar este procedimiento hemos de seguir los pasos siguientes
do{
m=(a+b)/2;
ym=f(m);
if(Math.abs(ym)<CERO) break;
if(Math.abs((a-b)/m)<ERROR) break;
if((f(a)*ym)<0) b=m;
else a=m;
iter++;
}while(iter<MAXITER);
Raz simple
Como en caso del procedimiento de aproximacione sucesivas, crearemos una clase base
abstracta denominada Ecuacion con una funcin miembro denominada puntoMedio que
describa el procedimiento numrico.
if((f(a)*ym)<0) b=m;
else a=m;
iter++;
}while(iter<MAXITER);
if(iter==MAXITER){
throw new RaizExcepcion("No se ha encontrado la raz");
}
return m;
}
Como hemos visto esta funcin tiene una raz en el intervalo (0, /2). La funcin
cambia de signo en dicho intervalo, f(0)=-1, y f(/2)=/2.
public class Funcion1 extends Ecuacion{
public double f(double x){
return(x-Math.cos(x));
}
}
Para hallar la raz de esta ecuacin creamos un objeto de la clase derivada Funcion1, y
llamamos desde ste a la funcin que describe el procedimiento numrico puntoMedio.
Ya que la funcin puntoMedio puede lanzar una excepcin, la llamada a dicha funcin
se debe de efectuar en un bloque try ... catch. De este modo, se notifica al usuario que
el procedimiento numrico ha sido incapaz de hallar la raz de dicha ecuacin, mediante
el mensaje "No se ha encontrado la raz" que se extrae del objeto ex de la clase
RaizExcepcion mediante la funcin getMessage.
Cdigo fuente
Races de un polinomio
El mtodo de Graeffe
El mtodo de Graeffe
Sea el polinomio
(1)
(2)
Hemos construido as una nueva ecuacin cuyas races son numricamente iguales a los
cuadrados de las races de la ecuacin original. Repitiendo el proceso, se pueden
obtener ecuaciones cuyas races sean numricamente iguales a las potencias cuarta,
octava, decimosexta, etc. de las races de la ecuacin original. El efecto de este proceso
de elevar al cuadrado es el de producir ecuaciones cuyas races estn cada vez ms
separadas. Por ejemplo, si dos races de la ecuacin original estn entre s como 5 : 4
sus potencias 128 estn en la razn 5128 : 4128, o sea, 2.54 1012: 1, lo que es muy deseable
ya que las ecuaciones cuyas races estn muy separadas se pueden resolver rpidamente
con exactitud considerable. Supngase ahora, que reiterando el proceso de elevacin al
cuadrado se llega a un polinomio
(3)
Por las relaciones conocidas entre races y coeficientes del polinomio, se tiene que
En la suposicin de que
donde el smbolo >>> indica mucho mayor que. Las relaciones entre coeficientes y
races quedarn simplificadas con gran aproximacin a las expresiones.
Para determinar el signo, se halla el valor del polinomio original para los valores ri, y
-ri, uno de los dos har que dicho valor sea prximo a cero, y por tanto, ser la raz
buscada.
mediante la expresin
m (2m) 0 1 2 3
a= new double[MAX_ITER][n+1];
//la primera fila de la tabla guarda los coeficientes del polinomio
for(int j=0; j<n+1; j++){
a[0][j]=coef[j];
}
for(int m=1; m<MAX_ITER; m++){
for(int j=0; j<n+1; j++){
a[m][j]=0.0;
}
}
Donde MAX_ITER es el nmero mximo de iteracciones, o de veces que se repite el
proceso de elevacin al cuadrado.
En el cdigo de la funcin tabla, cuando se supera el valor mximo que puede guardar
un dato de tipo double, se interrumpe el proceso de elevacin al cuadrado, y se sale
fuera del bucle. La funcin esttica isInfinite de la clase Double se encarga de
verificarlo devolviendo true si hemos superado dicho lmite permitido.
exterior:
do{
for(int i=0; i<n+1; i++){
a[m][i]=a[m-1][i]*a[m-1][i];
if(Double.isInfinite(a[m][i])){
break exterior;
}
}
//....
m++;
}while(m<MAX_ITER);
Es necesario emplear un break con una etiqueta para salir al bucle exterior do...while, e
interumpir el proceso de elevacin al cuadrado. Si solamente empleamos break salimos
del bucle interior for y se continuara en el bucle do...while el proceso de clculo.
Nos queda ahora, la determinacin el signo de cada uno de los dobles productos. Si el
ndice s es impar, entonces el signo es negativo, y si es par el signo es positivo. En vez
de elevar -1 a la potencia s, empleamos el operador mdulo % en conjuncin con la
macro if ... else, que se leer: si s es impar (el resto de dividir s entre 2 es cero),
entonces el valor de la variable entera signo es +1 en caso contrario es -1.
pot2=1;
for(int i=1; i<=m; i++){
pot2*=2;
}
El cdigo de la funcin tabla, que calcula los coeficientes polinomio resultante del
proceso de elevar el polinomio original sucesivamente al cuadrado m veces, es el
siguiente
m--;
//potencia de m de 2
pot2=1;
for(int i=1; i<=m; i++){
pot2*=2;
}
}