Professional Documents
Culture Documents
2
Chapter 1
Para cientficos e ingenieros, el Excel constituye una herramienta com putacional muy p oderosa. Tambien tiene
gran utilidad para ser utilizado en la ensenanza de las ciencias y la Ingenie ra, particularm e nte, en la ensenanza
de los metodos numericos. Pese a que existen en el mercado programas computacionales muy sofisticados, tales
como M ATLAB, M ATH EM ATICA, etc., no estan tan disponibles como Excel, que usualme nte form a parte del
paquete basico de software instalado en las computadoras que funcionan ba jo el sistema W indows c de Microsoft.
A continuacion se brinda al lector una breve intro duccion a algunas actividades de programacion con macros
escritos en VBA (una adaptacion de Visual Basic para Office de Microsoft), definidos desde una ho ja electronica
de Excel. Salvo p equenas diferencias para versiones en ingles, el material puede ser desarrollado en cualquier
version.
cos(x)
f (x) = 2x 3 + ln(x) + sen(x)
ex
1. Como al evaluar f (x) se debe recurrir a varias funciones basicas que se invocan desde Excel, se puede
tener acceso a su sintaxis, pulsando el cono f x y seleccionar Matem aticas y Trigonometricas.
2. Para escribir una formula, seleccionamos una celda para escribir el valor a ser evaluado; p or ejemplo,
po dem os digitar el valor 1.1 en la celda B3.
3
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 4
3. Ahora en la celda C3 digitam os, de acuerdo a la sintaxis de la version de Excel en espanol 1 , la formula:
=2*B3^3+LN(B3) -COS(B3)/EXP(B3)+SENO(B3)
Una vez que ha sido digitada, simpleme nte se pulsa la tecla Entrar o Enter.
Figure 1.2: Al evaluar formulas, a menudo se requiere evaluar varias funciones predefinidas.
1. El valor de error #NOMBRE? aparece cuando Excel no recono ce texto en una formula. Deber revisar la
sintaxis de dicha formula o, si es una macro, verificar que este en un m odulo de esta ho ja.
2. El valor de error #VALOR! da cuando se utiliza un tip o de argume nto (u op erando) incorrecto. Este error
se da p or ejemplo, cuando evaluamos una funcion numerica en una celda que contiene algo que no sea un
numero (Por defecto, el contenido de una celda vaca es cero).
3. El valor de error #NUM! se aparece cuando hay un problema con algun numero en una formula o funcion.
Por ejemplo, si evaluamos una funcion logartm ica en cero o en un numero negativo.
1 La version que estam os usando esta en espanol. Por ejem plo, en la version en ingles de Excel, se usa SIN(x) en lugar de
SENO (x).
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 5
4. El valor de error #DIV/0! se produce cuando se divide una formula por 0 (cero).
5. El valor de error #REF! se da cuando una referencia a una celda no es valida.
6. Dependiendo de la form a en que este configurado el sistema W indows, deb e usarse punto o coma para
separar la parte decimal de los numeros a evaluar. Para p ersonalizarlo, se deb e entrar al panel de control
y en la Configuracion regional se selecciona N umeros. En la prim era cejilla, Smb olo Decim al se
selecciona el punto o la coma, segun sea el caso. Finalmente, se presiona el b oton Aplicar y luego
Aceptar.
7. Una situacion que a veces es confundida con un error se da cuando el sistema traba ja con p oca precision y
se presentan valores numericos no esperados. Por ejemplo, si el form ato de una celda se ha definido para
dos p osiciones, entonces la op eracion +1.999+1 efectuado en dicha celda dara como resultado el valor 2,
que no es otra cosa que el resultado de tal suma redondeado a dos decimales. El valor correcto se obtiene
aumentado la precision con el cono corresp ondiente:
Tambien se puede cambiar la precision en el menu Form ato -Celdas-Num ero-Posiciones decim ales.
Estos cambios son solo de apariencia, pues, independienteme nte del numero de dgitos que sean desplega-
dos, Excel manipula los numeros con una precision de hasta 15 dgitos. Si un numero contiene m as de 15
dgitos significativos, Excel convertira los dgitos adicionales en ceros (0).
Ejem plo 1
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 6
El siguiente ejemplo describ e una funcion con dos parametros y una variable.
K K P0
La funcion P (t) = , con A = , describe el tamano de una p oblacion en el momento t.
1 + Ae kt P0
Aqu:
. k es una constante de prop orcionalidad que se determina exp erimentalmente, dep endiendo de la poblacion
particular que esta siendo m odelada,
. P 0 es la poblacion inicial y
. K es una consta nte llam ada capacidad de contencion o capacidad maxim a que el medio es capaz de sostener.
Si queremos evaluar P (t) para distintos valores del tiem p o t en das, seguimos la siguiente secuencia de pasos:
1. Para em p ezar, es im portante escribir encab ezados en cada una de las columnas (o filas) donde vamos
a escribir los datos que seran los argume ntos de la funcion. En este caso, comenzando en la celda B3,
escribimos las etiquetas
P0 K k t P (t).
=C$4/(1+((C$4 -B$4)/B$4)*EXP(-D$4*E4))
Como puede observarse, el unico argume nto variable es t y nos interesa m antener a los otros argume ntos
constantes. Para mantener un valor (que se lea en una celda) constante, se le agrega el smb olo $ antes del
numero de fila, como p or ejemplo C$4.
En nuestro ejemplo, los argume ntos constantes son los que estan en las celdas B4, C4 y D4, mientras que
el valor de t en la celda E4, es variable.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 7
Figure 1.4: Evaluacion con parametros constantes y un param etro con un increme nto variable.
1. Podemos seleccionar la columna C para p oner los valores fijos P 0 , K , k y el increme nto h. En este caso,
por ejemplo, h = 5 servia como incremento entre un tiem po y el siguiente, iniciando con t = 0.
=+E4+C$6
Debemos usar C$6 para que el increme nto se mantenga inalterado al copiar esta op eracion en otra fila
celda situada en una fila diferente.
3. Ahora seleccionamos esta celda E5 y la arrastramos hacia aba jo para obtener los nuevos tiem pos con el
respectivo increme nto.
N ota: Esto tam bien se puede hacer escribiendo, en celdas consecutivas, un valor y luego el valor m as el incre-
mento y luego seleccionando ambas celdas y arrastrando. Sin embargo, en algunos algoritm os es m as com odo
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 8
1.3 G raficas
Continuando con el ejemplo anterior en el que se ha evaluado la poblacion P (t) en un conjunto de valores del
tiem po t, recordemos que en las columnas E y F se han escrito, resp ectivamente, los valores de t y P (t). Para
graficar P (t) con resp ecto a t, p ordemos seguir los siguientes pasos:
1. Seleccionamos el rango en el cual se encuentran los valores de t y P (t). Este rango puede incluir las celdas
que contienen los rotulos de las columnas.
3. Presionamos el b oton Siguiente y luego Finalizar . Antes de finalizar se pueden escoger distintas op-
ciones para p ersonalizar el grafico. A continuacion se muestra la salida del grafico.
Figure 1.7: Curva obtenida para el modelo logstico de crecimiento de una p oblacion.
Las unidades de codigo VBA se llam an macros. Las macros pueden ser procedimientos de dos tip os:
- Funciones (Function)
- Subrutinas (Sub) ).
Las funciones pueden aceptar argume ntos, como consta ntes, variables o expresiones. Estan restringidas a en-
tregar un valor en una celda de la ho ja. Las funciones pueden llam ar a otras funciones y hasta subrutinas (en
el caso de que no afecten la entrega de un valor en una sola celda)
Una subrutina realiza acciones especficas p ero no devuelven ningun valor. Puede aceptar argume ntos, como
constantes, variables o expresiones y puede llam ar funciones.
Con las subrutinas p o demos entregar valores en distintas celdas de la ho ja. Es ideal para leer parametros en
algunas celdas y escribir en otras para com pletar un cuadro de inform acion a partir de los datos ledos.
Para usar una funcion en una ho ja de Excel se deb e, en el editor de VB, insertar un m odulo y editar la funcion
en este m odulo. Esta accion de describ e m as adelante. De la misma manera se pueden editar subrutinas en un
m odulo.
Una funcion se invoca en una ho ja, como se invoca una funcion de Excel o una formula. Una subrutina se puede
invocar p or ejemplo desde la ventana de ejecucion de macros (Alt-F8) o desde un boton que hace una llam ada
a la subrutina (como respuesta al evento de hacer clic sobre el, p or ejem plo).
El codigo que ejecuta un b oton puede llam ar a subrutinas y a las funciones de la ho ja. El codigo del boton
no esta en un m odulo. En la ho ja de edicion donde se encuentra el codigo del b oton, se pueden implementar
funciones para uso de este codigo pero que seran desconocidas para la ho ja (mensa je de error #NOMBRE?).
N ota: un error frecuente es editar una funcion en un m odulo que corresp onde a una ho ja y llamarlo desde otra
ho ja. En este caso se despliega el error (mensa je de error #NOMBRE?).
1.4.2 Funciones
Una funcion tiene la siguiente sintaxis:
Instrucccion k
Nombre Fun = Valor de retorno comentario
End Function
Una funcion puede tener o no tener argume ntos, p ero es conveniente que retorne un valor. Observe que se deb e
usar el nombre de la funcion para especificar la salida:
N ota 1: Al interior de las funciones, se pueden hacer comentarios utilizando (antes de estos) la comilla ().
N ota 2: Para el uso de nombres de variables o de cualquier otra palabra reservada de VB A, no se discrimina
entre el uso de letras mayusculas y m inusculas.
cos(x)
f (x) = 2x 3 + ln(x) + sen(x)
ex
Para su definicion y utilizacion, se siguen los pasos:
1. Ingresamos al menu y en la opcion Herram ientas seleccionamos Macros. Luego se elige Editor de
Visual Basic:
2. Nuevamente, en el menu de la ventana que se abre, se elige Insertar, para luego seleccionar Modulo:
3. Ahora en la pantalla de edicion del m odulo, escribimos el siguiente codigo:
Function f(x)
f = 2 * x ^ 3 + Log(x) - Cos(x) / Exp(x) + Sin(x)
End Function
4. Una vez que ha sido editado el codigo del macro, se salva y salimos del ambiente de program acion en
Visual Basic para volver a la ho ja electronica de donde partim os. Esto se hace en el menu Archivo,
seleccionando Cerrar y Volver a Excel.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 11
5. Para evaluar la funcion f (x) en algunos valores que se lo calicen, por ejemplo, desde la fila 3 hasta la fila 6
de la columna B, nos situamos en una celda en la que nos interese dejar el resultado de dicha evaluacion
y se digita +f(B3). Luego se arrastra hasta C6 para copiar la formula, quedando:
N ota: Para cono cer con detalle la sintaxis de las funcione s matem aticas estandar que se pueden evaluar en
Visual Basic, puede usarse la Ayuda del Editor de Visual Basic. Esta sintaxis es un p o co diferente a
la que maneja Excel para las mismas funciones. Como ya vim os, para implementar la funcion
cos(x)
f (x) = 2x 3 + ln(x) + sen(x)
ex
Observe, p or ejemplo, que la funcion logaritmo natural ln(x), en Excel se escribe LN mientras que en VBA
se escrib e Log.
Los parametros los vamos a leer desde unas celdas ubicadas en la columna C. Para hacer referencia a una celda,
se usa el codigo
C ells(fila,colum na)
pero escribiendo colum na en formato numerico. Por ejemplo, la celda C5 se invoca como
C ells(5,3)
Lo prim ero que hacemos es escribir, en el editor de VBA, la formula de P (t), luego la invocam os en la celda F3
(de nuestra ho ja de ejem plo) y arrastramos. Para esto, se siguen los siguientes pasos:
1. En prim er lugar, abrim os una ho ja Excel, que se llame p or ejemplo Poblacion.xls. Luego se escrib en los
valores de los parametros, tal y como puede observarse en la siguiente figura:
2. Ahora ingresamos al menu y en la op cion Herram ientas seleccionamos Macros. Luego se elige Editor de Visual Basic.
Nuevamente, en el menu de la ventana que se abre, se elige Insertar, para luego seleccionar Modulo y
escribir el siguiente codigo:
Function P(t)
P0 = C ells(2, 3) P0 est\a en la celda C2
LimPobl = C ells(4, 3) K est\a en la celda C4
k = C ells(5, 3) k est\a en la celda C5
A = (Lim Pobl - P0) / P0
P = LimPobl / (1 + A * Exp(-k * t))
End Function
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 13
Hay tres tip os de estructuras basicas que son muy utilizadas en la programacion de un algoritmo, a sab er, la
estructura secuencial, la estructura condicional y la repetitiva.
A continuacion se explica, con ejemplos programados como macros de Excel, estas estructuras. Tambien se
incluyen los programa s en seudocodigo y diagramas de flujo para explicar de un m odo m as grafico la logica del
programa. El uso de estos ultim os es cada vez menor, pues el seudo codigo p or lo general es suficie nteme nte
claro y se escribe en lengua je muy cercano al lengua je natural.
Por ejemplo, un program a que a partir de un numero N de das, calcula la cantidad de segundos que hay en
esta cantidad de das. Este programa se puede ver como una secuencia de varios pasos:
Inicio: Ingresa el numero N de das
Paso 1: H = 24*N, para determ inar la cantidad de horas
Paso 2: M = 60*H, para determ inar la cantidad de m inutos.
Paso 3: S = 60*M, para determ inar la cantidad de segundos.
Paso 4: Retorne S.
Fin.
La macro corresp ondiente a esta secuencia de calculos puede escribirse como sigue:
Function CalculeSe gundos(Dias)
CantHoras = 24 * Dias
CantMinutos = 60 * CantHoras
CalculeSegundos = 60 * CantMinutos
End Function
El caso m as sencillo ocurre cuando el program a verifica si una condicion se cumple y en caso de ser verdadera
ejecuta un pro ceso, en tanto que si es falsa ejecuta otro pro ceso.
If...Then...Else
Sintaxis
If condicion Then
instrucciones
Else instrucciones-else
If condicion Then
instrucciones
ElseIf condicion Then
instrucciones-elseif
...
Else instrucciones-else
End If
N ota: En la ayuda del editor de Visual Basic, tenemos acceso a la referencia del lengua je.
Ejem plo 2
1 2
x n+1 = n + n
)
x0 = 1
El program a debera estim ar el error absoluto de las aproximaciones y sera capaz de escribir un mensa je de exito
o de fracaso, dependiendo de si el error absoluto es o no menor que una tolerancia dada.
Para los resultados que aparecen en la grafica anterior pueden programarse las siguiente macros para ser eval-
uadas en cada columna:
Function AproxDeRaiz(x)
AproxDeRaiz = (1 / 2) * (x + 2 / x)
End Function
Figure 1.16: Resultado de la aproximacion de 2.
El diagrama siguiente ilustra la form a en que esta ultima funcion de verificacion actua con base en el valor de
sus dos parametros de entrada:
Este tip o de flujos rep etitivos se presentan en tres formas que ob edecen a maneras diferentes de razonarlos p ero
que en el fondo hacen lo mismo:
Utilizar un contador que empiece en un numero y termine en otro, ejecutando el pro ceso cada vez que el
contador tome un valor distinto.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 17
Mientras una condicion sea verdadera, ejecutar un pro ceso y regresar a la condicion.
Ejecutar un pro ceso, hasta que una condicion deje de cumplirse.
En VBA tenemos las siguie ntes instrucciones para realizar procesos iterativos:
2. W hile...W end
Ejecuta una serie de instrucciones mientras una condicion dada sea True.
Sintaxis
W hile condicion
intrucciones
Wend
N ota: No hay un E xit W hile. En una subrutina, si fuera necesario, se p o dra usar Exit Sub
Sintaxis
Do while condicion
instrucciones
[E xit Do]
Loop
Ejem plo 3
Para ilustrar estas forma s de realizar un flujo repetitivo, vamos a aproxim ar la suma de una serie alternada con
un error estimado menor que una cantidad tol dada.
X
1 1 1 1
( 1) k = 1 + + ...
k2 4 9 16
k=1
X
N
1 1 1 1 1
SN = ( 1) k 2= 1 + + . . . + ( 1) N
k 4 9 16 N2
k =1
es decir
S1 = 1 = 1
S2 = 1 + 1/4 = 0.75
S3 = 1 + 1/4 1/9 = 0.861111...
S3 = 1 + 1/4 1/9 + 1/16 = 0.798611...
.
X
1
De acuerdo con la teora de series alternadas, la serie ( 1) k
es convergente. Si su suma es S , al aproxi-
k2
k=1
1
marla con la suma parcial S N , el error de la aproxim acion es menor que
(N + 1) 2
1
|S S N |
(N + 1) 2
Prim er problem a
Dada una tolerancia TOL, calcular cada una de las sumas parciales hasta que el error de aproxim acion sea menor
que TO L
Solucion
Im plem entamos dos macros, una para el calculo de las sumas parciales y otra para hacer la verificacion del error
estimado. En este caso, vamos a sup oner que TOL esta en la celda B33
For k = 1 To hastaN
Acum = Acum + signo * 1 / k ^ 2
signo = -signo
Next k
Segundo problema
Dada una lista de tolerancias TOL (donde T O L es una cantidad p ositiva, como 10 1 ,10 8 , etc.), aproxim ar la
1
suma de la serie con una cantidad N de terminos lo suficientemente grande de tal manera que < T O L.
(N + 1) 2
1
La cantidad juega en este problema el papel de una cota del error, al aproxim ar la serie correspondiente
(N + 1) 2
hasta el termino N-esimo
1
Dado que hay que sumar hasta el termino N-esimo tal que < T O L, en este caso es posible
(N + 1) 2
despejar el entero p ositivo N , quedando:
r
1
N > 1
T OL
q
1
Tomamos N como la parte entera sup erior de T OL 1, p or lo que se calcula:
$r %
1
N = (parte entera)
T OL
Los pasos a seguir para program ar la suma a partir de la tolerancia dada, son los siguientes:
$r %
1
Paso 1: Calcular N =
T OL
Paso 2: Acum = 0 (Se iniciliza el acumulador para la suma).
Paso 3: Para k = 1 . . . N:
1
Acum = Acum + ( 1) k 2
k
Paso 4: Retorne Acum.
Fin.
Observe que en cada sumando, se incluye el factor ( 1) k , que en la practica, m as que una potencia, lo que
indica es el cambio de signo en los terminos sucesivos. Para evitarle al programa calculos innecesarios,
po dem os inicializar una variable sig no en 1 y en cada paso de la instruccion repetitiva se cambia al signo
contrario. La macro correspondiente a este program a puede escribirse como sigue:
La siguiente figura muestra la evaluacion de esta macro para algunos valores de la tolerancia.
2. Segunda solucion:
En esta solucion no es necesario calcular el valor de N , sino que se suman los terminos mientras no se
haya alcanzado la tolerancia. El program a en seudocodigo se puede escribir como sigue:
. N =N +1
1
. Acum = Acum + ( 1) N
N2
Paso 4: Retorne Acum.
Fin.
El codigo es
Ejem plo 4
Prom edio sim ple. Consideremos una tabla con 5 notas, to das con igual peso.
Para calcular el promedio simple, en cada fila, vamos a hacer una macro que recibe un rango, cuenta las notas,
suma y divide entre el numero de notas.
sump = 0
n = R.EntireColumn.Count cantidad de notas en el rango
For Each x In R sum a de las notas
sump = sump + x
Next x
Sume = sump / n prom edio sim ple
End Function
En prim era celda de la columna Prom edio, llamamos a la macro con: PROMEDIO(C52:G52) pues en este caso el
rango es C52:G52.
Ejem plo 5
El Prom edio elim inando las dos notas m as ba jas. En este caso, a un conjunto de notas les calculamos el
promedio simple p ero eliminando las dos notas m as ba jas. El programa PromedioQ suma las n notas de una
fila (rango), lo caliza la posicion (en el vector R) de las dos notas m as ba jas y luego le resta a la suma estas dos
notas para luego dividir entre n 2. En este caso, el rango R es una m atriz 1 n, o sea, se puede ver como un
vector de n com ponentes.
suma = 0
n = R.EntireColumn.Count numero de elem entos de la seleccion
For i = 1 To n
suma = suma + R(1, i) R es una m atriz 1xn (o sea, un vector)
Next i En R no se hace referencia a la celda
N ota: Tambien po dramos resolver este problem a usando Selection.Sort pero la program acion es un p oco
m as compleja.
2 Aparte de la p osibilidad de declarar la subrutina como Private o Public, tambien se puede declarar como Friend, pero esto
tiene que ver mas con la program acion orientada a objetos, que no se ab orda en el presente material
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 24
Sintaxis:
instrucciones
End Sub
o tam bien
instrucciones
End Sub
Lass partes entre corchetes indican que son op cionales. Adem as:
Public. Es opcional. Indica que la subrutina puede ser llam ada p or to das las dem as subrutinas sin
im portar donde se encuentre.
P rivate. Es opcional. Indica que la subrutina puede ser llam ada solamente por otras subrutinas que se
encuentren en el mismo m odulo.
Static. Es op cional. Indica que las variables lo cales de la subrutina se m antienen consta ntes de una
llam ada a otra. El ambito de accion de esta declaracion no incluye a variables declaradas fuera de la
subrutina.
lista-argum e ntos. Es op cional e indica las variables que conforman los argume ntos con que una sub-
rutina es llam ada. Para separar una variable de otra se escribe una coma.
Ejem plo 6
Elevar al cuadrado los valores de una seleccion (ejecutar desde la ventana de ejecucion de macros).
Podemos im plementar una subrutina en una ho ja, que recorra una seleccion hecha con el mouse y que vaya
elevando al cuadrado el valor de cada celda.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 25
Sub elevAlCuadado()
For Each cell In Selection.Cells para cada celda de la seleccion
cell.Value = cell.Value ^ 2 recalcula el valor de la celda
Next cell
End Sub
N ota: La macro se aplica a los datos que estan actualm ente seleccionados
Para editar la subrutina, vamos al editor VB (Alt-F11) y hacemos doble-clic sobre (Hoja1)
Escribim os el codigo, compilamos (en menu Depuracion), guardamos y nos devolvemos a la ho ja.
Para ejecutar la macro seleccionamos la tabla con el mouse y levantamos la ventana de ejecucion de macros
(Alt-F8)y damos clic en Ejecutar
N ota: Esta subrutina tam bien se puede editar en un m odulo. Para ejecutarla se pro cede de la misma forma.
Ejem plo 7
1. Prim ero digitarm os la tabla de valores. Luego insertamos un b oton. Para esto seleccionamos un b oton del
cuadro de controles (si la barra no esta disponible, puede habilitarla con Ver - Barra de herram ientas
- Cuadro de Controles).
2. Luego hacemos clic en el lugar de la hoja donde queremos el boton. Una vez que tenemos el boton, p ode-
mos agregar algunas propiedades como etiqueta, color de fondo, etc., en el menu de contexto. Este menu
se abre con clic derecho + propiedades. Luego cerramos el menu
3. Para editar el codigo que deb era ejecutar el b oton, le damos un par de clics al b oton (que to dava esta en
modo diseno). En este caso, si es la prim era vez, nos aparece el codigo
a.) Im plem entar la subrutina p or separado y luego llamarla desde la subrutina del b oton
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 27
Sub elevAlCuadado()
For Each cell In Selection.Cells para cada celda de la seleccion
cell.Value = cell.Value ^ 2 recalcula el valor de la celda
Next cell
End Sub
-----------------------------------------------------------------------
Private Sub Com m andButton1_Click()
elevAlCuadado sin parentesis
End Sub
-----------------------------------------------------------------------
b.) Incluir en la subrutina del b oton lo que vamos a querer que se ejecute cuando se haga clic sobre el
4. Una vez que escogemos alguna de las dos op ciones anteriores, compilamos (en menu Depurar), guardamos
y nos devolvemos a la ho ja.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 28
Observe que al dar un clic sobre el b oton, el programa op era sobre lo que tengamos seleccionado previa-
mente
Figure 1.30: Correr una subrutina desde un boton con la tabla seleccionada
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 29
N ota: Puede ser im p ortante cono cer la prim era o la ultim a celda de una seleccion. Para esto po demos usar la
propiedad Address
Set R = Selection
adr = R(1, 1).Address prim era celda de la seleccion, por ejem plo $A$1
num = Right(adr, 1) prim era posicion a la derecha de adr (1 en este caso)
Las instrucciones siguientes cambian el tamano de la m atriz m tr1 y la inicializa. Observe el uso de Redim para
cambiar el tamano de la m atriz dinamica.
Usando Preserve se puede cambiar el tamano de la m atriz m tr1 pero sin b orrar los elementos anteriores.
Ejem plo 8
X
n
G = p i (x i , y i )
i=1
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 30
Por ejemplo, si tenemos dos puntos A, B R 2 con igual peso (este debera ser 1/2 para cada punto), entonces
el centro de gravedad es el punto medio del segmento que une A con B
A+B
G =
2
La subrutina que calcula el centro de gravedad de un conjunto de puntos R 2 actua sobre un rango de
tres columnas en el que se han escrito las coordenadas (x, y) de dichos puntos, as como sus p esos. Podemos
correr el programa una vez que se ha seleccionado el rango completo en el que se ubican los puntos y sus p esos,
haciendo clic sobre un b oton Centro Gravedad. El grafico es un traba jo adicional.
Como el programa necesita que el usuario haya seleccionado al menos dos filas y exactame nte tres columnas,
incluim os un fragmento de codigo adicional para controlar la seleccion.
Observemos que si no se cumple el requisito, se enva un mensa je y la subrutina se deja de ejecutar. Puede
causar curiosidad que que antes del Else no haya codigo. A veces se usa esta construccion p or como didad. Si
no hay codigo el programa continua.
For i = 1 To n
x(i) = R (i, 1) entra los datos de columna de los xs
y(i) = R (i, 2)
p(i) = R (i, 3)
calcula centro de gravedad
Sumapesos = Sumapesos + p(i)
Gx = Gx + x(i) * p(i)
Gy = Gy + y(i) * p(i)
Next i
If Abs(Sumapesos - 1) < 0.001 Then la suma los pesos debe ser 1
Gx = Gx / Sumapesos
Gy = Gy / Sumapesos
escribe G en la celda D14
C ells(14, 4) = "G = (" + Str(G x) + "," + Str(G y) + ")"
C ells(14, 5) = "" lim pia E14 de m ensajes previos
Else
m ensaje de error
C ells(14, 5) = "E rror, los pesos suman " + Str(Sumapesos)
C ells(14, 4) = "" lim pia D14 de valores previos
End If
Else
C ells(14, 4) = ""
ventana de advertencia: seleccione datos!
MsgBox ("Debe seleccionar los datos")
Exit Sub aborta la subrutina si no hay datos
End If
End Sub
Ejercicios 1
X
n
I () = p i || (x i , y i ) G | |2
i=1
donde ||(a, b)|| = a 2 + b 2 es la norm a usual.
Im plem ente una subrutina que calcula la Inercia Total de y aplquela a la tabla del ejemplo 8.
Im plem ente una ho ja, como se ve en la figura, en la que el usuario hace una seleccion de la tabla y al
hacer clic en el b oton, se calcula L 2n (2.56)
...
Set R = Selection
n = R.Rows.Count Numero de filas
ReDim x(n) vector x tiene ahora n campos
ReDim y(n)
valorX = C ells(2, 3) valorX esta en celda C2
If n > 1 Then si hay datos seleccionados, n > 1
For i = 1 To n
x(i) = R (i, 1) entra los datos de columna de los xis y los yis, inicia en 1
y(i) = R (i, 2) aqu, iniciam os desde x1, es decir el x0 de la teora, es x1
Next i
X
n Y
n
(x x j )
P (x) = yi
(x i x 1 )
i=0 j =0,j =i
o sea
X
n
(x x 0 )(x x 1 ) (x x i 1 )(x x i+1 ) (x x n )
P (x) = yi
i=0
(x i x 0 )(x i x 1 ) (x i x i 1 )(x i x i+1 ) (x i x n )
(a) Implem ente una subrutina que, a partir de una seleccion de puntos (x i , y i ) (en dos columnas) en
una ho ja de Excel, evalua el polinomio interpolante en una valor dado de antemano en una celda, o
sea, calcula P (a) para un valor a dado.
(b) Aplique la implementacion anterior a una tabla como la que se presenta en la figura
...
suma = 0 inicializa para acum ular
If n > 1 Then si hay datos seleccionados, n > 1
For i = 1 To n
x(i) = R (i, 1) entra los datos de columna de los xis y los yis, inicia en 1
y(i) = R (i, 2) aqu, iniciam os desde x1, es decir el x0 de la teora, es x1
Next i
For k = 1 To n
Lkn = 1 inicia calculo de Lkn
For j = 1 To n calculamos Lkn(valorX)
If j <> k Then
Lkn = Lkn * (valorX - x(j)) / (x(k) - x(j)) Lkn evaluado en valorX
End If
Next j
suma = suma + Lkn * y(k)
Next k
C ells(5, 4) = suma
Else
ventana de advertencia: seleccione datos!
MsgBox ("Debe seleccionar los datos")
Exit Sub aborta la subrutina si no hay datos seleccionados
End If
...
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 35
Ejem plo 9
En cada nivel del triangulo hay un uno en los extrem os y, a partir del tercer nivel, cada numero, salvo los
extremos, es la suma de los dos de arriba. Concretamente, el triangulo de Pascal es un arreglo triangular de
numeros de la form a:
Por simplicidad, presentamos un programa que lee el numero de niveles del triangulo de Pascal en la celda E1
y lo despliega de la forma:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
...
El pro cedimie nto para borrar el triangulo tambien lee el numero de niveles del triangulo de la celda E1.
Tanto la construccion del triangulo como su destruccion pueden ser activados mediante b otones. Las instruc-
ciones que realizan estos pro cedimie ntos tam bien pueden ser incluidas directamente en el codigo de los b otones, tal
y como se detalla a continuacion.
Ejercicios 2
1. Triangulo de Pascal. Haga un programa que, al activarlo desde un b oton de comando, lea un un numero
N de la celda A1 y construya el triangulo de Pascal en la forma:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1 ...
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 37
Adem as, incluya un b oton que active un destructor especializado para este triangulo.
2. A ritm etica entera. En VBA hay dos tip os de division: a/b es la division corriente (en punto flotante)
y a\b que es la division entera. Por ejemplo, 3/2 = 1.5 mientras que 3\2 = 1.
Hay muchos algoritm os en los que se usa exclusivamente divison entera. Veamos un ejemplo.
Si N es un entero p ositivo, vamos a calcular el entero m as grande que es menor o igual a N , es
decir b N c ( b c es la parte entera). El algoritmo, que op era en aritmetica entera, es el siguiente
N
a.) Inicio: s 0 =
N
si +
si
b.) s i+1 = , i = 0, 1, 2, ...
2
c.) iterar hasta que s i+1 s i
d.) el ultim o s i es b N c
Por ejemplo si N = 10 , N 3, 16227766 y el ultim o s i sera 3
3. Calculo de la raz cuadrad a. Para calcular xcon x R + , se pueden usar varios algoritm os de-
pendiendo de la precision y rapidez que se busca. La calculadoras usualme nte tienen implementadas muy
buenas subrutinas para calcular exp onenciales y logaritm os p or lo que para calcular x usan la identidad
1 ln(x)
x=e 2
En nuestro caso, p or simplicidad, vamos a usar un meto do iterativo: el metodo de Newton. Ba jo ciertas
hipotesis, si x 0 es una buena aproxim acion a una solucion r de la ecuacion P (x) = 0 entonces el esquema
iterativo
P (x i )
x i+1 = x i
P 0 (x i )
1 1
Para hallar U con U > 0 , vamos a resolver la ecuacion 2
= 0 con el metodo de Newton. Esto
x U
nos dara una aproxim acion a U.
N ota: Como U es una consta nte, el esquema iterativo se p odra simplificar un p oco m as en el codigo
N ota: Tambien se pudo haber usado la ecuacion x 2 U = 0 p ero el pro ceso de aproxim acion es un p o co
m as lento.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 38
N ota: Para una aproxim acion inicial U 0 se p odra usar b Uc usando la solucion del problema anterior.
En la practica se usa una aproximacion inicial basada en la representacion binaria del numero.
4. N um eros prim os. Obtenga un program a para hallar el numero prim o m as cercano a un numero N ,
siendo N un numero entero p ositivo mayor que uno. 3
Un pro cedimie nto clasico para hallar to dos los numeros prim os menores que un entero p ositivo N , es la
llam ada criba de Eratostenes. Lo que se hace es colocar en una lista to dos los numeros del 2 al N e ir
eliminando de esta lista to dos los m ultiplos de 2 (4, 6, 8, ...), todos los m ultiplos de 3 (6, 9, 12, ...), y as
sucesivamente ,hasta eliminar to dos los m ultiplos de los prim os que han ido quedando en la lista menores
o iguales que N . Para decidir si un numero es m ultiplo de otro, usamos la funcion mod. Esta funcion
devuelve el resto de una division (entera). As, si un numero es m ultiplo de otro, la division es exacta, o
sea, el resto es cero. En codigo sera as
En [9] encontrara un parser para evaluar expresiones m atem atica en Visual Basic. Sin embargo funciona bien
con Excel. Adem as nos da la p osibilidad de agregar funciones propias m as complejas adem as de la que el parser
trae im plem entadas tales como BesselJ(x,n) , H ypG eom (x,a,b,c) o WAVE_RIN G(). Por ejemplo, la funcion a
trozos. Este parser fue desarrollado p or Leonardo Volpi [9].
Prim ero descargam os clsM athParser.zip . En la carpeta clsM athParser, adem as de la do cumentacion en p df,
vienen dos archivos: clsM athParser.cls y mMathSpecFun.bas . El prim ero es el parser y el segundo es una
biblioteca con funciones especiales ya im plementadas.
Para im plem entar un ejemplo de uso del parser, implem entamos una ho ja excel como la que se ve en la figura
3 Un numero natural p > 1, es primo si sus unicos divisores p ositivos son 1 y p. En caso contrario, es un numero compuesto.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 39
1. En el editor de VBA, seleccionamos la H o ja1 y hacemos clic en el b oton derecho del mouse. Ah elegimos
Im portar Archivo.... Luego vamos a la carp eta clsM athParser y seleccionamos clsM athParser.cls
C om e ntario. Con esto ya p odem os crear un ob jeto Fun con Dim Fun As New clsM athParser1 en el
codigo del b oton. Las evaluaciones se llevan a cab o con Fun.Eval1(xval)
En este caso el m odulo de clase quedo con el nombre clsM athParser. As que el ob jeto Fun se construye
con Dim Fun As New clsM athParser
End Sub
1. Las variables deben em p ezar con una letra, p or ejemplo t, xi, tim e. Para evitar la ambiguedad, xy se
interpreta como una variable. El pro ducto requiere *, es decir x*y es el pro ducto de x e y . Se permite
multiplicacion im plcita solo para x, y, y z , o sea, p or ejemplo 2x se interpreta como 2*x
2. Los argume ntos de una funcion, si hay varios, se separan con una coma, p or ejemplo m ax(x,y), root(x,y).
3. Las expresiones logicas retornan 1 o 0 . Como ejem plo de estas expresiones tenemos (x<=1), (2<x<2).
Una expresion como x < 0 o x > 3 se intro duce como (x<0)+(x>3)
4. La expresion
x2 + x si x<0
f (x) = se introduce como (x<0)*(x^2+x) + (x>2)*(log(x)+sqr(x))
log(x) + x si x>2
x^-n x^(-n)
x*-sin(a) x*(-sin(a))
-5*-2 -5*(-2)
2 2
(b) e x se debe intro ducir como 1/e#^(x^2) o como e#^(-1*x^2) pues e#^(-x^2) = e x
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 41
7. Constantes fsicas.
Las consta ntes fsicas deb en ir seguidas p or sus unidades de medida: "1 s" , "200 m" , "25 kg" ,
"150 MHz", "0.15 uF", "3600 kohm". Se utilizan de manera analoga a las constante m atem aticas. Por
ejemplo eps# * S/d#, sqr(m *h*g#) , s0+v*t+0.5*g#*t^2
8. Smbolos y Funciones
+ adiccion
- resta
* m ultiplicacion
/ division 35/4 = 8.75
% porcentaje 35% = 3.5
\ division entera 35\4 = 8
^ elevar a potencia 3^1.8 = 7.22467405584208 ( )
| | valor absoluto |-5|=5 ! factorial 5!=120
abs(x) valor absoluto abs(-5)= 5
atn(x) atan(x) x en radianes
cos(x) x en radianes
sin(x)
exp(x) exponencial exp(1) = 2.71828182845905 o sea e^1
fix(x) parte entera fix(-3.8) = 3
int(x) parte entera int(-3.8) = -4
dec(x) parte decim al dec(-3.8) = -0.8
ln(x), logaritm o natural x>0
log(x) logaritm o natural
logN(x,n) logaritm o base N logN(16,2) = 4
rnd(x) random retorna un valor aleatorio entre x y 0
sgn(x) signo retorna 1 si x >0 , 0 si x=0, -1 si x<0
sqr(x) raz cuadrada sqr(2) =1.4142135623731, tam bien 2^(1/2)
cbr(x) raz cubica
root(x,n) raz n-esim a x^(1/n)
m od(a,b) m od(29,6) = 5, m od(-29 ,6) = -5
com b(n,k) com binaciones com b(6,3) = 20 , com b(6,6) = 1
perm(n,k) permutaciones perm (8,4) = 1680
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 42
9. Meto dos
Eval() se usa cuando vamos a evaluar expresiones con varios parametros y/o variables. Eval1() es para fun-
ciones de una sola variable.
Para esto, leemos la ecuacion de la funcion y = f (x) en una celda y el intervalo de graficacion [a, b] . Para
hacer el grafico necesitamos una tabla de valores (x i , y i ) . Lo que hacemos es partir el intervalo [a, b] en n + 1
puntos x i , i = 0, 1, ..., n; y evaluamos la funcion en cada uno de estos x i . Si los puntos son equidistantes, la
distancia de separacion es h = (b a)/n y este caso
xi = a + i*h
h
... ...
x0 = a xn = b
x1= a + 1* h
Figure 1.38: Partir el intervalo en n puntos.
x0 = a + 0 h
x1 = a + 1 h
x2 = a + 2 h
.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 43
xi = a + i h
xn = a + n h
n = C ells(6, 5)
a = C ells(6, 3)
b = C ells(6, 4)
h = (b - a) / n
Form ula = C ells(2, 3)
For i = 0 To n
C ells(6 + i, 1) = a + i * h xis
C ells(6 + i, 2) = Fun.Eval1(a + i * h) yis
Next i
Luego deb emos seleccionar la tabla de valores y hacer un grafico (chart). Si hay un grafico previo lo p o demos
borrar (que no es necesario si uno quiere comparar graficos p or ejem plo). Estas dos cosas se hace con el codigo
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 44
El codigo com pleto del codigo del b oton que levanta el grafico es
n = C ells(6, 5)
a = C ells(6, 3)
b = C ells(6, 4)
h = (b - a) / n
Form ula = C ells(2, 3)
For i = 0 To n
C ells(6 + i, 1) = a + i * h
C ells(6 + i, 2) = Fun.Eval1(a + i * h)
Next i
W ith graf
.Name = "Grafico"
.ChartType = xlXYScatterSmoothNoM arkers
.SetSourceData Source:=Sheets("H oja1").R ange(datos), PlotBy:=xlColum ns
.Location W here:=xlLocationAsObject, Name:="Hoja1"
End W ith
---------------------------------------------------------------
If Err Then GoTo Error_Handler
Error_Handler: C ells(1, 1) = Fun.ErrorDescription im prim ir mensaje error
---------------------------------------------------------------
End Sub
Observe que se pueden graficar funciones a trozos. Por ejemplo, para graficar
x2 si x ] , 0[
f (x) = x si x ]0, 2]
4x si x ]2, [
Ejercicios 3
Im plem ente un graficador para curvas definidas p or una ecuacion param etrica.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 46
N ota. Algunas curvas, como los crculos, las elipses, etc., se definen p or medio de ecuaciones parametricas
Por ejemplo
Una curva con ecuacion en p olares r = f (), [a, b]; tiene ecuacion param etrica
Podemos implementar de manera muy sencilla un graficador de sup erficies de ecuacion z = f (x, y) .
Para esto solo hay que observar que en vez de una tabla de puntos ( x i , y i , z i (x i , y i )) en tres columnas, Excel
necesita una tabla de la form a
x0 x1 xn
y0 f(x0,y0) f(x1,y0) f(xn,y0)
y1 f(x0,y1) f(x1,y1)
.
yn f(x0,yn) f(x1,yn) f(xn,yn)
Los intervalos de graficacion son x [xm in, xm ax] y y [y min, ym ax] . Cada intervalo lo partim os en n
puntos (que puede puede ser modificado p or el usuario).
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 47
f(x i,y i)
p yi q Y
a
xi
b (x i,y i)
X
Figure 1.41: Particion.
Para que la tabla quede en el form ato adecuado, deb emos usar dos For
For i = 0 To n
xi = xmin + i * hx
C ells(7, 2 + i) = xi fila de las xi
For j = 0 To n
yi = ymin + j * hy
C ells(8 + j, 1) = yi colum na de la yi
Una vez que se genera la tabla de datos, la seleccionamos y la ocultam os (porque es muy grande y llena de
decimales). Luego generamos el grafico 3D.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 48
fxy = C ells(2, 2)
xmin = C ells(5, 3)
xmax = C ells(5, 4)
ymin = C ells(5, 5)
ymax = C ells(5, 6)
n = C ells(3, 2) numero de puntos n x n
hx = (xmax - xm in) / n
hy = (ymax - ym in) / n
Fun.Variable("x") = xi
Fun.Variable("y") = yi
C ells(8 + j, 2 + i) = Fun.Eval() retorna f(xa,ya)
Next j
Next i
End If
----------------------- elim inar graficos anteriores-------------
Set chartsTemp = ActiveSheet.ChartO bjects
If chartsTem p.Count > 0 Then
chartsTem p(chartsTem p.Count).Delete
End If
-----------------------------------------------------------------
datos = Range(Cells(7, 1), Cells(7 + n, n + 2)).Address rango a graficar
R ange(datos).Select
Selection.Num berForm at = ";;;" ocular celdas
Charts.Add
ActiveC hart.ChartType = xlSurface
ActiveChart.SetSourceData Source:=Sheets("H oja1").R ange(datos), PlotBy:=xlColum ns
ActiveChart.Location W here:=xlLocationAsObject, Name:="Hoja1"
---------------------------------------------------------------
If Err Then GoTo Error_Handler
Error_Handler: C ells(1, 1) = Fun.ErrorDescription enviar un mensaje de error
------------------------- --------------------------------------
End Sub
N ota: para rotar la figura, seleccione el area del grafico y haga clic con el boton derecho del mouse, seleccione
en el menu la op cion Vista en 3D...
Ejem plo 10
X
N
Im plem entaremos una funcion que calcula la suma parcial S N = f (k) . Luego la aplicaremos a la serie
k =k 0
X
2k
.
k!
k=1
X
N
Sum aParcial(form ula, K ini, N)= f (k) .
k =K ini
suma = 0
For i = Kini To N
suma = suma + Fun.Eval1(i) evalua en "laform ula"
Next i
---------------------------------------------------------------
If Err Then GoTo Error_Handler
Error_Handler: Cells(1,1)= Fun.ErrorDescription
---------------------------------------------------------------
SumaParcial = suma
End Function
Ejem plo 11
X
X
N
Dada una serie numerica f (k) , vamos a desplegar las primeras N sumas parciales S N = f (k) , de la
k=k 0 k=k 0
celda A4 en adelante.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 51
Usando la funcion Sum aParcial(form ula, K ini, N), solo deb emos calcular cada suma parcial p or separado.
For i = 1 to N
C ells(3+i,1)= Sum aParcial(form ula,Kini,i)
Next i
El codigo del b oton es
Ejem plo 12
X
Usando Eval(). Dada una serie de p otencias f (x, k) , implementaremos una subrutina que calcula la
k=k 0
X
N X
xk
suma parcial S N = f (x 0 , k) . Luego la aplicaremos a la serie , con x = 2 .
k!
k=k 0 k=1
Vamos a implementar una nueva funcion Sum aParcial(laform ula, K ini, N, xx).
Aqu la situacion es diferente, f (x, k) tiene dos variables, p or tanto no p o demos usar Eval1() p orque este
metodo es para funciones de una sola variable.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 52
Eval() evalua la expresion actual almacenada y retorna su valor. Para evaluar, se deb e especificar el valor de
cada variable con Fun.Variable(). En nuestro caso debemos hacer la especificacion Fun.Variable("x")=xx
y Fun.V ariable("k")=i , antes de llam ar a Eval(). Veamos el codigo de la funcion Sum aParcial(laform ula,
K ini, N, xx)
suma = 0
Fun.Variable("x") = xx
For i = Kini To N
Fun.Variable("k") = i
suma = suma + Fun.Eval() evalua en "laform ula" actual
Next i
---------------------------------------------------------------
If Err Then GoTo Error_Handler
Error_Handler: Cells(1,1)= Fun.ErrorD escription
----------------------- ----------------------------------------
SumaParcial = suma
End Function
Ahora, el codigo del b oton sera
Ejercicios 4
1. Im plem ente un funcion para series alternadas que adem as de dar la suma parcial pedida, indique la es-
X
tim acion del error. Recuerd e que si f (k) es alternada entonces si el error cometido al aproxim ar la
k=1
X
N
serie con la suma parcial S N = f (k) es R N , entonces |R N | a N +1 .
k =1
Chapter 2
Si x 0 es una aproxim acion suficientemente cercana a una solucion r de f (x) = 0 , con f 0 (r) = 0 , entonces la
f (x i )
sucesion x i+1 = x i 0 aproxima r con error menor que |x i+1 x i |
f (x i )
f (x)
Para im plem entar este meto do, leemos la funcion g(x) = x , entonces el algoritmo sera muy sencillo
f 0 (x)
i=1
xi = x0
while i <= N
xim1 = g(xi) xim 1 es x_{i+1}
54
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 55
En este caso, debemos leer y almacenar la funcion g . Entonces, en el codigo, g(x i ) = Fun.Eval1(xi)
Do while condicion
instrucciones
Loop
x0 = C ells(7, 3)
N = C ells(7, 2)
tol = C ells(7, 1)
g = C ells(3, 2)
C ells(6, 6) = " " lim pia m ensajes anteriores
xi = x0
i = 1
Do W hile i <= N
xim1 = Fun.Eval1(xi) form ula actual es g, esta es la que esta evaluando
errorEst = Abs(xim 1 - xi)
C ells(6 + i, 4) = xim1
C ells(6 + i, 5) = errorEst
---------------------------------------------------------------
If Err Then GoTo Error_Handler
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 56
Error_Handler: Cells(1,1)=Fun.ErrorDescription
---------------------------------------------------------------
End Sub
2.2 Integracion
2.2.1 M etodo de R omb erg para integracion
En el metodo de integracion de Romberg se usa la regla compues ta del trap ecio para obtener aproximaciones
preliminares y luego el pro ceso de extrap olacion de Richardson para m ejorar las aproximaciones.
Z b
Para aproxim ar la integral f (x) dx se calcula un arreglo
a
R 11
R 21 R 22
R 31 R 32 R 33
.
R n1 R n2 ... R nn
Z b
y f (x) dx R nn . El criterio de parada es |R nn R n 1 n 1 | < T ol (a veces tambien se usa la desigualdad
a
anterior y la desigualdad |R n 1 n 1 R n 2 n 2 | < T ol para evitar algunos casos no deseables).
ba
Si h k =
2k 1
h1
a.) R 1,1 = [f (a) + f (b)]
2
k2
2X
b.) R k,1 = 1 R k 1,1 + h k 1 f ( a + h k (2i 1) ) , k = 2, 3, ..., n
i=1
R k,j 1 R j 1,j 1
c.) R k,j = R k,j 1 + , k = 2, 3, ..., n; j = 2, 3, ...k
4j1 1
Este algoritmo es muy eficie nte para funciones suficientemente suaves y sin singularidades en [a, b] . En general,
para integrales iRmpropias se usan otros algoritm os. Por ejemplo, Romberg no es adecuado para calcular la
z1 t
integral (z ) = t e dt
En vez de implementar el metodo de Romb erg de manera directa, vamos a im plementar el siguiente algoritmo
1. h = b a
h1
2. R 1,1 = [f (a) + f (b)]
2
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 57
i 1
2X
(a) R 2,1 = 1 R 1,1 + h f ( a + h(k 0.5) )
i=1
En el codigo de un b oton, definimos una m atriz R(n,n) con la cual vamos a implem entar el algoritmo.
formula = C ells(1, 2)
a = C ells(2, 3)
b = C ells(2, 4)
n = C ells(2, 5)
ReDim R(n, n)
h = b - a
C ells(2 + i, j) = N ull
Next j
Next i
-------------------------------------------------------------------
R(1, 1) = h / 2 * (Fun.Eval1(a) + Fun.Eval1(b))
--------------------------------------------------------- ------
If Err Then GoTo Error_Handler
Error_Handler: Cells(1,1)=Fun.ErrorDescription
---------------------------------------------------------------
End Sub
N ota: Observe la funcion que se integra en la figura anterior. Recordemos que en este evaluador, -x^2 = (-x)^2.
Z b
x2
Entonces, para aproxim ar e dx deb emos intro ducir la funcion como 1/e#^(x^2) o e#^(-1*x^2).
a
Cuando el argume nto z es entero la funcion Gam ma se reduce al factorial (z 1)! . No obstante cuando z no
es entero la integral impropia que se genera deb e ser calculada en form a numerica.
Para ciertos valores enteros N y , y para ciertos coeficientes c 1 , c 2 , . . . , c N la funcion Gamm a esta dada por
z +0.5 e ( z + + 12 )
1 c1 c2 cN
(z + 1) = z++ 2 c 0 + + + ...+ +
2 z+1 z+2 z+N
Para im plementar el programa se toman los valores de N = 6 y = 5 y en ese caso el error en la aproxim acion
es menor que 2 10 10 en el semiplano Re z > 0
c0 = 1
c1 = 36.18109133
c2 = -86.50532033
c3 = 24.51409822
c4 =-1.291739516
c5 = 0.120858003
c6 = -0.539082
As
Z
t z e t dt (z+5.5)^(z+ 0.5*e#^(-1*(z+5.5)))*sqr(2*pi#)*(c0+c1/(z+1)+...+c6/(z+6))
0
Este es un algoritmo muy eficiente, de hecho requiere muy p ocos calculos y tiene una alta precision.
Cuadratura gaussiana.
La cuadratura gaussiana selecciona x 1 , x 2 , ..., x n en [a, b] y unos coeficientes c 1 , c 2 , ..., c n de tal m anera que se
reduzca en lo p osible el error esperado en la aproxim acion
Z b X
n
f (x)dx c i f (x i ) ( )
a i=1
La reduccion en lo p osible del error esperado en la aproxim acion se entiende en el sentido de que, p or lo
Z 1 Xn
menos, P (x) dx = c i P (x i ), con P (x) un p olinomios de grado < 2n . En este caso, los valores ade-
1 i=1
cuados para x 1 , ..., x n son las races del p olinomio de Legendre de grado n y los numeros c i estan definidos p or
Z 1 Y n
x xj
dx
1 j =1
x i xj
j=i
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 60
P 0 (x) = 1
P 1 (x) = x
1
P 2 (x) = (3x 2 1)
1
P 3 (x) = (5x 3 3x)
. .
2n + 1 n
P n+1 (x) = x P n (x) P n 1 (x), para n = 2, 3, . . .
n+1 n+1
Z 1 X
n
f (x) dx c ni f (x n i )
1 i=1
Ahora en vez de xi y ci ponem os x ni y c ni para indicar que son los valores que corresp onden al p olinomio
de Legendre de grado n .
Z b
f (x) dx se requiere de un cambio de variable x = 1 [ (b a)t + a + b ] con el cual
Para aproxim ar
a
Z b Z 1
1 ba
f (x) dx = f (b a)t + a + b dt
a 1 2 2
b a
1
Ahora si g(t) = 2 f 2 (b a)t + a + b entonces
Z 1 X
n
g(t) dt c ni g(x ni )
1 i=1
Z Z
1 2 1 0.25 (1 + t) 2
As, para aproxim ar e x dx debemos aplicar la formula de aproxim acion a 0.5 e dt
0 1
Las races x i de los p olinom ios de Legrende de grado menor o igual a n = 5 y los c i se pueden ver en la tabla
que sigue
G rado de P (x) ci xi
2 c 21 = 1 x 21 = 0.5773502692
c 22 = 1 x 22 = 0.5773502692
3 c 31 = 0.5555555556 x 31 = 0.7745966692
c 32 = 0.8888888889 x 32 = 0.0000000000
c 33 = 0.5555555556 x 33 = 0.7745966692
4 c 41 = 0.3478548451 x 41 = 0.8611363116
c 42 = 0.6521451549 x 42 = 0.3399810436
c 43 = 0.6521451549 x 43 = 0.3399810436
c 44 = 0.3478548451 x 44 = 0.8611363116
5 c 51 = 0.2369268850 x 51 = 0.9061798459
c 52 = 0.4786286705 x 52 = 0.5384693101
c 53 = 0.5688888889 x 53 = 0.0000000000
c 54 = 0.4786286705 x 54 = 0.5384693101
c 55 = 0.2369268850 x 55 = 0.9061798459
Para hacer la implementacion definimos dos funciones x i(i,j) y ci(i,j) donde i es el grado del polinomio de
Legendre y j es el valor j .
Function xi(i, j)
Dim xis(5, 5) As Double
xis(2, 1) = 0.5773502692
xis(2, 2) = -0.5773502692
xis(3, 1) = 0.7745966692
xis(3, 2) = 0
xis(3, 3) = -0.7745966692
xis(4, 1) = 0.8611363116
xis(4, 2) = 0.3399810436
xis(4, 3) = -0.3399810436
xis(4, 4) = -0.8611363116
xis(5, 1) = 0.9061798459
xis(5, 2) = 0.5384693101
xis(5, 3) = 0
xis(5, 4) = -0.5384693101
xis(5, 5) = -0.9061798459
xi = xis(i, j)
End Function
Function ci(i, j)
Dim cis(5, 5) As Double
cis(2, 1) = 1
cis(2, 1) = 1
cis(3, 1) = 0.5555555556
cis(3, 2) = 0.8888888889
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 62
cis(3, 3) = 0.5555555556
cis(4, 1) = 0.3478548451
cis(4, 2) = 0.6521451549
cis(4, 3) = 0.6521451549
cis(4, 4) = 0.3478548451
cis(5, 1) = 0.236926885
cis(5, 2) = 0.4786286705
cis(5, 3) = 0.5688888889
cis(5, 4) = 0.4786286705
cis(5, 5) = 0.236926885
ci = cis(i, j)
End Function
Adem as deb emos incluir un mensa je en el caso de que se seleccione un grado menor que 2 mayor que 5.
g = C ells(2, 2)
n = C ells(3, 5)
C ells(5, 6) = "" lim piar calculos anteriores
If n < 2 Or n > 5 Then
MsgBox ("Solo tenemos datos para n entre 2 y 5")
Exit Sub
End If
suma = 0
For i = 1 To n
suma = suma + ci(n, i) * Fun.Eval1(xi(n, i))
Next i
C ells(5, 6) = suma
------------------------------------------------- --------------
If Err Then GoTo Error_Handler
Error_Handler: Cells(1,1)=Fun.ErrorDescription M ensaje de error
---------------------------------------------------------------
End Sub
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 63
Z b Z d(x)
Si queremos aplicar la cuadratura gaussiana a f (x, y) dy dx se deb e hacer, prim ero que todo, un cam -
a c(x)
bio de variable para cambiar [c(x), d(x)] a [ 1, 1] . Esto se hace de manera parecida al pro cedimie nto numerico.
Z b Z d(x) Z b X
n
f (x, y) dy dx 0.5(d(x) c(x)) c nj f [x, 0.5 (d(x) c(x) x nj + d(x) + c(x)) dx]
a c(x) a j =1
Cada Integral puede ser aproximada usando las races de un p olinomio de Legendre de grado distinto.
El algoritmo es el siguiente
1. Entrada: a, b y los enteros m , n corresp ondientes al grado del p olinomio de Legendre que se usa en cada
integral. Deben ser enteros adecuados de acuerdo a los valores c ij , x ij disponibles.
2. Tome
h 1 = (b a)/2 ;
h 2 = (b + a)/2
(a) J = 0
3. Para
4. i = 1, 2, ..., m hacer
(a) Tome J X = 0
x = h1 xm i + h2
d 1 = d(x)
c 1 = c(x)
k 1 = (d 1 c 1 )/2
k 2 = (d 1 + c 1 )/2
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 64
5. Tome J = h 1 J
6. Salida: la aproxim acion de la integral es J
En la implementacion deb emos evaluar funciones de una variable, c(x) y d(x) ,y una funcion de dos variables,
Q = f (x, y) . Para hacer esto, almacenamos la expresion actual y pro cedemos a evaluar ya sea con Eval1() para
funciones de una variable o Eval() para varias variables. En el codigo aparecen las siguientes lneas para este fin
El codigo com pleto del b oton es (faltan las funciones xi() y yi()
fxy = C ells(2, 2)
cx = C ells(3, 5)
dx = C ells(3, 6)
a = C ells(3, 3) b
= C ells(3, 4) n =
C ells(3, 7) m =
C ells(3, 8)
h2 = (b + a) / 2
Jt = 0
paso2
For i = 1 To m
paso 3
JX = 0
xa = h1 * xi(m , i) + h2
OK = Fun.StoreExpression(dx) form ula actual es d (x)
If Not OK Then GoTo Error_H andler
d1 = Fun.Eval1(xa) d(xa)
c1 = Fun.Eval1(xa) c(xa)
k1 = (d1 - c1) / 2
k2 = (d1 + c1) / 2
For J = 1 To n
ya = k1 * xi(n, J) + k2
JX = JX + ci(n, J) * Q
Next J
Jt = Jt + ci(m , i) * k1 * JX
Next i
Jt = h1 * Jt
---------------------------------------------------------------
If Err Then GoTo Error_Handler
Error_Handler: Debug.Print Fun.ErrorDescription
---------------------------------------------------------------
End Sub
Z b Z 1 Z b
N ota: Observe que 2 y f (x) dy dx = f (x) dx, entonces esta implementacion se p o dra usar para la
a 0 a
cuadratura gaussiana en una variable.
N ota: Se puede aplicar la misma idea y aproxim ar una integral doble usando Simpson.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 66
dy
= f (t, y), a t b, y(a) = y 0 ( )
dx
Una solucion de este problema de valor inicial es una funcion derivable y(t) que cumple las condiciones de ( ).
Definicion 1
Consideremos un conjunto D R y una funcion f (t, y) definida en D . Si existe una consta nte L > 0 tal que
se dice que f (t, y) cumple una condicion de Lipschitz en la variable y en D . A L se le llama constante de
Lipschitz para f .
N ota: Una cond icion suficiente para que f (t, y) cum pla una condicion de Lipschitz en D es que exista L > 0
f
tal que (t, y)
L, (t, y) D
y
Definicion 2
(t 2 ,y 2 )
(t 1 ,y 1 )
(t 2 ,y 2 ) (t 1 ,y 1 )
No convexo
Convexo
N ota: Observe que, cuando = 0 estamos en el punto inicial (t 1 , y 1 ) y cuando = 1 estamos en el punto
final (t 2 , y 2 ) . = 1/2 corresp onde al punto medio del segmento.
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 67
Teorem a 1
N ota: Un problem a de valor inicial esta bien planteado si pequenos cambios o p erturbaciones en el planteo
del problema (debido a errores de redondeo en el problema inicial, p or ejem plo), o casiona cambios p equenos en
la solucion del problem a. Si un problema cumple las hipotesis del teorema anterior, entonces esta bien planteado.
Ejem plo 13
Consideremos el problema de valor inicial y 0 = y t 2 + 1, t [0, 4], y(0) = 0.5 . Aqu f (t, y) = y t 2 + 1 . Si
D = {(t, y) : 0 t 4, y } , entonces como
(t,
f y) = |1| (t, y) D
y
f cumple una condicion de Lipschitz en y (en este caso p o dem os tom ar L = 1 ). Adem as, como f (t, y)
es continua en D , el problema de valor inicial tiene una solucion unica. De hecho la unica solucion es
y(t) = (t + 1) 2 0.5e t
dy
= f (t, y), a t b, y(a) = y 0 ( )
dx
Si hacemos una particion del intervalo [a, b] en n subintervalos [t 0 , t 1 ], [t 1 , t 2 ], ...[t n1 , t n ] cada uno de longitud
h = (b a)/n , es decir t i+1 = a + ht i , entonces usando un polinomio de Taylor alrededor de t 0 = a , pode-
mos calcular n aproximaciones w i y(t i ) . Este pro cedimie nto, cono cido como metodo de Euler, es como sigue
Recordemos que, usando un el p olinomio de Taylor de grado 1, p o demos encontrar una aproxim acion (lineal)
de la funcion f en los alrededores de a . El teorema de Taylor, formulado de manera conveniente, es
Teorem a 2
Sea h > 0 y f una funcion tal que f y sus primeras k derivadas son continuas en el intervalo [a, a + h] y la
derivada f k +1 existe en ]a, a + h[ , entonces existe un numero (xi), en el intervalo ]a, a + h[ tal que
y 00 ( i ) 2
y(t i+1 ) = y(t i + h) = y(t i ) + h y 0 (t i ) + h
2!
con en ]t i , t i+1 [
y 00 ( i ) 2
Despreciando el termino de error h y usando ( ) obtenemos
2!
w0 = y0
w i+1 = w i + h f (t i , w i ), i = 0, 1, ..., n 1
se llama ecuacion de diferencia asociada al metodo de Euler.
Teorem a 3
|y 00 (t)| M , t [a, b]
hM L(t i a)
|y(t i ) w i | e 1
2L
f (t, y) f (t, y)
N ota: para calcular |y 00 (t)| usamos regla de la cadena: y 00 (t) = + y 0 (t) . Posibleme nte sea
t y
difcil obtener M dado que puede ser necesaria inform acion acerca de y(t) .
Ejem plo 14
w0 = 0.5
w i+1 = w i + h (w i t 2 + 1) = w i + 0.4 w i (0.4 i) 2 + 1 , i = 0, 1, ..., n 1
f f
N ota: observe que, usando regla de la cadena, y 00 (t) = + y 0 (t) = 2t + y(t) t 2 + 1 . As que no
t y
po dem os usar el teorema anterior para estim ar el error dado que no cono cemos, en principio, y(t) .
4 4
4
2 2 2
1 2 3 4 1 2 3 4 1 2 3 4
Como antes, usamos clsM athParser para leer f (t, y) . La implementacion para ejecutar desde un b oton es
y0
a = C ells(4, 1)
b = C ells(4, 2)
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 70
n = C ells(4, 3)
y0 = C ells(4, 4) condicion inicial
fty = C ells(2, 2)
ok = Fun.StoreExpression(fty) form ula actual es f(t,y)
If Not ok Then GoTo Error_H andler
h = (b - a) / n
yi = y0
ti = 0
For i = 0 To n
Fun.Variable("y") = yi
Fun.Variable("t") = ti
ftiw i = Fun.Eval()
C ells(4 + i, 6) = yi
yi = yi + ftiw i * h
C ells(4 + i, 5) = ti
ti = a + (i + 1) * h
Next i
---------------------------------------------------------------
If Err Then GoTo Error_Handler
Error_Handler: C ells(1, 1) = Fun.ErrorDes cription
---------------------------------------------------------------
End Sub
n = 10;
a = 0; b = 4;
h = (b - a)/n;
wis = Arra y[w, n + 1] ; (* wis = {w [1], w [2], ..., w [n]}; w is[[i]] = w [i] *)
(* EDO *)
f[vt_, vw_] = vw - vt^2 + 1;
w[1] = 0.5;
ti = 0;
Do[
w [i + 1] = w [i] + h *f[ti, w [i]];
ti = a + i*h;
, {i, 1, n}];
w lista = Table[{a + i*h , w is[[i + 1]]}, {i, 0, n}];
ti wi y(ti)
1 0. 0
.5 0.
5
2 0.4 1.
1 1.21409
3 0.8 1.876 2.12723
4 1.2 2.7704 3.17994
5 1.6 3.70256 4.28348
6 2. 4
.55958 5.30547
7 2.4 5.18342 6.04841
8 2.8 5.35278 6.21768
9 3.2 4.7579 5.37373
10 3.
6 2.96506 2.86088
11 4. -0.632919 -2.29908
1 2 3 4
-2
dy
= f (t, y), a t b, y(a) = y0 ( )
dx
Para obtener una aproxim acion (t 1 , y 1 ) de (t 1 , y(t 1 )) p o demos usar el teorema fundamental del calculo para
integrar y 0 (t) en [t 0 , t 1 ] .
Z t1 Z t1
f (t, y(t)) dt = y 0 (t) dt = y(t 1 ) y(t 0 )
t0 t0
de donde
Z t1
y(t 1 ) = y(t 0 ) + f (t, y(t)) dt
t0
h
[f (t 0 , y(t 0 )) + f (t 1 , y(t 1 )) ]
2
ahora, cambiamos y(t 1 ) p or la aproxim acion que se obtiene con el metodo de Euler
h
[f (t 0 , y(t 0 )) + f (t 1 , y 0 + hf (t 0 , y 0 )) ]
2
prosiguiendo de esta manera obtenemos las sucesiones
w k +1 = y k + hf (t k , y k ), t k+1 = t k + h (predictor)
h
y k +1 = y k + [ f (t ,ky )k+ f (t k+1 , w k +1 ), i = 0, 1, ..., n 1 (corrector)
2
Ejem plo 15
Los graficos que siguen muestran las aproximaciones para distintos valores de n .
4 4 4
2 2 2
1 2 3 4 1 2 3 4 1 2 3 4
y0 = C ells(4, 4)
fty = C ells(2, 2)
ok = Fun.StoreExpression(fty ) form ula actual es f(t,y)
If Not ok Then GoTo Error_H andler
h = (b - a) / n
yk = y0
tk = 0
For k = 0 To n
Fun.Variable("y") = yk
Fun.Variable("t") = tk
ftkyk = Fun.Eval()
C ells(4 + k, 6) = yk
wkm1 = yk + h * ftky k w_{k+1}=yk+h*f(tk,yk)
C ells(4 + k, 5) = tk
tk = tk + h t_{k+1}=tk+h
Fun.Variable("y") = wkm1
Fun.Variable("t") = tk
ftkm1wkm1 = Fun.Eval()
y_{k+1}=yk + h/2[f(tk,yk) + f(t_{k+1},w_{k+1}) ]
yk = yk + h / 2 * (ftkyk + ftkm1wkm1)
Next k
---------------------------------------------------------------
If Err Then GoTo Error_Handler
Error_Handler: C ells(1, 1) = Fun.ErrorDescription
---------------------------------------------------------------
End Sub
Clear[yk, w ];
n = 20;
a = 0; b = 4;
h = (b - a)/n;
wks = Array[w, n + 1] ; (* wis = {w [1], w [2], ..., w [n]};w ks[[i]] = w [i] *)
V B A para Excel M .Sc. Walter Mora F., M.Sc. Jose Luis Espinoza B. 74
(* EDO *)
f[vt_, vy_] = vy - vt^2 + 1;
w[1] = 0.5;
yk = 0.5;
yi[1] = 0.5;
tk = 0;
Do[
w[k + 1] = yk + h*f[tk, yk];
tkm1 = tk + h;
yk = yk + h/2*(f[tk, yk] + f[tkm 1, w[k + 1]]);
yi[k + 1] = yk; (*para im prim ir*)
tk = tkm 1;
, {k, 1, n}];
tk yk y(tk)
1 0. 0
.5 0.
5
2 0.4 1.188 1.21409
3 0.8 2.06544 2.12723
4 1.2 3.06965 3.17994
5 1.6 4.10788 4.28348
6 2. 5
.04287 5.30547
7 2.4 5.67144 6.04841
8 2.8 5.69294 6.21768
9 3.2 4.66235 5.37373
10 3.
6 1.92108 2.86088
11 4. -3.50561 -2.29908
6
1 2 3 4
-2
[3] Burden, R.; Faires, J. Analisis Numerico. Thomson Learning, Mexico, 2002.
[4] De Levie, R. Advanced Excel for Scientific data analysis. Oxford University Press. 2004
[5] Liengme, B. A Guide to Microsoft Excel 2002 for Scientists and Engineers. Butterworth Heinemann, 3rd, ed.
2002.
[6] Scheid, F. Introduccion a la Ciencia de las Computadoras. Serie Schaum. Mc Graw Hill, 1982.
[7] Stewart, J. Calculo en una variable. 4a. ed. Ed. Thomson Learning. 2001.
[8] Volpi, L. Runtim e Math Formulas Evaluation in Excel. Foxes Team. 2003
(http://digilander.libero.it/foxes/mathparser/Run_Time_% 20M ath_Formula_% 20Excel.htm ) .
[9] Volpi, L et al A Class for Math Expressions Evaluation in Visual Basic. Foxes Team. 2003
http://digilander.libero.it/foxes/
[10] Press, W . et al Num erical recipes in C: the art of scientific com puting. 2nd ed. Cambridge Press. 1997
[11] Mora, W . Marn, M . Internet y educacion matematica: Una exploracion de diversas opciones computa-
cionales para ensenar matem atica a traves de Internet. ITCR. Tesis. 1992.
76