Funciones

Autor/a

Christian Badillo, Lab25

¿Qué es una función?

El concepto de función es quiza uno de los términos más ampliamente utilizados en ciencia e incluso en la vida cotidiana. El uso de este término se remota hasta la época del matemático Leibniz (coinventor del Cálculo junto con Newton), es decir, hace ya bastantes siglos atrás.

La forma más sencilla de definir una función es como: la regla que establece la relación entre dos conjuntos de cosas, o como se hace en muchos cursos introductorios de Cálculo: una función es como una maquina a la cual se le ingresas manzanas y te regresa jugo de manzana. Un esquema que representa esto puede ser el siguiente:

Figura 1. Diferentes Representaciones de una Función.

Notación

  • Se suelen usar mayúsculas para denotar conjuntos de cosas en matemáticas, así X denota un conjunto de cualquier cosa y las minúsculas para denotar un elemento particular del conjunto; así x es un elemento particular del conjunto X.
  • f se sule usar para denotar que existe una función (una regla) que relaciona dos conjuntos cualquiera.
  • f(x) indica que elemento del conjunto Y le corresponde a cada elemento x del conjunto X y se lee “f de x”.

Funciones en la vida diaria

Una forma de entender mejor que es una función es verlo en ejemplos. Empezaremos por ejemplos sencillos y terminaremos con un ejemplo de Psicofísica.

Función lineal: Comprando Frutas

Una de las funciones más sencillas que existen es la función lineal y esta la vemos día a día cuando vamos al supermercado o al tiaguis y compras algo de fruta. Una función lineal se denota de la siguiente forma: \(f(x) = mx + b\), donde \(m\) se le conoce como pendiente y \(b\) el intercepto. Para aclarar el significado de estos dos parámetros veamos el siguiente ejemplo:

Imaginemos que queremos comprar manzanas (45 pesos/kg) y plátanos (20 pesos/kg). En este caso lo que pagaremos por cada fruta depende de los kilos que compremos así: $f(manzanas) = $ precio kilos de manzana* + \(0\), es decir nuestra pendiente es el precio del kg de manzana, entre mayor sea, más rápido aumentara lo que gastemos por cada kilo comprado y entre menor sea, menos tendremos que pagar por cada kilo extra (es menos pronunciado el cambio). Nuestro intercepto \(b\) es en este ejemplo igual a \(0\), es decir si no compramos nada, no pagamos nada, sencillo ¿o no?. Además supongamos que cobran la entrada al tianguis o al supermercado (México mágico) a 10 pesos, en este caso nuestro intercepto \(b\) sería igual a \(10\), pues aunque no compremos nada ya pagamos la entrada.

En el demo interactivo de abajo podras variar los kilos comprados, el precio de la fruta y el cobro por entrar al supermercado o tianguis y ver cuanto pagarías por cada fruta y en total. Nota como diferentes precios se representan por diferentes pendientes (\(m\)).

Haz Clic para ver el Código
```{python}
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import ipywidgets as widgets

%matplotlib inline

mpl.rcParams['font.family'] = ['serif']
mpl.rcParams['axes.linewidth'] = 0.7
mpl.rcParams["lines.linewidth"] = 2
mpl.rcParams['font.size'] = 10

def fruteria(kg_man, kg_pla, man, pla, impuesto):
    X = np.linspace(0, 10, 100)
    Y_man = man * X + impuesto
    Y_pla = pla * X + impuesto

    plt.subplots(figsize = (9, 7))

    plt.plot(X, Y_man, label = "Manzanas", color = "#FF2E00")
    plt.plot(X, Y_pla, label = "Plátanos", color = "#FDE333")


    # Manzana
    plt.vlines(kg_man, 0, man * kg_man + impuesto, colors="#FF2E00", alpha = 0.7, linestyles= "dashed")
    plt.hlines(man * kg_man + impuesto, 0, kg_man, colors = "#FF2E00", alpha = 0.70, linestyles= "dashed")
    plt.annotate(r"{}$".format(round(man * kg_man, 4)), (kg_man + 0.2, man * kg_man + 1 + impuesto), fontsize = 13)

    # Plátano
    plt.vlines(kg_pla, 0, pla * kg_pla + impuesto, alpha = 0.70, colors = "#FDE333", linestyles= "dashed")
    plt.hlines(pla * kg_pla + impuesto, 0, kg_pla, alpha = 0.70, colors = "#FDE333", linestyles= "dashed")
    plt.annotate(r"{}$".format(round(pla * kg_pla, 4)), (kg_pla + 0.2, pla * kg_pla + impuesto + 1), fontsize = 13)

    bottom, top = plt.ylim()
    #Total del precio
    total = man * kg_man + pla * kg_pla + impuesto
    plt.annotate(r"El precio total es: {}".format(round(total, 4)), (3, top - 0.05*top), fontsize = 15)

    plt.tick_params(direction='inout', length = 7, width = 2 , colors='black',
               grid_color='black', grid_alpha= 0.5, pad = 10, labelsize = 10)

    plt.legend(fontsize = 15)

    plt.show()

fruteria(kg_man = 2, kg_pla = 4, man = 45, pla = 20,impuesto = 10)
```

Función exponencial: La curva de olvido de Ebbinghaus

Ahora que ya tenemos más en claro qué es una función, veamos otro tipo de función y como se aplica en Psicología. Una de las funciones más ampliamente utilziadas en todas las ciencias es la función exponencial denotada como: \(f(x) = ae^x\).

Donde: \(e \approx 2.7182...\), denota la constante neperiana que es una de las más importantes pues aparece de forma natural en todos lados; \(a\) es un parametro que nos indica el punto inicial, otra característica de esta función es que el signo de \(x\) controla si la función es creciente o decreciente. Para entender mejor esta función juega con el valor del parámetro \(a\) y el signo de \(x\) con el demo interactivo dde abajo.

Haz Clic para ver el Código
```{python}
def exponencial(a, signo = "Positivo"):
    X = np.linspace(-10, 10, 100)
    plt.subplots(figsize = (9, 7))
    if signo == "Positivo":
        Y = a * np.exp(X)
        plt.plot(X, Y, color = "#4573A0", alpha = 0.9, label = "$f(x) = %s e^x$" %(a), lw = 3.5)
        plt.title(r"Función Exponencial: $f(x) = %s e^x$" %(a), fontsize = 20, pad = 20)
    elif signo == "Negativo": 
        Y = a * np.exp(-X)
        plt.plot(X, Y, color = "#4573A0", alpha = 0.9, label = "$f(x) = %s e^{-x}$" %(a), lw = 3.5)
        plt.title(r"Función Exponencial: $f(x) = %s e^{-x}$" %(a), fontsize = 20, pad = 20)
    
    # Configuramos los ticks de los ejes.
    plt.tick_params(direction='inout', length = 7, width = 2 , colors='black',
               grid_color='black', grid_alpha= 0.55, pad = 10, labelsize = 10)
    
    # Obtenemos la configuración de los ejes para posterior modificación
    ax = plt.gca()  # gca stands for 'get current axis'
    
    # Eliminamos los bordes
    ax.set_frame_on(b = False)

    # Personalizamos la ubicación de los ejes.
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data',0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data',0))

    # Ajustamos el lugar donde se ponen las etiquetas de los ejes
    ax.yaxis.set_label_coords(0.54, 0.98)
    ax.xaxis.set_label_coords(0.99, 0)

    # Add lines for axis x, y
    ax.vlines(x = 0, ymin = 0, ymax = 1000, color = 'black', alpha = 0.55)
    ax.hlines(xmin = min(X), xmax=max(X), y = 0, color = 'black', alpha = 0.55)


    #Límites de los ejes
    plt.ylim(-20, 1000)

    #Configuración de lo que se pone en cada eje
    plt.ylabel(r"$Y$",  size = 13, labelpad = 1, rotation = "horizontal")
    plt.xlabel(r"$X$",  size = 13, labelpad = 1)

    plt.show()


exponencial(a = 10, signo = "Positivo")
```

Ahora que ya comprendes mejor como funciona la función exponencial, veamos un caso de uso en psicología y este es como ya habrás visto en el título de la sección, la llamada curva de olvido de Ebbinghaus (psicólogo pionero en el estudio de la memoria), que busca modelar como es proceso del olvido de items en la memoria.

La función de este modelo es la siguiente \(R = e^{\frac{-t}{S}}\). Donde \(R\) es la “retentiva”, es decir, el porcentaje que se recuerda; \(S\) es la intensidad relativa del recuerdo que esta relacionada con la cantidad de veces que se estudio los ítems a recordar; \(-t\) es el tiempo transcurrido desde el último estudio de los ítems y es negativo ya que como viste en el demo anterior esto hace que la función sea decreciente.

En el demo de abajo podras jugar con estos parámetros y ver como afectan la forma de la función, en e se muestrán dos sliders: * El slider Retención controla el valor del parámetro \(S\) del modelo de Ebbinghaus * El slider Tiempo controla cuanto tiempo ha transcurrrido desde el último repaso de los ítems.

Haz Clic para ver el Código
```{python}
def forgetting_curve(S, t):
    T = np.linspace(0, t, 1000)
    R = np.exp(-T / S)

    plt.subplots(figsize = (9, 7))
    plt.tick_params(direction='inout', length = 7, width = 2 , colors='black',
               grid_color='black', grid_alpha= 0.5, pad = 10, labelsize = 10)
    
    plt.plot(T, R, color = "#B254A5", alpha = 0.85)
    plt.ylabel("%Retención", size = 15, labelpad = 3)
    plt.xlabel("Tiempo (horas)", size = 15, labelpad = 3)
    plt.title(r"Curva de Olvido: $R = e^{\frac{-t}{S}}$, S = %s" %(S), fontsize = 20, pad = 5)

    plt.show()

forgetting_curve(S = 2, t = 10)
```

Función Logarítmica: Weber y Fechner

La función logarítmica es un tipo especial de función ampliamente utilizaada en cualquier disciplina científica y se representa como: \(f(x) = ln(x)\). Pero, ¿qué es un logarítmo? No hay respuesta sencilla, pues los matemáticos lo ha definido de muchas formas, pero solo nos centraremos en un tipo especial llamado logarítmo natural y la forma más sensilla de definirlo es: * El logarítmo natural es el número al cual hay que elevar al número e para obtener el número x, en notación: \(ln(x) = y → e^y = x\). * Advertencia: La función logarítmica a diferencias de las que hemos visto no esta definida para valores negativos\(^1\), es decir, no existe para usos prácticos el \(ln(-1)\).

Por ello, se le considera al logarítmo natural como la función inversa \(f^{-1}\) de la función exponencial, una función inversa es simplemente invertir nuestra máquina de jugos: le metemos jugos y nos regresa las manzanas.

Dentro de las aplicaciones de los logarítmos en psicología es en el campo de la Psicofísica que estudia como percibimos los cambios cuantitativos de fenómenos físicos y químicos como la luz (longitudes de onda), el sonido (Hz), olores, etc. Weber (pionero en psicofísica) menciona que percibimos los cambios de una forma proporcional al estímulo inicial (peso, sonido, etc), matemáticamente \(dS = K\cdot S\), donde \(dS\) representa lo que se conoce como just-noticeable difference (diferencia a penas perceptible) que es el cambio mínimo físico en el estímulo para percibirse psicológicamente como distinto; \(S\) es la intensidad del estímulo inicial; y \(K\) es una constante de proporcionalidad que depende del estímulo.

Fechner realizó extendió está idea y propusó su modelo que ahora se conoce como la Ley de Weber y Fechner: \(\psi = k \cdot ln(S)\), donde \(\psi\) es la percepción del estímulo, \(k\) es una constante específica del estímulo y \(S\) es la intensidad del estímulo.

Lo curioso de está ley es que indica que cuanto mayor sea la intensidad los cambios en el estímulo tendrán que ser mucho mayores para ser percibidos, es decir la función es de ganancias decrecientes.

Función de Potencia: Ley de Stevens

Una función de potencia es del tipo: \(f(x) = x^a\), donde \(a\) es cualquier número real y controla la forma de la función en el caso de que \(a = 0\), solo tenemos una constante (función lineal) la cual es $ f(x) = 1$; cuando \(a = 1\) tenemos el caso de una función lineal con pendiente \(1\) e intercepto \(0\), es decir \(f(x) = x\). En el caso de que $ 0 a < 1$ tenemos una función racional (raíz cuadrada, raíz cúbica, etc) o de otra forma, de ganancias decrecientes; y por último cuando \(a > 1\), la función crece aunque a menor velocidad que una exponencial, es decir, es de ganancias crecientes.

Una aplicación de este tipo de función tan general en psicología es el modelo de Stevens que busca explicar fenómenos psicofísicos que no habían sido explicados por la ley de Weber-Fechner. Su modelo es el siguiente: \(\psi = kS^n\), donde \(k\) es una constante de proporcionalidad, \(S\) es la intensidad del estímulo y \(n\) es un parametro para cada tipo de modelo.

Un hecho interesante es cuando aplicamos una transformación logarítmica a este modelo de Stevens, esto simplemente es una forma de decir que calculamos el logarítmo del modelo de Stevens: \(log(\psi) = log(kS^n)\).

  • Como te habrás dado cuenta, usamos un símbolo diferente para el logarítmo (\(log(\cdot)\)) este indica que nuestro logarítmo tiene una base 10, es decir \(log(10) = 1\), ya que \(10^1 =10\); \(log(100) = 2\), ya que \(10^2 = 100\), etc.

Esta transformación nos permite usar diversas propiedades de los logarítmos de la siguiente forma: \[\begin{align} \\ log(\psi) &= log(kS^n)\\ log(\psi) &= n⋅log(kS)\\ log(\psi) &= n⋅log(S) + log(k)\\ \\ \end{align}\]

Y está última igualdad no es más que una ecuación lineal como podras ver en apartados superiores.

En el siguiente demo podras jugar con las funciones de los modelos de Stevens, Weber y Fechner. Podrás ver 2 sliders y una caja de opciones: * El slider Constante modifica el valor de la constante \(K\) en todos los modelos. * El slider Exponente modifica el valor al cual se eleva \(S\) en el modelo de Stevens. * La caja de opciones Tipo de Stevens modifica si quieres ver la visualización del modelo de Stevens en su forma normal (“normal”) o si se le aplica una transformación logarítmica (“log”).

Haz Clic para ver el Código
```{python}
def law_w_f(k, a, tipo):

    # Intensidad del estímulo
    X = np.linspace(0.01, 10, 100)
    X_log = np.linspace(0.01, 10e10, 100)
    
    # Modelos de Fechner y Weber
    fechner = k * np.log(X)
    
    weber =  k *X

    stevens = k * X **a
    stevens_log = np.log10(k) + a * np.log10(X_log)

    # Tamaño de la figura
    plt.subplots(figsize = (9, 7))

    # Personalizamos los ticks de los ejes
    plt.tick_params(direction='inout', length = 7, width = 2 , colors='black',
               grid_color='black', grid_alpha= 0.5, pad = 10, labelsize = 10)
    
    # Gráficamos las curvas
    plt.plot(X, weber, color = "#5CA455", alpha = 0.85, label = r"Weber = $k\cdot S$")
    plt.plot(X, fechner, color = "#FA7F2E", alpha = 0.85, label = r"Fechner = $k\cdot ln(S)$")
    if tipo == 'normal':
        plt.plot(X, stevens, color = "#D04101", alpha = 0.85, label = r"Stevens = $k\cdot S^a$")
    elif tipo == 'log':
        plt.plot(np.log10(X_log), stevens_log, color = "#D04101", alpha = 0.85, label = r"log-Stevens = $a\cdot log(S) + log(k)$")
  
    # Nombres de los ejes
    plt.ylabel(r"$\Psi$ (Intensidad Percibida)", size = 15, labelpad = 3)
    plt.xlabel(r"$S$ (Intensidad del Estímulo)", size = 15, labelpad = 3)
    plt.title(r"Modelo de Fechner, Weber y Stevens", fontsize = 20, pad = 5)

    # Límites a grpaficar de los ejes
    plt.ylim(0, 50)
    plt.xlim(0, 10)

    # Muestra las leyendas
    plt.legend(fontsize = 11)

    plt.show()

law_w_f(k = 6, a = 0.5, tipo = 'normal')
```

Ejercicios

  • Define en tus propias palabras ¿qué es una función y por qué un psicologo debería aprender los diferentes tipos y sus propiedaes?
  • ¿Qué aspecto de la función lineal modifica el precio de la fruta?, ¿El impuesto?
  • ¿El valor de la constante \(a\) en la función exponencial cambia que tan rápido crecen los valores?
  • ¿Cuáles son las diferencias entre una función lineal (modelo de Weber) y una logarítmica (modelo de Fechner)?.
  • ¿Qué puedes interpretar de los diferentes modelos psicofísicos?, Menciona un ejemplo donde muestres estas diferencias.

Notas

  • Si existen los logarítmos para números negativos, pero estos están definidos en el campo de los número complejos (\(a + bi\)) y son utilizados en ciencias como la Física e Ingenierías.
  • Existen otro tipo de bases para los logarítmos una de ellas muy utilizada en ciencias computacionales es la base 2: \(log_2(2) = 1\), por lo tanto \(2^1 = 2\), etc. Se utiliza para medir la información (bite), seguro que has escuchado ese nombre y su uso lo veras en el apéndice de Teoría de Probabilidad y Teoría de la Información.

Versión Interactiva.

Aquí puedes encontrar la versión interactiva.