Regla Del Trapecio

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 3

I.

EXPLICAR EN QUÉ CONSISTE LA REGLA DEL TRAPECIO


b
La regla del trapecio estima ∫ f (x )dx mediante la división del intervalo [a , b] en n
a
segmentos iguales, calculando la siguiente suma:

Dónde:

b−a
h=
n
y Xi=a+ih; i=0 , 1 , … ,n .

Para realizar este cálculo mediante un algoritmo paralelo, se divide el intervalo


[a , b] entre los procesos, pero haciendo que cada proceso calcule la integral de
f ( x) sobre su sub intervalo. Entonces, para estimar la integral completa, se
suman los cálculos locales de cada proceso.

Es decir, si tenemos p procesos y n segmentos, y n es divisible entre p. En este


caso el primer proceso calculará la integral delos primeros n / p segmentos, el
segundo proceso calculará el área de los siguientes n / p segmentos y así
sucesivamente. Consiguientemente, siguiendo esta regla, el proceso q estimará la
integral sub intervalo, de esta manera:

Entonces, cada proceso necesita la siguiente información:

- El número de procesos p.
- Su identificador.
- El intervalo de integración completo [a , b].
- El número de segmentos n .
- La función f ( x) a integrar.

Por consiguiente:

Los dos primeros datos se pueden conseguir llamando a las funciones


MPI_Comm_size() y MPI_Comm_rank(). Pero, tanto el intervalo [a , b] como el
número de segmentos n deben ser introducidos por el usuario.

Por otro lado, sólo un proceso, que casi siempre es el proceso 0 , debe encargarse
de obtener los datos de la entrada y distribuirlos entre los demás procesos. Esto
puede hacerse mediante paso de mensajes o mediante comunicación colectiva,
esta última es la más eficiente.

Una buena forma de sumar los cálculos individuales de los procesos es hacer que
cada proceso envíe su cálculo local al proceso 0 y que este proceso 0 realice la
suma final.

Entonces, la regla del trapecio consiste en la división del dominio en pequeños


grupos de tareas, con el objetivo de solucionar las operaciones de cada tarea en
diferentes procesos y así poder obtener la solución en menos tiempo:

1. Cada proceso se auto asigna su propio intervalo de integración.


2. Cada proceso integra f ( x) en su propio intervalo con el método de los
trapecios.
3. Cada proceso con rango=! 0 envía su resultado al proceso 0 .
4. El proceso 0 suma los resultados de los cálculos realizados por los demás
procesos e imprime el resultado.

II. COLOQUE UN EJEMPLO DE APLICACIÓN

Código de aproximación de integrales mediante la regla del trapecio:

#include <stdio.h>
#include “mpi.h”

/* Prototipo de la función que integra */


float Trap(float local_a, float local_b, int local_n, float h);
main (int argc, char *argv[ ])
{
int mi_rango; /* El rango de mi proceso*/
int p; /* Número total de procesos */
float a = 0.0; /* Extremo izquierdo */
float b = 1.0; /* Extremo derecho */
int n = 1024; /* Número de trapecios */
float h; /* Base de cada trapecio */
float local_a; /* Extremo izquierdo de mi proceso */
float local_b; /* Extremo derecho de mi proceso */
int local_n; /* Número de trapecios para mi cálculo */
float integral; /* Resultado de la integral en mi intervalo */
float total; /* Integral total */
int fuente; /*Proceso que remite el resultado */
int dest = 0; /* Todos los resultados van al proceso 0 */
int tag = 0;
MPI_Status status;
MPI_Init(&argc, &argv); /* Arrancamos MPI */
MPI_Comm_rank(MPI_COMM_WORLD, &mi_rango); /*Obtengo mi propio
rango */
MPI_Comm_size(MPI_COMM_WORLD, &p); /*Obtengo # total de procesos */
h = (b-a)/n; /* h es el mismo para todos los procesos */
local_n = n/p; /* igual que el número de trapecios */

/* La longitud del intervalo de integración de cada proceso es igual a local_n*h.


Entonces, el intervalo empieza y acaba en: */
local_a = a + mi_rango*local_n*h; local_b = local_a + local_n*h;

/* Calculamos la integral en el intervalo */


integral = Trap(local_a, local_b, local_n, h);

if (mi_rango == 0)
{
/* Sumo los cálculos de cada proceso, que me envían los demás */
total = integral;
for (fuente = 1; fuente < p; fuente++)
{
MPI_Recv(&integral, 1, MPI_FLOAT, fuente, tag, MPI_COMM_WORLD,
&status);
total = total + integral;
}
}
else {
/* Envío mi resultado al proceso 0 */
MPI_Send(&integral, 1, MPI_FLOAT, dest, tag, MPI_COMM_WORLD);
}
if (mi_rango == 0)
{
/* Imprimo resultados */
printf(“Con n = %d trapecios, la integral de f(x) ", n);
printf(“desde %f a %f = %f\n", a, b, total);
}
/* Cerrar MPI */
MPI_Finalize();
}

También podría gustarte