Scilab, Función para Interpolación Lineal

Scilab, Función para interpolación lineal

En el post anterior elaboramos un script para realizar la interpolación lineal, dado dos vectores X e Y con las coordenadas x e y de puntos. En este post vamos a transformar el script en una función.

Una función da mayor flexibilidad, ya que los vectores X e Y no deben ser editados en el script, si no que se pueden crear diferentes vectores en la consola y aplicar la función de forma general a ellos.

La función será llamada Lineal y se guardará en un archivo llamado Lineal.sci

// funcion para interpolar dados dos vectores y un valor de x

function y=Lineal(X, Y, x)

n=length(X);

val=x

for i=1:n

if X(i)==val then

valy=Y(i)

break

else

if X(i)>val then

cota_sup=i;

cota_inf=i-1;

deltaX=X(cota_sup)-X(cota_inf);

deltaY=Y(cota_sup)-Y(cota_inf);

m=deltaY/deltaX;

valy=Y(cota_inf)+m*(val-X(cota_inf));

break

end

end

end

y=valy

endfunction

Esta función utiliza la misma rutina que el script creado en el post anterior, pero tiene mayor flexibilidad, al permitir utilizar otros vectores de datos, así como vectores en los valores de x a interpolar.

Para utilizar la función la podemos cargar desde el editor de Scilab, SciNotes. Simplemente hay que presionar el icono de ejecutar en la barra de herramientas de SciNotes.

Una vez ejecutada, la función es cargada a la consola y puede ser utilizada como cualquier función de Scilab.

Para invocar a la función primero creamos los dos vectores que contendrán las coordenadas x e y de los puntos, el vector X debe estar ordenado de forma ascendente, también creamos una variable que contendrá el valor o los valores para los cuales queremos calcular la interpolación.

En lugar de interpolar en un solo valor, la variable x puede contener un vector de valores a interpolar.

Como puede notarse existe mayor flexibilidad al utilizar está función en lugar del script.

Anuncios

Interpolacion lineal con Scilab

Interpolación Lineal con Scilab

Cuando se tiene una serie de puntos de coordenadas (xi, yi), la forma más sencilla de conseguir el valor correspondiente a un punto intermedio entre dos puntos consecutivos (xi, yi) y (xi+1, yi+1) es utilizando interpolación lineal.

Entre el punto p1 y p2 se puede trazar una línea, sobre la cual podemos ubicar los puntos intermedios ubicados entre p1 y p2. La ecuación de la recta es :

lineal-02

Donde m es la pendiente de la recta entre los dos puntos

lineal-03

Hacerlo de forma grafica es muy sencillo, solo tenemos que ubicar el valor de x que queremos interpolar entre dos puntos. Seleccionamos los punto inferior y superior y aplicamos la fórmula de interpolación lineal.

Para realizar esta misma operación en Scilab creamos dos vectores que representan las coordenadas x e y de los puntos. Denominaremos X el vector de coordenadas x e Y el vector de coordenadas y de los puntos. Para saber cuando un valor de x al cual queremos obtener un valor interpolado, debemos preguntar cuando el valor de x es mayor que un valor xi en el vector X, cuando conseguimos el primer valor para el cual x es mayor que xi entonces (xi, yi) se convierten en la cota inferior del intervalo de interpolación y (xi+1, yi+1) se convierten en la cota superior. Se calcula la pendiente entre estas dos cotas y se aplica la ecuación de la recta para obtener el valor interpolado y de la coordenada x.

A continuación se presenta un script muy sencillo para hacer esta operación.

// SCRIP para Interpolación Lineal

// Ingresar dos vectores X e Y donde los valores de X

// esten ordenados en orden ascendente

X=[1,2,3,4,5,6,7,8,9,10];

Y=[100,200,300,400,500,600,700,800,900,1000]

// calcular la longitud del vector X

n=length(X);

// val es el valor x para el cual se va a obtener la interpolación

val=4.8

// se crea un loop para preguntar cual es el primer valor de X es mayor

// que val

// cuando se consigue ese valor se determinan los puntos inferior y superior

// se calcula la interpolación lineal y se sale del ciclo.

for i=1:n

if X(i)>val then

cota_sup=i;

cota_inf=i-1;

deltaX=X(cota_sup)-X(cota_inf);

deltaY=Y(cota_sup)-Y(cota_inf);

m=deltaY/deltaX;

valy=Y(cota_inf)+m*(val-X(cota_inf));

disp(cota_sup,cota_inf,valy)

break

end

end

En lugar de efectuar un script puede crearse una función y ser más flexible en el cálculo de interpolación. Esto lo analizaremos en próximos posts.

Módulos en Python: Módulos incluidos

Módulos en Python: Módulos incluidos

En el artículo anterior introducimos el concepto de módulos en python, y vimos que que un módulo no es más que un programa que actúa como un contenedor de funciones. Vimos que los módulos pueden ser importados y podemos hacer uso de las funciones que están contenidos en el módulo referenciando el nombre del módulo seguido de un punto y luego el nombre de la función. También aprendimos que podemos importar funciones específicas de un módulo, así como cambiar el nombre de la función importada. Comenzamos describiendo brevemente el módulo math. En este artículo y en los próximos describiremos con un poco más de detalle las funciones que están contenidas en el módulo math y describiremos otros modulos que estan incluidos en python.

Módulo math

El módulo math está constituido por funciones matemáticas, las cuales no se aplican a números complejos. Estas funciones están divididas en las siguientes categorías:

  1. Funciones de Teoria de Numeros y Representación
  2. Funciones Potenciales y Logarítmicas
  3. Funciones Trigonométricas
  4. Funciones de Conversión Angular
  5. Funciones Hiperbólicas
  6. Funciones Especiales
  7. Constantes

Funciones de Teoria de Numeros y Representación

math.ceil(x)

Esta función devuelve el valor del techo (ceiling) del valor x. En términos simple devuelve el número entero que es mayor o igual que x. Por ejemplo si aplicamos la función a un número entero, devolverá el valor del número, si colocamos un número de tipo float, devolvera el numero entero mayor a x.

>>>

>>> math.ceil(18)

18

>>> math.ceil(18.1)

19

>>> math.ceil(18.95)

19

>>>

math.copysign(x,y)

Devuelve un número de tipo float con la magnitud (valor absoluto) de x, y con el signo de y. En algunas plataformas se acepta el uso de cero con signo.

>>> math.copysign(2.56, -7)

-2.56

>>> math.copysign(2.56, -0.0)

-2.56

>>> math.copysign(2.56, 0.0)

2.56

>>> math.copysign(-2.56, 0.0)

2.56

>>>

math.fabs(x)

Devuelve el valor absoluto del valor x.

>>>

>>> math.fabs(5.754)

5.754

>>> math.fabs(-5.754)

5.754

>>>

math.factorial(x)

Devuelve el valor de la función factorial de un número. Da error si se aplica a números no enteros y a números negativos.

Factorial(n) = n*(n-1)*(n-2)* …..1

Factorial(8) = 8*7*6*5*4*3*2*1

>>> math.factorial(8)

40320

>>> math.factorial(-8)

Traceback (most recent call last):

File “”, line 1, in

math.factorial(-8)

ValueError: factorial() not defined for negative values

>>> math.factorial(8.25)

Traceback (most recent call last):

File “”, line 1, in

math.factorial(8.25)

ValueError: factorial() only accepts integral values

math.floor(x)

Devuelve el piso (floor) de x. Este es el valor del mayor entero que es menor o igual que x.

>>>

>>> math.floor(8)

8

>>> math.floor(8.05)

8

>>> math.floor(8.99)

8

>>>

math.fmod(x,y)

Esta función calcula el módulo de x con respecto a y. Esto es equivalente al residuo de la división de x entre y. Esta es una función útil para definir la divisibilidad de un número por otro número. Si el módulo de x de y es igual a cero, entonces x es divisible por y.

>>> math.fmod(27,3)

0.0

>>> math.fmod(28,3)

1.0

>>>

math.frexp(x)

Devuelve la mantisa y exponente de un número x, como un par (m, e). Donde m es un número de tipo float y e es un entero de forma que, x==m*2**e exactamente. Si x es cero, devuelve (0.0, 0), de cualquier otra forma 0.5 <= abs(m) < 1. Esto se utiliza para separar la representación de un número tipo float en una forma portable.

>>> math.frexp(0)

(0.0, 0)

>>> math.frexp(5.1)

(0.6375, 3)

>>> 0.6375*2**3

5.1

>>>

math.fsum(iteración)

Calcula de forma exacta la suma de valores de punto flotante. Evita la perdida de precisión mediante el rastreo de las múltiples sumas parciales intermedias.

>>> 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1

0.9999999999999999

>>> math.fsum([0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1])

1.0

>>>

Se observa que una suma de 10 valores que debería resultar en un valor exacto de 1.0 daba un resultado de 0.99999999. Sin embargo cuando se utiliza math.fsum el valor da exactamente 1.0.

math.gcd(a,b)

Devuelve el valor del máximo común divisor de los números enteros a y b. Si a y b son dos enteros diferentes de cero, entonces el valor de gcd(a,b) es el valor del mayor entero positivo que divide a ambos números a y b. Si alguno de los números es cero, y el otro es un entero diferente de cero, entonces el maximo comun divisor es el entero diferente de cero.

>>> math.gcd(0,0)

0

>>> math.gcd(2,0)

2

>>> math.gcd(12,6)

6

>>> math.gcd(12,8)

4

>>>

math.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)

Devuelve True si los valores a y b están próximos el uno del otro, en caso contrario devuelve False.

Para considerar que a y b están próximos se utilizan las tolerancias relativas y absolutas.

La rel_tol es la tolerancia relativa. Es la máxima diferencia entre a y b , relativo al mayor valor absoluto de a o b. Por ejemplo para establecer una tolerancia de 5%, se utiliza una rel_tol=0.05. La tolerancia por defecto es 1e-09, lo que asegura que los dos valores son iguales dentro de aproximadamente 9 cifras decimales. La rel-tol debe ser mayor que cero.

La abs-tol es el valor de la minima tolerancia absoluta. Útil para comparaciones cerca de cero. La abs-tol debe ser al menos cero.

Cuando no se utilizan los parámetros rel_tol y abs_tol, se utilizan los valores por defecto de estos parámetros, por lo que al evaluar la función para los valores 1 y 1.005 da False.

>>> math.isclose(1, 1.005)

False

Hay que utilizar la identificación de los parámetros, de lo contrario da error.

>>> math.isclose(1, 1.005, 0.5, 0)

Traceback (most recent call last):

File “”, line 1, in

math.isclose(1, 1.005, 0.5, 0)

TypeError: Function takes at most 2 positional arguments (4 given)

En este ejemplo se coloca el parámetro rel-tol=0.05 y la función da un valor de True, lo que indica que 1 y 1.005 están cercanos cuando se utiliza una tolerancia relativa de 0.05 (5%).

>>> math.isclose(1, 1.005, rel_tol=0.05)

True

En este ejemplo se utilizan ambos parámetros rel_tol y abs_tol. La evaluación de la función nos indica que 1 y 1.0005 están cercanos cuando se evalúan con los parámetros de tolerancia indicados, rel_tol=0.05, abs_tol=0.001.

>>> math.isclose(1, 1.0005, rel_tol=0.05, abs_tol=0.001)

True

Para que la función de como resultado True debe cumplirse la siguiente la siguiente expresión:

abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol).

Estamos evaluando el valor absoluto de la diferencia entre a y b y los estamos comparando con el valor máximo entre las tolerancias relativas y absolutas. Si el valor máximo de las tolerancias no es mayor que el valor absoluto de las diferencias entre a y b, entonces los valores a y b no están cercanos y la función evaluará False.

math.isfinite(x)

Devuelve True si x no es infinito o NaN, y False en caso contrario. (0.0 se considera como finito).

math.isinf(x)

Devuelve True si x no es ni infinito ni NaN, y False en caso contrario.

math.isnan(x)

Devuelve True si x es NaN (Not a number) no un número, y False en caso contrario.

math.ldexp(x, i)

Calcula y regresa el valor numérico de la expresión

x * (2**i)

Esta función es esencialmente la función inversa de frexp(x)

>>> math.frexp(16)

(0.5, 5)

>>> math.ldexp(0.5, 5)

16.0

math.modf(x)

Regresa la parte fraccional y la parte entera de x. Ambos resultados tienen el signo de x y son de tipo float.

>>> math.modf(15.87654)

(0.8765400000000003, 15.0)

math.trunc(x)

Devuelve el valor real de x, truncado a un valor entero.

>>> math.trunc(15.87654)

15

>>> math.trunc(-1.4142)

-1

En el próximo artículo revisaremos las otras funciones que están contenidas en el módulo math.

Modulos en Python

Modulos en Python

Python tiene disponible en su forma interactiva IDLE las operaciones aritméticas y algunas funciones, sin embargo si se requieren utilizar funciones matemáticas adicionales, estas no están disponibles de forma directa. Para poder acceder a estas funciones hay que importar un módulo que contenga las funciones matemáticas, este módulo tiene por nombre math. Leer más “Modulos en Python”

Introducción al Balance de Materia

Introducción al Balance de Materia

El balance de materia aplicado a la ingeniería de yacimiento es una técnica que se basa en las leyes de la conservación de la masa y la energía y que se ha utilizado casi desde el comienzo de la industria del petróleo, su finalidad es determinar el petróleo original en sitio, ayudar a definir el volumen de intrusión de agua del acuífero asociado al yacimiento y estimar el tamaño de la capa de gas en caso de que existan.

Para utilizar el balance de materia se necesita tener un histórico de los volúmenes de los fluidos producidos, así como de la presión estática promedio del yacimiento; se necesita conocer las propiedades de los fluidos en función de presión y temperatura (datos PVT), se necesitan conocer algunas propiedades de la roca, como la porosidad, la compresibilidad de la formación y la saturación de agua. Si existe un influjo de agua, también se necesita una función del influjo de agua como función de presión.

El balance de materia comenzó a ser utilizado en los años 1920s y 1930s. En 1929 Coleman, Wilde y Moore desarrollaron una ecuación definiendo la relación entre la presión de yacimiento y los volúmenes de gas y aceite producidos; el petróleo y gas remanente en el yacimiento y las propiedades de los fluidos. En 1936 Schilthuis modificó la ecuación propuesta por Coleman et al. Posteriormente numerosos autores han ido desarrollando la ecuación de balance de materia, en algunos casos para hacerla de aplicación general y en otros para desarrollar métodos de análisis para considerar el influjo de agua y la presencia de capa de gas. Entre los muchos autores podemos mencionar Tracy, 1955, efectuó una reordenación de la ecuación de balance de materia para facilitar su uso, también propuso mejoras en el procedimiento de predicción, incluyendo la relación de gas instantánea. En 1953 Van Everdingen, Timmerman y McMahon propusieron un método para la determinación del petróleo en sitio y el influjo de agua, utilizando un cálculo independiente del influjo de agua e incorporarlo en la ecuación de balance de materia, la cual debe ser lineal cuando se utilizan los valores correctos de influjo de agua y N. En 1961 McEwen analiza diferentes formas de expresar la ecuación de balance de materia como una línea recta y selecciona una donde la Expansión más el Influjo de Agua es igual a la Producción. Establece un procedimiento para calcular el influjo de agua e incorporarlo en la ecuación de balance de materia. En 1963 Havlena y Odeh proponen un método grafico para resolver la ecuación de balance de materia cuando se considera influjo de agua y/o capa de gas. En 1978 Campbell introdujo un análisis gráfico, que ayuda a comprender la dinámica de la energía que actúa en el yacimiento.

La aplicación de la ecuación de balance de materia fue la herramienta principal de análisis de yacimientos durante muchos años, antes de que el uso de computadoras se hiciera más común en la industria del petróleo. A pesar de que en la actualidad la simulación numérica es la opción preferida de análisis y pronóstico de yacimientos, aún sigue utilizándose la ecuación de balance de materia debido a que es una herramienta sencilla de utilizar, requiere una cantidad mínima de información y da una visión global de los principales elementos que intervienen como mecanismos de producción. Aun cuando se piense utilizar simulación numérica siempre es conveniente utilizar la ecuación de balance de materia.

Debido a que la ecuación de balance de materia es aún una herramienta de análisis muy importante, y que su uso es complementario, no excluyente de cualquier otro tipo de análisis, se recomienda tener un conocimiento de esta metodología. En este libro mostramos los elementos básicos de la ecuación general de balance de materia para yacimientos de petróleo, como interpretar la ecuación de balance de materia como la ecuación de una línea recta y como utilizar esta propiedad para utilizar diferentes reordenamientos y gráficos de diagnósticos para la determinación de los valores del petróleo original en sitio, influjo de agua y capa de gas. Espero que estas notas recogidas en este libro sean de utilidad para el lector.

Bibliografía

Introducción al Balance de Materia (Temas de Ingeniería de Yacimientos nº 1) (Spanish Edition) Kindle Edition

by Luis Brito (Author)

Suma de Paralelogramos

Integración Numérica: Método de Paralelogramos

Suma de paralelogramos

Este es el procedimiento más sencillo, fue la aproximación que utilizó Newton cuando desarrolló el cálculo integral.

Ya vimos que las sumas de Riemann son una aproximación adecuada para el cálculo de las áreas debajo de una función f(x) en el intervalo [a, b]. Si dividimos el intervalo entre a y b en n subintervalos de igual tamaño, se generarán n tiras rectangulares de igual ancho, h, ahora de acuerdo a la definición de Riemann, la altura de referencia en cada tira, puede ser cualquier valor de la función f(x), dentro del sub intervalo. Pero utilizar cualquier valor dentro del subintervalo, a pesar de que es teóricamente correcto, no es práctico desde el punto de vista de la automatización y estandarización del proceso.

Si la curva de función f(x) tiene pendiente positiva dentro del intervalo [a, b], si tenemos un sub intervalo [xi, xi+1] y tomamos como valor de la función el valor del extremo izquierdo de un sub intervalo f(xi), el área estimada por la suma de los paralelogramos será menor que el área verdadera. Entonces se obtendrá una aproximación por defecto al valor de la integral en el intervalo [a, b]. Esto se puede ver en la gráfica, donde los paralelogramos no cubren por completo el área debajo de la curva en el intervalo [2, 4]. En esta figura se utilizaron solamente dos sub intervalos para facilitar la visualización del concepto.

null

Si en lugar de utilizar el valor de la función en el extremo izquierdo del sub intervalo, utilizamos el valor de la función en el extremo derecho del sub intervalo, f(xi+1), entonces el área de los paralelogramos será mayor que el área verdadera. Entonces se obtendrá una aproximación por exceso al valor de la integral en el intervalo [a, b]. Esto se puede ver en la gráfica, donde los paralelogramos sobrepasan el área debajo de la curva en el intervalo [2, 4].

null

Ahora podríamos utilizar cualquier punto dentro del sub intervalo [xi, xi+1], pero para fines prácticos utilizaremos el punto medio del sub intervalo, xm= 1/2* (xi + xi+1) y utilizaremos el valor de la función en este punto, f(xm) como el valor de la altura del paralelogramo, en este caso se observa que la mitad del paralelogramo está en exceso y la otra mitad está en defecto, lo que produce cierto balance entre exceso y defecto, como se muestra en la figura.

null

En resumen, se puede decir que las opciones para el valor de la función f(x) en el sub intervalo son tres:

1.- En el extremo izquierdo del sub intervalo, se utiliza f(xi), es una aproximación por defecto, si la pendiente es positiva en el intervalo.

2.- En el extremo derecho del sub intervalo, se utiliza f(xi+1), es una aproximación por exceso, si la pendiente es positiva en el intervalo.

3.- En el punto medio del sub intervalo, f(xm), donde xm=1/2* (xi + xi+1), es una aproximación que tiene cierto nivel de balance.

A continuación, revisaremos los algoritmos utilizados para cada una de estas opciones y presentaremos algunos procedimientos en VBA Excel para la aplicación de los mismos.

Sumatorias Utilizando Ciclos For – Next

Para realizar sumatoria en VBA puede utilizarse un ciclo For – Next, el cual tiene la siguiente forma:

Hay que crear 2 variables una variable para almacenar el valor de la suma y una variable para que funcione como contador.

Por ejemplo, la variable i para ser el contador del ciclo For – Next y la variable Suma para almacenar la suma.

null

La estructura del ciclo For – Next consta de un contador, en este caso la variable i, que comienza con un valor inicial, a y un valor final, b, antecedido por el comando To. Luego está el comando Step, para introducir el valor del delta que hay que ir sumando al valor de i hasta alcanzar el valor b. El comando Step es opcional, si no se coloca toma como valor predeterminado uno. Para finalizar el ciclo se utiliza el comando Next, [i], donde es opcional colocar el nombre de la variable utilizada como contador del ciclo.

Los valores de a, b y st no necesitan ser número enteros, son números reales, que podrían tener tipo de dato Integer o Long (en el caso de que utilicemos valores enteros en la variable utilizada como contador); Single o Double ( en el caso de utilizar valores reales). Recomendándose el uso de Double.

Como en lugar del valor del delta x, por lo general se utiliza el número de sub intervalos entre a y b, n. Entonces delta x = (b – a )/n

Caso 1: Valor de la función en el extremo izquierdo.

El procedimiento a seguir es el siguiente:

1.- Definir la función a la cual se le va a calcular la integral

2.- Definir el intervalo [a, b]

3.- Establecer el número de sub intervalos, n (número de paneles).

4.- Calcular el valor de delta x=(b-a)/n.

5.- Establecer el ciclo For – Next desde a hasta (b-delta x), con paso (step) igual a delta x.

6.- Calcular el Producto de f(xi)*delta x para cada sub intervalo.

7. Efectuar la suma de Riemann de todos los productos de f(xi)*delta x, el resultado es la aproximación de la integral en el intervalo [a, b].

A continuación, se muestra una función definida por el usuario (UDF) para estimar el valor de la integral usando el valor de la función en el punto izquierdo del sub intervalo. Se ha creado una función para insertar la función a la que se le va a calcular integral.

Public Function ff1(x As Double) As Double

ff1 = x ^ 2 + 3

End Function

###

Public Function SumaP1(a As Double, b As Double, n As Long) As Double

Dim deltax As Double

deltax = (b – a) / n

Dim fi1 As Double

Dim sumpanel As Double

Dim i As Double

sumapanel = 0

For i = a To (b – deltax) Step deltax

fi1 = ff1(i)

sumapanel = sumapanel + fi1 * deltax

Next i

SumaP1 = sumapanel

End Function

Caso 2: Valor de la función en el extremo derecho.

El procedimiento a seguir es el siguiente:

1.- Definir la función a la cual se le va a calcular la integral

2.- Definir el intervalo [a, b]

3.- Establecer el número de sub intervalos, n (número de paneles).

4.- Calcular el valor de delta x=(b-a)/n.

5.- Establecer el ciclo For – Next desde (a + delta x) hasta b, con paso (step) igual a delta x.

6.- Calcular el Producto de f(xi+1)*delta x para cada sub intervalo.

7. Efectuar la suma de Riemann de todos los productos de f(xi+1)*delta x, el resultado es la aproximación de la integral en el intervalo [a, b].

A continuación, se muestra una función definida por el usuario (UDF) para estimar el valor de la integral usando el valor de la función en el punto derecho del sub intervalo. Se ha creado una función para insertar la función a la que se le va a calcular la integral.

Public Function ff1(x As Double) As Double

ff1 = x ^ 2 + 3

End Function

###

Public Function SumaP2(a As Double, b As Double, n As Long) As Double

Dim deltax As Double

deltax = (b – a) / n

Dim fi1 As Double

Dim sumpanel As Double

Dim i As Double

sumapanel = 0

For i = (a + deltax) To b Step deltax

fi1 = ff1(i)

sumapanel = sumapanel + fi1 * deltax

Next i

SumaP2 = sumapanel

End Function

Caso 3: Valor de la función en el punto medio del intervalo.

El procedimiento a seguir es el siguiente:

1.- Definir la función a la cual se le va a calcular la integral

2.- Definir el intervalo [a, b]

3.- Establecer el número de sub intervalos, n (número de paneles).

4.- Calcular el valor de delta x=(b-a)/n.

5.- Establecer el ciclo For – Next desde a hasta (b – delta x), con paso (step) igual a delta x.

6.- Calcular el punto medio del intervalo xm=(xi +xi+1)/2

6.- Calcular el Producto de f(xm)*delta x para cada sub intervalo.

7. Efectuar la suma de Riemann de todos los productos de f(xm)*delta x, el resultado es la aproximación de la integral en el intervalo [a, b].

A continuación, se muestra una función definida por el usuario (UDF) para estimar el valor de la integral usando el valor de la función en el punto derecho del sub intervalo. Se ha creado una función para insertar la función a la que se le va a calcular la integral.

Public Function ff1(x As Double) As Double

ff1 = x ^ 2 + 3

End Function

###

Public Function SumaP3(a As Double, b As Double, n As Long) As Double

Dim deltax As Double

deltax = (b – a) / n

Dim fi1 As Double

Dim sumpanel As Double

Dim i As Double

Dim m As Double

sumapanel = 0

For i = a To (b – deltax) Step deltax

m = (i + (i + deltax)) / 2

fi1 = ff1(m)

sumapanel = sumapanel + fi1 * deltax

Next i

SumaP3 = sumapanel

End Function

Comparación entre Casos

Para evaluar los 3 casos estudiados para la aproximación del valor de la integral se está utilizando la función f(x)= x^2+3. A continuación se muestra el valor analítico de la integral en el intervalo [0, 5].

null

Cuando se utiliza el valor de la función en los puntos extremos de los sub intervalos se obtiene una aproximación a la integral que puede ser por defecto, área menor que el área bajo la curva; o por exceso, área mayor que el área bajo la curva. Cuando se utiliza el valor de la función en el punto medio de los sub intervalos, se obtiene un balance entre las áreas en exceso y defecto, y la aproximación está bastante cerca del valor real de la integral, aún con un número pequeño de sub intervalos (n). En la figura se grafican el valor de las aproximaciones (eje de las Y) en función del número de sub intervalos utilizados (eje de las X), se muestran los tres casos, la curva de color azul, representando la aproximación por defecto y la curva de color rojo representando la aproximación en balance calculada en el punto medio de los sub intervalos y la curva de color naranja, representando la aproximación por exceso. Se observa que las aproximaciones por exceso y por defecto son simétricas y requieren más de 1000 sub intervalos para alcanzar valores más cercanos a la aproximación obtenida en el punto medio.

null

Al revisar la desviación porcentual, de las aproximaciones con respecto al valor analítico, se observa como la aproximación al utilizar el punto medio de los sub intervalos se acerca al valor analítico, con relativamente pocos subintervalos, n.

Bibliografía

Métodos Numéricos: Integración Numérica

https://www.amazon.com/dp/B06WLKTJPM

Suma de Rienmann

Suma de Riemann

Cuando se escucha hablar de integrales, las personas que han tenido algún contacto con el cálculo integral, casi automáticamente, lo asocian al valor de un área, esto quizás porque este fue uno de los primeros usos, que se le dio a esta herramienta del cálculo. A pesar de que el cálculo fue inventado por matemáticos como Isaac Newton y Gottfried Leibniz en el siglo XVII y desarrollado por una gran cantidad de matemáticos a partir de esa fecha, se conoce que Arquímedes manejaban un método, llamado de exhausción, que podría, muy bien, considerarse un antecesor al cálculo de integrales.

Newton introdujo la aproximación del cálculo de áreas debajo de curvas, utilizando rectángulos inscritos y rectángulos circunscritos, definiendo el concepto de que la igualdad en la relación entre las áreas de los rectángulos circunscritos e inscritos y que a medida que el ancho de las tiras rectangulares disminuye y el número de tiras aumenta al infinito, ambas áreas serán iguales y serán iguales al área debajo la curva.

null

La aproximación será más cercana al valor real del área irregular a medida que se aumenta el número de tiras rectangulares que se inscriben dentro del área.

null

La aproximación al área irregular es la suma de las áreas de todos los rectángulos inscritos dentro del área.

null

Donde l es longitud de la tira rectangular y h es el ancho de la tira. El ancho de las tiras puede ser igual o ser diferentes para cada tira.

Esas áreas son el sentido general simplemente un número, y su interpretación dependerá de que representan las variables l y h, por ejemplo:

Si l representa longitud y h representa ancho, entonces el área representa Area.

Si l representa velocidad y h representa un delta tiempo, entonces el área es Distancia.

Si l representa la tasa de producción y h representa un delta tiempo, entonces el área representa Producción Acumulada.

Si l representa la potencia y h representa un delta tiempo, entonces el área representa la Energía Consumida.

En términos generales l es una variable dependiente, que puede ser definida como una función f, de la variable dependiente. Por lo general utilizamos para la variable independiente las letras x, y algunas veces la letra t. Para la variable dependiente utilizamos la letra y=f(x).

null

La expresión a la derecha de la ecuación es lo que se conoce como una Suma de Riemann.

Definición

Supongamos que la función f(x) está definida para cualquier valor x en el intervalo [a, b]. La suma de Riemann para f(x) en el intervalo [a, b] es una expresión de la forma

null

El intervalo [a, b] ha sido dividido en n sub intervalos cuyas dimensiones son:

null

Una vez que la función f(x) ha sido definida y se ha definido un intervalo, una suma de Riemann se determina por la siguiente información.

1.- Una fragmentación del intervalo original, dividido en sub intervalos. Las dimensiones de los sub intervalos pueden ser iguales o diferentes.

2.- Un punto de muestreo para cada sub intervalo, el cual determina el valor de la función en cada sub intervalo.

Una suma de Riemann para la función f(x) es la suma de los productos de los valores de delta x y los valores de y=f(x).

Notación de Sumatoria

Cuando el número de sub intervalos es grande resulta inconveniente expresar la suma de Riemann como la suma de todos los elementos, por lo que se sustituye por un símbolo de sumatoria.

null

Así que una sumatoria de los productos de f(x) por delta x, en el intervalo [a, b] puede ser expresada de la siguiente forma:

null

Bibliografía

Brito, L: Métodos Numéricos: Integración Numérica

https://www.amazon.com/dp/B06WLKTJPM