4.1.3. Funciones

Una función es, en términos informales, una regla de correspondencia que asocia los elementos de un conjunto de partida o dominio (p.e. el conjunto de los números reales ${\rm I\!R}$, el conjunto de puntos en un plano ${\rm I\!R}^2$ o de eventos en el espacio tiempo ${\rm I\!R}^4$) con los de otro conjunto, llamado rango, de modo a que cada elemento del dominio le corresponde uno y solo un elemento del rango.

Entre los distintos tipos de funciones que reconoce el análisis matemático, en este libro nos concentraremos en:

  • Funciones de variable real: Dominio y rango ${\rm I\!R}$. Ejemplo: $f(t)=t^2$.
  • Funciones de muchas variables o Campos escalares: Dominio ${\rm I\!R}^n$, rango ${\rm I\!R}$. Ejemplos: $f(x,y)=x^2+y^2$, $H(\{q_i\}_N)=\sum_i q_i^2$ (para la notación del conjunto $\{q_i\}$ ver la Sección *Conjunto, tuplas y vectores).
  • Funciones vectoriales: Dominio ${\rm I\!R}$, rango ${\rm I\!R}^n$. Ejemplo: $\vec a(t)=kr^{-n} \hat{e}_r$.
  • Funciones vectoriales de muchas variables o Campos vectoriales: Dominio ${\rm I\!R}^n$, rango ${\rm I\!R}^3$. Ejemplo: $\vec{F}(r,\theta,z):-k(r\cos\theta,r\sin\theta,z)$.

Nota: $t$ como variable genérica de las funciones. En todos los textos de matemáticas (incluso en los de física) se acostumbra usar $x$ como el nombre preferido para representar, de forma genérica, la variable independiente de las funciones. En lo sucesivo cambiaremos esta convención al llamar $t$ a la variable independiente genérica. La razón no puede ser más sencilla: en la mecánica $t$ es el nombre que damos a la variable independiente por excelencia, el tiempo, de modo que muchas de las fórmulas que desarrollaremos en este capítulo, se trasladaran simbólicamente casi sin modificación a la mecánica.

Es obvio que la elección de la letra con la que representamos la variable independiente, no modifica en nada las definiciones y teoremas que veremos en esta sección, de modo que esperamos esta elección no moleste a los más conservadores ni confunda a quienes han estudiado ampliamente estos temas en otros textos.

Algoritmos para funciones

Hay dos maneras de definir una función en Python: 1) como una rutina o 2) como una función lambda.

Como una rutina, una función en Python puede recibir como "argumentos" de entrada no solo las variables de la función sino también argumentos opcionales.

La siguiente función, por ejemplo, permite calcular el valor de la energía potencial de un sistema físico usando la función de varias variables $U(\vec r)=kr^{n}$ (siendo $\vec r:x,y,z$ el vector posición y $r$ su magnitud.)

In [1]:
def U(x,y,z,k=1,n=-1):
    r=(x**2+y**2+z**2)**0.5
    return k*r**n
U(1.0,2.0,0.0) con k = 1 y n = -1 (valores por defecto) = 0.4472135954999579
U(1.0,2.0,0.0) con k = 6.67e-11 y n = -2 = 1.334e-11

Nota: Argumentos obligatorios y argumentos opcionales. Toda rutina en Python puede tener unos argumentos obligatorios (que llamaremos variables) o unos opcionales.

Las variables son en estricto sentido una tupla de valores, por ejemplo x,y,z en la función $U$ en el Alg. (rutina_potencial).

Los argumentos opcionales son, por otro lado, un diccionario de valores, que no es otra cosa que una lista de valores identificados con un nombre (también llamdo clave o key). En la función $U$ en el Alg. (rutina) los argumentos opcionales son k=1,n=-1.

En Python las variables y las opciones de una rutina pueden representarse usando los objetos especiales *variables y **opciones. El uso de estos objetos especiales no es muy común, pero en ciertas situaciones puede ser bastante útil.

Una forma alternativa de la rutina para $U$ en el Alg. (rutina) es:

def U(*variables,**opciones):
    x,y,z=*variables
    r=(x**2+y**2+z**2)**0.5
    return opciones["k"]*r**opciones["n"]

que se puede invocar usando:

var=1.0,2.0
  opc=dict(k=1,n=-2)
  U(*var,**opc)

No parece muy práctico, pero como veremos puede ser muy útil en ciertas situaciones especiales.

Las funciones lambda se usan para representar funciones muy abreviadas y no tienen argumentos distintos de las variables de las que dependen.

Así, por ejemplo, el siguiente algoritmo define una función lambda, U_x, basada en la función $U$ del Alg. (rutina), que depende solo de la variable $x$ cuando y asumes constante los valores de $y$ y $z$ (U_x será util para calcular más abajo la derivadas parcial de $U$ respecto a $x$):

In [3]:
y=1.0
z=1.0
k=1
n=-2
U_x=lambda x:U(x,y,z,k,n)
Ux(0.0) = 0.49999999999999994

4.1.4. Derivadas

La derivada de una función de variable real es en sí misma una función definida por el límite:

\begin{equation} \label{eq:derivada_definicion} \frac{\mathrm{d}f}{\mathrm{d}t}\equiv\lim_{\Delta t\rightarrow 0}\frac{f(t)-f(t+\Delta t)}{\Delta t} \end{equation}

Si el límite no existe decimos que la función no es derivable en $t$.

Nota: Notación de la derivada. A lo largo de la historia la manera como se ha representado la función derivada ha cambiado. Existen al menos tres notaciones comunes:

  • La notación de Leibniz, $\mathrm{d}f/\mathrm{dt}$, $\mathrm{d}^2f/\mathrm{d}t^2$. En esta notación la derivada se representa como si fuera la razón entre dos cantidades, pero no es así ¡mucho cuidado! Usaremos la notación de Leibniz especialmente para representar la derivada de funciones que se escriben de forma explícita, así por ejemplo:

$$ \frac{\mathrm{d}}{\mathrm{d}t}\left(\frac{1}{2} t^2\right) $$

  • La notación de Newton, $\dot f$, $\ddot f$. Esta será la forma que usaremos para denotar a lo largo del libro las derivadas respecto del tiempo (o el tiempo propio en relatividad).

  • La notación de Lagrange, $f'$, $f''$, $f^{(n)}$.

  • La notación de Euler, $\mathrm{D}f$, $\mathrm{D}^2f$, $\mathrm{D}^{n} f$, que no usaremos aquí pero es la notación menos común, pero puede aparecer en el contexto de la mecánica de fluídos.

La definición de derivada de las funciones de variable real como un límite, se extiende por analogía a campos escalares, funciones vectoriales o campos vectoriales. Para las funciones que dependen de varias variables, sin embargo, se usa una notación y un nombre diferente: derivada parcial. La derivada parcial de un campo escalar se define como:

$$ \frac{\partial f}{\partial q_k}= \lim_{\Delta q_k\rightarrow 0}\frac{ f(q_1,q_2,\ldots,q_k+\Delta q_k,\ldots,q_N)- f(q_1,q_2,\ldots,q_k,\ldots,q_N) }{\Delta q_k} $$

La derivada parcial se calcula de la misma manera que la derivada de una variable, con la salvedad de que al hacerlo se asume que todas las demás variables de la función son constantes.

En muchas partes en este libro, y por economía usaremos la notación de Euler para las derivadas parciales, a saber:

$$ \partial_x f\equiv\frac{\partial f}{\partial x} $$

En esta notación una derivada parcial múltiple se escribirá como:

$$ \partial_{xyz}f(x,y,z)\equiv\frac{\partial^3 f}{\partial x\partial y\partial z} $$

A pesar de que la derivada parcial tiene una definición numérica análoga a la de la derivada total, existe una sútil diferencia entre ambas.

Imagine que tenemos una variable independiente $t$ y definimos, a partir de ella, una nueva variable $u$ que es función de $t$ (variable dependiente).

¿Cómo podemos calcular la derivada de una función de la nueva variable $f(u)$ respecto de la variable independiente $t$?

Proposición: Regla de la Cadena. Dada una función compuesta $f(u(t))$, la derivada de $f$ respecto a $t$ es:

$$ \frac{\mathrm{d}f}{\mathrm{d}t}=\frac{\mathrm{d}f}{\mathrm{d}u}\frac{\mathrm{d}u}{\mathrm{d}t} $$

Decimos que la función $f$ depende implícitamente de la variable independiente $t$. En este sentido la regla de la cadena es una regla de derivación implícita.

Usando la notación de Newton la expresión anterior se escribirá de forma abreviada:

$$ \dot{f}(t)=\dot u\frac{\mathrm{d}f}{\mathrm{d}u} $$

¿Qué pasa en el caso en el que $f$ depende de varias variables dependientes, por ejemplo $f(q_1(t),q_2(t),\ldots, q_N(t))\equiv f(\{q_i(t)\}_N)$?

En este caso la regla de la cadena se puede generalizar como:

$$ \frac{\mathrm{d}f}{\mathrm{d}t}= \frac{\partial f}{\partial q_1}\frac{\mathrm{d}q_1}{\mathrm{d}t}+ \frac{\partial f}{\partial q_2}\frac{\mathrm{d}q_2}{\mathrm{d}t}+ \ldots \frac{\partial f}{\partial q_N}\frac{\mathrm{d}q_N}{\mathrm{d}t}= \sum_i \frac{\partial f}{\partial q_i}\frac{\mathrm{d}q_i}{\mathrm{d}t}= \sum_i \dot{q}_i\partial_{q_i} f $$

Ahora bien: ¿existirá, en este caso, la derivada parcial de $f$ respecto de $t$?

La respuesta a esta pregunta, ilustra, justamente, la diferencia sutil entre la derivada ordinaria o derivada total $\mathrm{d}/\mathrm{dt}$ y la derivada parcial $\partial/\partial t$.

Hay dos situaciones posibles:

  • Si la función $f$ no depende explícitamente de $t$, es decir si la variable $t$ no aparece en la fórmula de $f$, entonces $\partial f/\partial t=0$. Este resultado es independiente de que $f$ dependa implícitamente de $t$ a través de otras variables dependientes.

    Ejemplo: si $f(q,t)=q^2$, entonces: $\partial f/\partial t=0$ aunque, por regla de la cadena, $\mathrm{d}f/\mathrm{d}t=2 q\dot q$.

  • Si la fórmula de la función $f$ contiene la variable $t$, entonces su derivada parcial puede ser distinta de cero (dependiendo de la forma funcional de $f$).

    Ejemplo: Si $f(q,t)=q^2+\sin t$, entonces: $\partial f/\partial t=\cos t$ y $\mathrm{d}f/\mathrm{d}t=2 q\dot q+\cos t$.

En este sentido la derivada parcial es como un "operador semántico", es decir un operador sobre las "letras" que aparecen en la fórmula de la función.

Teniendo en cuenta esta propiedad, la forma más general de la regla de la cadena, para una función de varias variables (campo escalar o vectorial) será:

\begin{equation} \label{eq:regla_cadena_general} \frac{\mathrm{d}}{\mathrm{d}t}f(\{q_i\},t)= \sum_i \dot{q}_i\partial_{q_i} f + \frac{\partial f}{\partial t} \end{equation}

4.1.5. Funciones homogéneas

Existe un interesante conjunto de funciones para las cuáles hay una relación no trivial entre su derivada y el valor de la función misma. Se conocen como funciones homogéneas:

Definición 11.2. Funciones homogéneas. Una función general $f(\{q_i\})$ se llama homogénea si frente a una operación de escalado de sus variables (multiplicación por un escalar), la función escala también. En términos matemáticos:

$$ f(\{\lambda q_i\})=\lambda^k f(\{q_i\}) $$

donde $\lambda$ es un número real y $k$ se conoce como el orden de la función.

Las funciones homogéneas son, generalmente polinomios y funciones racionales. Así por ejemplo $f(x,y)=x^2/a^2+y^2/b^2$, con $a$ y $b$ constantes, y que representa la ecuación algebraica de una elipse, es una función homogénea de grado $k=2$. De otro lado $f(x)=x^3y^2+y^5$ es homogénea de grado $k=5$.

Las funciones homogéneas más interesantes para nosotros en este libro son del tipo $f(\vec r)=k r^n$ que son homogéneas de grado $k=n$ (ver problemas al final del capítulo.)

Como mencionamos desde el principio, las derivadas de las funciones homogéneas tienen una propiedad muy importante:

Proposición: Teorema de funciones homogeneas de de Euler. Si una función $f(\{q_i\}_N)$ es homogénea de grado $k$, entonces:

$$ \sum_i q_i \frac{\partial f}{\partial q_i} = k f $$

Para funciones homogéneas definidas en el espacio de tres dimensiones, el teorema de Euler se puede escribir como:

$$ \vec r\cdot\vec{\nabla}f=kf $$

Derivada vectorial

Para funciones de varias variables (especialmente aquellas con dominio en el espacio coordenado ${\rm I\!R}^3$) se definen generalizaciones vectoriales de la derivada que tienen motivaciones e interpretaciones geométricas específicas.

El operador diferencial vectorial básico se conoce como el gradiente. Denotado comúnmente como $\vec{\nabla}$, en coordenadas cartesianas se define explícitamente como:

\begin{equation} \label{eq:gradiente_cartesianas} \vec{\nabla}f(x,y,z)= \frac{\partial f}{\partial x}\hat{e}_x+ \frac{\partial f}{\partial y}\hat{e}_y+ \frac{\partial f}{\partial z}\hat{e}_z \end{equation}

El operador gradiente en el sistema de coordenadas cilíndrico (con la notación definida anteriormente) esta dado por:

\begin{equation} \label{eq:gradiente_cilindricas} \vec{\nabla}f(r,\theta,z)= \frac{\partial f}{\partial r}\hat{e}_r+ \frac{1}{r}\frac{\partial f}{\partial \theta}\hat{e}_\theta+ \frac{\partial f}{\partial z}\hat{e}_z \end{equation}

Donde el factor $1/h_\theta\equiv1/r$ se conoce como factor de escala.

Por su parte en coordenadas esféricas (con la notación definida anteriormente):

\begin{equation} \label{eq:gradiente_esfericas} \vec{\nabla}f(r,\theta,\phi)= \frac{\partial f}{\partial r}\hat{e}_r+ \frac{1}{r}\frac{\partial f}{\partial \theta}\hat{e}_\theta+ \frac{1}{r\cos\phi}\frac{\partial f}{\partial \phi}\hat{e}_\phi \end{equation}

En este caso se ha introducido un nuevo factor de escala: $h_\phi\equiv r\cos\phi$.

Nota: Una notación para el gradiente. Como lo hicimos con la derivada parcial, a lo largo de este libro, abreviaremos el gradiente usando la notación especial:

$$ \partial_{\vec{r}} f\equiv\frac{\partial f}{\partial \vec r}\equiv\vec{\nabla}f $$

Aunque no es una notación muy rigurosa, permite abreviar expresiones que de otra manera serían muy elaboradas. Así por ejemplo, la regla de la cadena (Ec. regla_cadena_general) para funciones definidas en el espacio coordenado, se puede escribir de forma compacta como:

\begin{equation} \label{eq:regla_cadena_multivariables} \dot{f}(x,y,z,t)=\partial_{\vec r} f\cdot\dot{\vec{r}}+\partial_t f \end{equation}

Existen otros operadores vectoriales (laplaciano, divergencia, rotacional) sobre los que no profundizaremos aquí por no ser de mucha utilidad práctica en la mecánica celeste (al menos no al nivel de este libro.)

4.1.5.1. Algoritmos para la derivada

Existen diversos algoritmos para calcular la derivada de una función en una o varias variables. En este libro, en donde sea necesario, nos apoyaremos de la biblioteca científica scipy y su rutina derivative que permite calcular, numéricamente, derivadas de cualquier orden.

El siguiente algoritmo ilustra el uso de derivative y sus opciones:

In [5]:
def f(t):
    from math import sin
    return sin(t)/t

#Valor de la variable independiente donde queremos la derivada
t=2.0

from scipy.misc import derivative

#Primera derivada usando un dx=0.01 y 3 puntos
dfdt=derivative(f,t,dx=1e-2,n=1,order=3)

#Segunda derivada en t
d2fdt2=derivative(f,t,dx=1e-2,n=2,order=5)
dfdt : Numérica = -0.4353938258295498, Exacta = -0.43539777497999166
d2fdt2 : Numérica = -0.019250938436687903, Exacta = -0.01925093843284925

Usando derivative es posible diseñar funciones para calcular derivadas parciales e incluso gradientes (para los cuáles no existen funciones en la biblioteca scipy). Así por ejemplo:

In [7]:
def f(x,y,z):
    from math import sin
    return sin(x*y*z)/(x*y*z)

def partial_derivative_x(f,x,y,z,**opciones):
    f_solo_x=lambda x:f(x,y,z)
    dfdx=derivative(f_solo_x,x,**opciones)
    return dfdx

x=1.0
y=2.0
z=3.0
dfdx=partial_derivative_x(f,x,y,z,dx=0.01)
dfdx: Numérica = 1.0061803563982654, Exacta = 1.006739536350187

Nótese como usamos aquí la función lambda f_solo_x, de la manera que lo hicimos en el Algorítmo (funcion_lambda) para conseguir el resultado deseado.

4.1.6. Integrales

Se llama antiderivada de una función de variable real $f(t)$, a la función $F(t)$ cuya derivada es igual a la función original:

$$ \dot{F}(t)=f(t) $$

O en notación integral:

$$ F(t)\equiv\int f(t)\;\mathrm{d}t $$

A $F(t)$ o equivalentemente $\int f(t)\;\mathrm{d}t$ se la llama también la integral indefinida de $f(t)$.

La antiderivada permite calcular la cuadratura de una función, que no es otra cosa que el área encerrada por la curva en el plano cartesiano definido por la variable independiente y los valores de la función:

Proposición: Fórmula de Newton-Leibniz. $^1$. Dada una función $f(t)$ que tiene antiderivada $F(t)$ definida en el intervalo $[a,b]$, el área o cuadratura de la función en el mismo intervalo esta dado por:

$$ \int_a^b f(t)\;\mathrm{d}t=F(b)-F(a) $$

A la cantidad $\int_a^b f(t)\;\mathrm{d}t$ se la llama integral definida de $f(t)$.

En términos de la integral definida podemos definir una nueva función:

$$ I(t)=\int_a^t f(\tau)\;\mathrm{d}\tau $$

Nótese que para ser rigorusos hemos cambiado el nombre de la "variable de integración" $\tau$ para no confundirla con el límite superior de la integral $t$.

Esta nueva función tiene una importante propiedad:

Proposición: Teorema fundamental del cálculo. Dada una función $f(t)$ integrable en el intervalo $[a,b]$, si definimos la función $I(t)=\int_a^t f(\tau)\;\mathrm{d}\tau$, entonces:

$$ \frac{\mathrm{d}I}{\mathrm{d}t}=f(t) $$

o bien,

\begin{equation} \label{eq:teorema_fundamental_calculo} \frac{\mathrm{d}}{\mathrm{d}t}\int_a^t f(\tau)\;\mathrm{d}\tau=f(t) \end{equation}

Es interesante anotar que aunque la antiderivada $F(t)$ y la función $I(t)$ tienen la misma derivada en $t$, es decir $\mathrm{d}F/\mathrm{d}t=\mathrm{d}I/\mathrm{d}t=f(t)$, no son necesariamente la misma función. Considere, por ejemplo, el hecho elemental de que $I(a)=0$ (por definición) mientras que $F(a)$ podría ser cualquier número (incluyendo cero por supuesto.)

4.1.7. Integrales vectoriales

Una extrapolación del concepto de integral a funciones de varias variables (campos escalares y campos vectoriales) conduce a algunas operaciones integrales de gran importancia en la física. Para los propósitos de lo que veremos en este libro, son de particular interés las integrales del tipo:

$$ \int \vec F\cdot \mathrm{d}\vec r, $$

que se define sobre todos los valores de $\vec r$ de una curva en el espacio coordenado. A esta integral se la conoce como integral de línea. Si la trayectoria es cerrada, escribiremos:

$$ \oint \vec F\cdot \mathrm{d}\vec r, $$

que no se diferencia (matemáticamente) en nada de una integral de línea. A esta integral la llamaremos circulación del campo vectorial $\vec F$.

Otro tipo de integral vectorial de interés es:

$$ \int_\Sigma \vec F\cdot \mathrm{d}\vec{S} $$

Donde $\mathrm{d}\vec S$ tiene dirección normal a la superficie $\Sigma$ (formada por el lugar geométrico de todos los puntos que la definen) y magnitud igual al área de una fracción infinitesimal de la superficie.

Proposición: teorema de Stokes. Si $\vec F(\vec r)$ es un campo vectorial diferenciable en todos los puntos del espacio, entonces:

$$ \oint \vec F\cdot\mathrm{d}\vec r = \int_\Sigma (\vec{\nabla}\times \vec F)\cdot \mathrm{d}\vec{S} $$

Donde $\Sigma$ es cualquier superficie que tenga como frontera la trayectoria sobre la que se define la circulación.

Un importante corolario del teorema de Stokes es el siguiente:

Proposición: Corolario de Stokes. Si el campo vectorial $\vec F(\vec r)$ tiene circulación nula:

$$ \oint \vec F\cdot\mathrm{d}\vec r = 0 $$

Entonces existe un campo escalar $U(\vec r)$ tal que:

$$ \vec F=\vec{\nabla} U $$

Llamamos a $U$ la función potencial de $\vec F$.

4.1.7.1. Algoritmos para la integral

El cálculo numérico de integrales es una basta área del análisis numérico. En cada lenguaje de programación es posible encontrar bibliotecas completas con rutinas para el cálculo de aproximaciones numéricas de integrales definidas e integrales vectoriales.

Para los propósitos de este libro, usaremos la rutina quad de la biblioteca SciPy para calcular numéricamente integrales definidas de funciones de variable real.

En el algoritmo provisto a continuación, calculamos, por ejemplo, el trabajo $W\equiv\int F(x)\;\mathrm{d}x$ sobre una partícula que se mueve en una dimensióm sometida a una fuerza del tipo $F(x)=-kx$, asumiendo que $k=0.1$ y que la partícula se desplaza entre $x=1.0$ y $x=5.0$:

In [9]:
#El integrando debe definirse como una rutina
def F(x,k=1):
    return -k*x

from scipy.integrate import quad
k=0.1
x0=1.0
x1=5.0
integral=quad(F,x0,x1,args=(k,))
Integral: Numérica = (-1.2, 1.3322676295501878e-14), Exacta = -1.2

Nótese que los argumentos opcionales del integrando se pasan como la tupla args que en este caso, dado que la función solo depende de un parámetro opcional, se escribe de forma poco intuitiva como args=(k,) donde la coma final es oblogatoria.

El resultado de la turina quad es una tupla con dos números: el valor de la integral y el error estimado de la misma. Como vemos, en el ejemplo arriba, la integral es prácticamente exacta.

Nota: Cuadraturas Gaussianas. El método usado por quad para calcular la integral se conoce como cuadraturas gaussianas y aproxima la integral como una serie de pocos términos del valor de la función definido en algunos puntos específicos (Press et al., 2007). Las cuadraturas gaussianas permiten calcular la integral de funciones polinómicas de forma exacta. Esta es la razón por la cuál la integral en el ejemplo dado aquí, es idéntica al valor esperado.

NOTAS AL PIE:

  1. A esta fórmula se la llama a menudo segundo teorema fundamental del cálculo