/* =============================================================================================
   Wilfredo Cruz Yarlequé                              wcruzy@gmail.com
   Piura, Perú, Noviembre 28 de 2024
   
   =============================================================================================
   Cálculo del área bajo la curva f(x) entre dos límites (x_inicio y x_final) utilizando el
   método del trapecio.

   Paso 1
   Es un cálculo iteractivo que empieza calculando el área se realiza calculando el área de un
   trapecio cuyas bases son (fx_inicio), f(x_final) y con altura (x_final - x_inicio)

   Paso 2
   El siguiente cálculo del área toma dos trapecios, el primero con bases f(x_inicio) y
   f(x_medio), y altura (x_final + f_inicio)/2. El segundo trapecio con bases f(x_medio) y
   f(final), con altura (x_final + f_inicio)/2. El área total será la suma de la primera área
   más la segunda área.

   Paso 3
   Si la diferencia absoluta del área del paso 1 menos el area del paso 2 es menor o igual al
   error_limite (valor que se lee o se determina fijo), habremos llegado al área buscada, caso
   contrario, se calculará el área con cuatro trapecios, luego con ocho trapecios y así
   sucesivamente hasta encontrar dos áreas calculadas consecutivamente con una diferencia menor
   o igual al error_limite


   Para la siguiente función:
   
                       f(x) = - 3x^3 - 6.25x^2 + 21x + 500

   Calcular el área bajo la curva entre 1 y 4 respectivamente con un error de 0.01.
   ============================================================================================= */

#include <stdio.h>
#include <math.h>

float fx(float);

void main()
{
	float a, b;
	float m, n, x, area, areai, arean, error;
	float l1;
	int k;

	n = 2.0;

	printf("\n---------------------------------------------------\n");
	printf("Ingrese limite inferior: ");
	scanf("%f", &a);

	printf("Ingrese limite superior: ");
	scanf("%f", &b);

	printf("\nIngrese error: ");
	scanf("%f", &error);
	printf("\n---------------------------------------------------\n");

	area = (fx(a) + fx(b)) / 2 * (b - a);

	printf("\nArea inicial: %6.2f", area);
	arean = area;

	do
	{
		areai = arean;
		m = (b - a) / n;
		arean = 0.0;
		k = 1;
		l1 = a;

		while (k <= (int)n)
		{
			arean = arean + (fx(l1) + fx(l1 + m)) / 2 * m;
			l1 = l1 + m;
			k++;
			printf("\nArea bajo la curva: %8.3f", arean);
		}

		n=n+n;
		printf("\n");
	} while (fabs(areai - arean) > error);

	printf("\n\nArea bajo la curva: %8.3f\n\n", arean);

	return;
}

float fx(float x)
{
	float fx;

	fx = - 3.0 * pow(x, 3) - 6.25 * pow(x, 2) + 21.0 * x + 500.0;

	return fx;
}