Skip to content

Instantly share code, notes, and snippets.

@tian2992
Last active December 16, 2015 16:29
Show Gist options
  • Save tian2992/5463654 to your computer and use it in GitHub Desktop.
Save tian2992/5463654 to your computer and use it in GitHub Desktop.
Sacar raices de manera aproximada con el metodo de la secante iterativo.
#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