-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSolEcRecurs.cpp
65 lines (51 loc) · 2.1 KB
/
SolEcRecurs.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
* Pedro José Bailón Soto
* Realizado en Qt Creator 4.8.0, basado en Qt 5.12.0 (GCC 8.2.1 20181127, 64 bit)
* Bisection method applied to f(x) = x³ + 4x² - 10
* Realizado el día 22 - 01 - 2019
*
* */
#include <iostream>
#include <cmath> //Para utilizar abs() con cualquier número
#include <iomanip> //Agregar la presición deseada
#include <time.h> //Para medir el tiempo de ejecución del programa
#define e 0.0001 //Se maneja el error como una constante que no puede cambiar
using namespace std;
static double calcular(double p_i_aux, double a, double b); //Función recursiva para calcular P_n
static double f(double equis); //Función para ejecutar la función f(x) = x³ + 4x² - 10
int sumar(int* i); //Función para agregar números al contador 'i'
static int i = 1; //Se declara la variable de forma global para que se pueda llamar desde cualquier función
int main(){
clock_t start = clock();
double a = 1, b = 2 , p_i_aux = 0;
calcular(p_i_aux, a, b);
cout << "Tiempo transcurrido: " << clock()-start << endl;
}
double calcular(double p_i_aux, double a, double b){
/* La variable p_i es P_n y p_i_aux es P_(n-1), absol es la variable que contiene el error
*
* */
double p_i = (a + b)/2;
double absol = abs(p_i - p_i_aux)/abs(p_i); //Aquí se calcula el error relativo
cout << setprecision(7) << "i: " << i << " a: " << a << " b: " << b << " Pn: " << p_i
<< " f(an): " << f(a) << " f(Pn): " << f(p_i)<< " Err: " << absol << endl;
if(absol < e){
return p_i; //Es para salir de la función
}else{
if(f(p_i)*f(a) > 0){ //Si los valores de la función evaluada en P_n y 'a' son positivos, 'a' se convierte en P_n
a = p_i;
}else{ //De lo contrario 'b' se convierte en P_n
b = p_i;
}
p_i_aux = p_i; // Se asigna el valor de P_n a P_(n-1)
i+=1;
return calcular(p_i_aux, a, b); //En caso de que no se cumpla la condición, se genera la recursividad.
}
}
double f(double equis){
return pow(equis , 3) + 4*pow(equis, 2) - 10;
}
int sumar(int* i){
*i+=1;
return *i;
}