Está en la página 1de 3

1.5.

El metodo de la posici on falsa 13


Figura 1.5: Metodo de la posici on falsa
1.5.1. Algoritmo de la posici on falsa
Aproxima una soluci on para la ecuaci on f(x) = 0 dadas dos aproximaciones ini-
ciales.
ENTRADA f(x), aproximaciones iniciales p = 0, p = 1, que cumplan f(p
0
)f(p
1
) <
0, tolerancia TOL, n umero de iteraciones m aximo N
0
.
SALIDA Soluci on aproximada p o mensaje de error.
Paso 1 Hacer i = 2, q
0
= f(p
0
), q
1
= f(p
1
)
Paso 2 Mientras i N
0
hacer pasos 3 al 7
Paso 3 Hacer p = p
1
q
1
(p
1
p
0
)/(q
1
q
0
)
Paso 4 Si |p p
1
| < TOL entonces
SALIDA (La soluci on es p)
TERMINAR
Paso 5 Hacer i = i + 1, q = f(p)
Paso 6 Si q q
1
< 0, entonces hacer p
0
= p
1
, q
0
= q
1
Paso 7 Hacer p
1
= p, q
1
= q
Paso 8 SALIDA (El metodo fracas o despues de N
0
iteraciones)
TERMINAR
14 Captulo 1. Ecuaciones no lineales
1.5.2. C odigo de la posici on falsa
El siguiente ejemplo usa f(x) = tan(x) x.
#include<stdio.h>
#include<math.h>
double F(double);
void INPUT(int *, double *, double *, double *, double *, double *, int *);
main() {
double Q,P0,Q0,P1,Q1,C,P,FP,TOL;
int I,NO,OK;
INPUT(&OK, &P0, &P1, &Q0, &Q1, &TOL, &NO);
if (OK) {
I = 2;
OK = true;
Q0 = F(P0);
Q1 = F(P1);
while ((I<=NO) && OK) {
P = P1 - Q1 * (P1 - P0) / (Q1 - Q0);
Q = F(P);
printf("%3d %15.8e %15.8e\n",I,P,Q);
if (abs(P-P1) < TOL) {
printf("\nSolucion aproximada P = %12.8f\n",P);
OK = false;
}
else {
I++;
if ((Q*Q1) < 0.0) {
P0 = P1; Q0 = Q1;
}
P1 = P; Q1 = Q;
}
}
if (OK) {
printf("\nLa iteracion numero %3d",NO);
printf(" da la aproximacion %12.8f\n",P);
printf("fuera de la tolerancia\n");
}
}
getchar();
getchar();
}
double F(double X)
{
double f;
f = tan(X) - X;
return f;
}
void INPUT(int *OK, double *P0, double *P1, double *Q0, double *Q1, double
*TOL, int *NO)
{
double X;
*OK = false;
1.5. El metodo de la posici on falsa 15
while (!(*OK)) {
printf("Dar el valor de P0\n");
scanf("%lf", P0);
printf("Dar el valor de P1\n");
scanf("%lf", P1);
if (*P0 > *P1) {
X = *P0; *P0 = *P1; *P1 = X;
}
if (*P0 == *P1) printf("P0 no debe ser igual a P1.\n");
else {
*Q0 = F(*P0);
*Q1 = F(*P1);
if (*Q0*(*Q1) > 0.0) printf("F(P0) y F(P1) tiene el mismo signo\n");
else *OK = true;
}
*OK = false;
while(!(*OK)) {
printf("Dar la tolerancia\n");
scanf("%lf", TOL);
if (*TOL <= 0.0) printf("La tolerancia debe ser positiva\n");
else *OK = true;
}
*OK = false;
while (!(*OK)) {
printf("Dar el numero de iteraciones maximo\n");
scanf("%d", NO);
if (*NO <= 0) printf("Debe ser un entero positivo\n");
else *OK = true;
}
}
}
Ejercicios
Usar cada uno de los metodos estudiados en este captulo para encontrar las races de las siguientes
ecuaciones. Tomar una tolerancia de 0.0001. Se recomienda utilizar un programa de gracaci on para encontrar
los puntos iniciales donde no se especica intervalo alguno. Tomar en cuenta que algunas ecuaciones tienen
m as de una raz, por lo que habr a que repetir el metodo para varios puntos iniciales diferentes. En el caso
de funciones peri odicas donde hay innidad de soluciones, ser a suciente con encontrar las cinco races m as
cercanas al origen. Comparar la eciencia de cada metodo por medio del n umero de iteraciones que cada uno
requiri o en una misma ecuaci on.
1.

x = cos x, [0, 1] R: 0.625
2. x
3
7x
2
+ 14x 6 = 0 R: 0.5859, 3.002, 3.419
3. x = tan x, [4, 4.45] R: 4.4932
4. x 2
x
= 0, [0, 1] R: 0.641182
5. e
x
x
2
+ 3x 2 = 0, [0, 1] R: 0.257530
6. 2 senx + x = 0, [1, 2] R: 1.683855
7. x
3
2x
2
5 = 0, [1, 4] R: 2.69065

También podría gustarte