Técnicas Programadas en Visual Basic para Aproximación a Integrales Por Harvey Triana Este articulo presenta técnicas programadas en Visual Basic para integración numérica por métodos elementales. Resulta bastante útil en Ingeniería aplicada y para estudiantes de las áreas del Calculo Infinitesimal. En un contexto formal, la integral es la función antiderivada de una función f(x). La integración numérica es aplicable en los siguientes caso: (1) La antiderivada no es simple de resolver, (2) Se desea determinar el área bajo la curva de una serie de datos empíricos o valores tabulados, lo que implica una incerti dumbre de f(x). (3) La antiderivada conduce a funciones cuyas p ropiedades no han sido estudiadas o cuyos valores no han sido tabulados. Personalmente he aplicado la integración numérica dado el problema o razón (2) La idea básica es muy sencilla, se aproxima el integrando mediante segmentos pequeños de otra función cuya integral es de fácil cálculo, p.e. una trapecio. El propósito del presente documento no es enseñar o demostrar los teoremas y formulas, sino dar una aplicación a través de un programa Visual Basic..
Ejemplo La antiderivada de 1/x es Log|x|. Supongamos que la antiderivada no se conociera, que la función f(x) tuviera una antiderivada bastante compleja, o que solo contáramos con una serie de datos empíricos y requerimos conocer el área bajo la curva. En estos caso, la solución puntual (un valor), o la integral, se calcula por Técnicas numéricas. Caso concreto: hallar la integral de 1a 2 de f(x) = 1/x. Como conocemos la antiderivada de f(x) = 1/ x es Log(x) + C, rápidamente podemos decir que es Log(2) - Log(1), (logaritmos neperianos o en base Euler) y con el uso de una calculadora, obtengo 0.69... ¿Cómo solucionaría esto si no conociera la antiderivada?.
1. Obtengo valores de la función f(x) desde a hasta b, con un incremento discreto (entre menor es el intervalo, más precisa será la aproximación numérica):
i 0 1 2 3 4 5 6 7 8 9 10
x 1.000 1.100 1.200 1.300 1.400 1.500 1.600 1.700 1.800 1.900 2.000
f(x) 1.00000 0.90909 0.83333 0.76923 0.71429 0.66667 0.62500 0.58824 0.55556 0.52632 0.50000
Aplico la formula de algún método numérico para aproximar Integrales. Los más conocidos y elementales son:
Regla de lo Trapecios:
Regla de Simpson Generalizada:
El termino E se refiere al error que implica la técnica numérica. El error tiene una connotación teórica y en la práctica no se aplica. La Regla de Simpson es más precisa que la Regla de los Trapecios, pero se li mita a la condición de que n sea impar (el método se basa en aproximación a segmentos de parábola cada 3 punto). Bien, empleo cualquiera de las funciones TrapeciosRule o SimpsonRule que anexo al final de este articulo, de la siguiente manera: Uso un array y() de tipo Single y almaceno los valores de f(x). Finalmente aplico Resultado = TrapeciosRule(a, b, n, y()), Donde a =1, b = 2 y n = 10. En código que use fue:
n = 10 ReDim y(0 To n) As Single a = 1 b = 2 x = 0 For i = 0 To n x = a + i * (b - a) / n y(i) = 1 / x Next Resultado = TrapeciosRule(a, b, n, y()) Los resultados son los siguientes:
Antidifferentiation Trapecios Rule Regla de Simpson
= 0.693147 = 0.693773 Error: -0.09 % = 0.693152 Error: 0.00 %
Funciones para Integración Numérica Public Function TrapeciosRule( _ a As Single, b As Single, n, y() As Single _ ) As Single 'Apostol 735 Dim i, s As Single For i = 1 To n - 1 s = s + y(i) Next TrapeciosRule = 0.5 * (b - a) * (y(0) + 2 * s + y(n)) / n End Function Public Function SimpsonRule( _
a As Single, b As Single, n, y() As Single _ ) As Single If n Mod 2 Then SimpsonRule = -999.25 'Retorna una bandera de error Exit Function End If '//Apostol 742 Dim i, s1 As Single, s2 As Single, Par As Boolean For i = 1 To n - 1 If Par Then s2 = s2 + y(i) Else s1 = s1 + y(i) End If Par = Not Par Next SimpsonRule = (b - a) * (y(0) + 4 * s1 + 2 * s2 + y(n)) / 3 / n End Function
Hola, En el código este deberías darle un nombre distinto al seno. Con seno(z) estas diciéndole que busque un vector llamado "seno" y le saque la posición z. Aquí no usas vectores así que nada. Después, en el Next no tienes que poner "Next z", eso ya lo defines al poner For z = 0 To 100. Te propongo mi solución: Private Sub Command1_Click() 'declaro variables Dim seno As Double Dim seno_temp As Double 'Variable para almacenar temporalmente el valor del seno antes de
sumarlo a seno Dim fact As Double Dim z As Integer Dim n As Double Dim a As Single Dim x As Single 'suma acumulativa y calculo factorial para cada valor de "z" seno = 0 x = Val(Text1.Text) For z = 0 To 100 n = (2 * z + 1) 'Calculo el factorial If n = 1 Then fact = 1 Else fact = fact * (n + 1) * (n + 2) 'Hallo el valor de "seno" y sumo
seno_temp = ((-1) ^ z) * (x ^ n) / (n * fact)
seno = seno + seno_temp Next
Text3.Text.SetFocus End Sub Marcado en negrita lo que deberías corregir. Espero que te sirva. Saludos