Dev - C++ - Regla falsa error al imprimir

 
Vista:

Regla falsa error al imprimir

Publicado por ERNESTO (3 intervenciones) el 18/02/2021 04:44:47
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/* Nombre del archivo: reglaFalsa
   Nombre del alumno: Ernesto García Camacho
   ID del alumno: 215406
   Fecha de creacion: 17 de febrero del 2021
   Descripcion del programa: Este programa lo que hace es aproximar de raiz de
   la ecuacion f(x)= x^2 (|cosx|^(1/2))-5 usando el metodo de regla falsa. Para ello utiliza
   dos funciones secundarias "reglaFalsa()" y "f()" y las manda a llamar con la
   funcion principal main()
*/
 
//Declaracion de encabezados
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
 
/*Aqui se declaran las funciones secundarias "reglaFalsa()" y "f()"
*/
void reglaFalsa(float xi, float xf, float error);
float f(float x);
 
//Definicion de funcion principal main()
void main(){
	/*Declaracion de variables a utiliar. "xi" para el valor inicial, "xf" para
	el valor final, y "error" para el error aproximado maximo
	*/
	float xi;
	float xf;
	float error;
 
	//Se de la un mensaje de bienvenida e introduccion al usuario
	printf("\nBienvenido/a, esta funcion usa el metodo de la regla falsa para aproximar la raiz de f(x)= x^2 (|cosx|^(1/2))-5");
 
	/*Se le empiezan a pedir los datos a usar, y a su vez de registran en las
	variables declaradas
	*/
	printf("\nIngrese el valor inicial");
	printf("\nxi= ");
	scanf("%f", &xi);
	printf("\nIngrese el valor final");
	printf("\nxf= ");
	scanf("%f", &xf);
	printf("\nIngrese el valor de error aproximado maximo");
	printf("\nError= ");
	scanf("%f", &error);
 
 
	/*Se manda llamar a la funcion secundaria "biseccion()" usando como parametros
	los valores ingresados por el usuario
	*/
	reglaFalsa(xi, xf, error);
 
	getch();
}
 
/*Definicion de la funcion secundaria reglaFalsa() la cual se encargara de
calcular el valor aproximado de la raiz de la funcion
Recibe como parametros el valor inicial, el valor final, y el error
aproximado maximo
*/
void reglaFalsa(float xi, float xf, float error){
	/*Se declaran las variables a usar. "er" sera el valor del error aproximado
	que se ira calculando en cada iteracion del metodo.
	"xr1" sera el valor viejo y "xr2" el valor nuevo de xr al momento de
	calcular el error aproximado en cada iteracion
	"y" sera el valor al evaluar la funcion en xr
	"fxi" sera el valor al evaluar la funcion en xi
	"fxf" sera el valor al evaluar la funcion en xf
	En la variable "n" se iran guardando el numero de iteraciones
	*/
	float er=1;
	float xr2=1;
	float xr1;
	int n=1;
	float y;
	float fxi;
	float fxf;
 
	//Se despliega el encabezado de la tabla
	printf("\n    X       Y     Iteraciones");
	printf("\n---------------------------");
 
	/*Se crea el ciclo while, el cual se estara repitiendo mientras el valor
	del error aproximado maximo sea mayor al ingresado por el usuario.
	Notese que se toma el valor absoluto, esto es debido a que a veces el error
	toma valores negativos, lo cual causa que el ciclo while se detenga,
	para ello se asegura que siempre
	salga un valor positivo en el porcentaje de error
	*/
	while (er>error){
		//Se iguala xr1 al valor anterior de xr
		xr1=xr2;
		//se evalua la funcion en xi
		fxi=f(xi);
		//se evalua la funcion en xf
		fxf=f(xf);
		//Se calcula el valor nuevo de xr
		xr2=xi-(((xf-xi)/(fxf-fxi))*fxi);
		//se evalua la funcion en xr
		y=f(xr2);
 
		/*Se depliega en la tabla el valor calculado de xr, el valor de Y para
		esa xr, y el numero de iteracion
		*/
		printf("\n%f %f     %d", xr2, y, n);
 
		/*Se calcula el error aproximado. Notese que se toma el valor absoluto,
		esto es debido a que a veces el error toma valores negativos, lo cual
		causa que el ciclo while se detenga, para ello se asegura que siempre
		salga un valor positivo en el porcentaje de error
		*/
		er=abs((xr2-xr1)/xr2)*100;
 
		/*Si al multiplicar f(xi)*f(xr) da negatico, entonces xr sera xf en la
		siguiente iteracion
		*/
		if ((fxi*y)<0){
			xf=xr2;
		};
		/*Si al multiplicar f(xi)*f(xr) da positivo, entonces xr sera xi en la
		siguiente iteracion
		*/
		if ((fxi*y)>0){
			xi=xr2;
		};
		/*Si al multiplicar f(xi)*f(xr) da 0, entonces significa que no se haran
		mas calculos, por lo que se termina el ciclo con un break
		*/
		if ((fxi*y)==0){
			break;
		};
 
		//contador de iteraciones
		n=n+1;
	}
	printf("\n\nEl valor del error en la ultima iteracion fue de %f por ciento", er);
}
 
/*Declaracion de la funcion que calcula los valores de f(x)
recibiendo el valor de xr a calcular
*/
float f(float x){
	//con el valor de xr se calcular el valor de f(x)
	float y= pow(x,2)*(pow(abs(cos(x)),.5))-5;
 
	//Regresa el valor calculado
	return y;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder