Last active
December 16, 2015 16:29
-
-
Save tian2992/5463654 to your computer and use it in GitHub Desktop.
Sacar raices de manera aproximada con el metodo de la secante iterativo.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <math.h> | |
/* Funcion a evaluar | |
Debe venir con valor double de x. | |
*/ | |
double funcion (double x) { | |
return (x * x * x) + (x * x) + 10 * x - 20; | |
} | |
double funcion2 (double x) { | |
return (x * x) - 15; | |
} | |
// Definimos X desde el principio; | |
double x = 0; | |
/* | |
Funcion de calculo de Secante, x01 y x02 son los valores iniciales de evaluacion. | |
Iteraciones define el limite de iteraciones maxima, error | |
double x01: Define el valor inicial de evaluacion. | |
double x02: Define el segundo valor de evaluacion. | |
int iterations: Define la cantidad de iteraciones maximas a ejecutar. | |
double error: Define la cantidad de error la cual se puede aceptar. | |
Deberian de cambiarlo a porcentaje!!! | |
double (*func) (double): apuntador a una funcion la cual debe tomar un double | |
de valor inicial y retornar double. | |
Nota: Esto es relativamente avanzado :P ahi leen | |
su origen o informacion acerca de apuntadores. | |
*/ | |
double Secante (double x01, double x02, int iterations, double error, | |
double (*func) (double)) { | |
int i; | |
for (i=1; i < iterations; i++){ | |
x = x01 - ((x01 - x02) * (*func) (x01)) / ((*func) (x01) - (*func) (x02)); | |
// Deben modificar estas estas salidas. | |
printf ("Valor de X: \t\t %f\n", x); | |
printf ("Valor de X01: \t\t %f\n", x01); | |
// Recuerden cambiar el error absoluto a porcentaje de error. | |
printf ("Valor de error_eval: \t %f\n", fabs(x-x01)); | |
// Fin del area de editar. | |
//Aca tambien el cambio de porcentaje de error. | |
if (fabs(x-x01) < error){ | |
return x; | |
} | |
//Pasa el valor de x01 a x02 y el de x a x01. | |
x02 = x01; | |
x01 = x; | |
//Tambien deberian de cambiar. | |
printf ("Iteracion numero: %d\n", i); | |
} | |
// Si se salio aca, significa que ya paso la cantidad maxima de iteraciones. | |
// Alertamos la usuario. | |
printf ("Error, la iteracion no convergio\n"); | |
return 0; | |
} | |
int main() { | |
//Aca utilizamos la funcion Secante con valor inicial x0 = 0.0, x1 = 1.2 | |
//Cantidad de iteraciones: 20, y error aceptado 0.0001 y funcion f. | |
double resultado = Secante (0.0, 1.2, 20, 0.00001, funcion); | |
printf ("Método de la Secante: %f\n", resultado); | |
printf ("Inicio de funcion 2 ===============\n"); | |
//Otra vez, con otra funcion. | |
resultado = Secante (0.0, 20, 10, 0.01, funcion2); | |
printf ("Método de la Secante: %f\n", resultado); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment