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