Universidad Externado

Optimización



La interpretación geométrica de la derivada da pie para estudiar los cambios de crecimiento que tiene una función, gracias a esto es posible hallar los puntos en los cuales la función alcanza sus valores extremos, y en éste cuaderno aprenderemos la manera de realizarlo.

¿Para dónde vamos?

El objetivo de éste cuaderno es que se realice una pequeña función en la cual se introduzca únicamente la función a optimizar y se realice el proceso en el cual se hallen los puntos críticos y se defina el tipo de éstos (máximos o mínimos).

Preparación

 1. Instalar el paquete sympy.
 2. Importar el paquete sympy.
 3. Definir la variable.

Algoritmo

 1. Definir la función que se desea optimizar.
 2. Hallar la derivada de la función.
 3. Halle los puntos críticos de la función.
 4. Calcule la segunda derivad de la función.
 5. Evalúe los puntos críticos en la segunda derivada.
 6. Determine la naturaleza del punto crítico

Siguiendo los pasos mencionados anteriormente:

In [1]:
!pip install sympy
Requirement already satisfied: sympy in /home/isaac/anaconda3/lib/python3.7/site-packages (1.5.1)
Requirement already satisfied: mpmath>=0.19 in /home/isaac/anaconda3/lib/python3.7/site-packages (from sympy) (1.1.0)
In [2]:
from sympy import * 
init_printing() #Con este comando se habilita una mejor opción de visualización de los resultados obtenidos
In [3]:
x=symbols("x") #Definimos la variable

Para que el trabajo futuro sea mucho más sencillo aprenderemos a utilizar de mejor manera los ciclos, y para ello es fundamental la creación de listas de elementos.

Comando range

Cuando se emplea el comando range(a,b) se crea una lista que desde a hasta b -1 avanzando de uno en uno. Si la lista que se desea crear no es de números enteros se le puede dar el tamaño del salto con una tercera entrada, es decir, range(a,b,salto). Todas las entradas deben ser números enteros

Ejemplos

In [4]:
lista1=range(1,5)
In [5]:
lista2=range(1,20,2)

Tamaño de una lista

Para determinar la cantidad de elementos que tiene una lista existe un comando, len. La forma de utilizarlo es la siguiente: len(cadena)

Ejemplos

In [6]:
len(lista1)
Out[6]:
$\displaystyle 4$
In [7]:
len(lista2)
Out[7]:
$\displaystyle 10$

Comando append

Éste comando es muy útil ya que permite agregar valores a una lista.

Ejemplo

Dada la siguiente lista

In [8]:
l=[1,5,10,-8,4]
l
Out[8]:
$\displaystyle \left[ 1, \ 5, \ 10, \ -8, \ 4\right]$

agregar el valor $0$ a la lista

In [9]:
l.append(0)
l
Out[9]:
$\displaystyle \left[ 1, \ 5, \ 10, \ -8, \ 4, \ 0\right]$

Ciclos

Vamos a crear ciclos en los cuales vamos a mostrar todos los elementos de las dos listas anteriores.

Recordemos que la estructura del for es la siguiente:

for contador in rango: órdenes

Ejemplos

In [10]:
for i in range(len(lista1)-1):
    print("En la posición ", i ,"el valor es",lista1[i])
En la posición  0 el valor es 1
En la posición  1 el valor es 2
En la posición  2 el valor es 3
In [11]:
for i in range(len(lista2)-1):
    print("En la posición ", i ,"el valor es",lista2[i])
En la posición  0 el valor es 1
En la posición  1 el valor es 3
En la posición  2 el valor es 5
En la posición  3 el valor es 7
En la posición  4 el valor es 9
En la posición  5 el valor es 11
En la posición  6 el valor es 13
En la posición  7 el valor es 15
En la posición  8 el valor es 17

Funciones

Las funciones resultan ser muy útiles cuando deseamos repetir procesos sobre valores distintos.

La definición de las funciones lleva la siguiente estructura

def nombre_de_la_función(variables,que,se,requieran):

órdenes

return [Expresión]

El nombre de la función debe ser sin espacios y se sugiere no usar nombres de funciones definidas previamente para evitar conflictos.

Las variables deben ser separadas por comas.

Ejemplo:

Definiremos una función que imprima los números pares menores al número introducido.

In [12]:
def pares(n):#nótese que hay una única variable ya que nuestro argumento 
             #será únicamente el número en el cual vamos a parar
    if int(n)%2==0: #la función int(n) define a la variable n como un número entero.  
                    #La función % es el módulo (residuo de un número al ser dividido entre el otro)
        for i in range(0,int(n/2)): #Range crea una lista de números enteros en este caso desde el
                                    #0 hasta la mitad de n
            print(i*2)
    else: #si no se cumple la condición
        for i in range(0,int((n+1)/2)):
            print(i*2)
    return 
In [13]:
pares(5)
0
2
4
In [14]:
pares(6)
0
2
4

Ejemplo

Definiremos una función que halle los ceros de una función arbitraria

In [15]:
def ceros(func):
    return solve(func)
In [16]:
ceros(x**3-x)
Out[16]:
$\displaystyle \left[ -1, \ 0, \ 1\right]$

Ejemplo

Ahora definiremos una función $f$ que evalúe una función dada en una lista de valores ingresados en una lista $V$.

In [17]:
def derivadaenlista(f,V):
    f1=diff(f) #Calcula la derivada de la función
    print("La derivada de la función es ", f1) # Muestra la derivada de la función
    R=[]
    for i in range(len(V)):
        R.append(f1.subs(x,V[i]))
    return R
In [18]:
v=[1,2,40,8,6]
In [19]:
derivadaenlista(x**4-3*x**2,[0,1,2,3])
La derivada de la función es  4*x**3 - 6*x
Out[19]:
$\displaystyle \left[ 0, \ -2, \ 20, \ 90\right]$

Comando solve

El comando solve sirve para resolver ecuaciones las cuales deberán estar igualadas a cero, como por ejemplo $$x^2-4=0$$ mediante el comando

solve(x**2-4,x).

Si se desea solicionar la ecuación $$x^3=x$$ primero debe igualarse a cero y se introduce en el comando la parte que contiene las variables $$x^3-x=0$$ introducimos

solve(x**3-x,x)

Ejercicio

Sigue los pasos para realizar el procedimiento descrito al inicio, se dará una función de prueba la cual después será cambiada por una arbitraria.

  1. Defina la función $$f(x)=x^3-x$$
  2. Defina la función optimizar mediante el uso de def optimizar(f):
  3. Halle la derivada de $f$ y muestre el resultado obtenido
  4. Encuentre los puntos críticos. Guarde la respuesta en un vector llamado puntoscriticos.
  5. Encuentre la segunda derivada de $f$ y muestre el resultado obtenido
  6. Haga uso de un for para evaluar la segunda derivada en todos los puntos críticos y así determine su naturaleza.

(ayuda: for i in range(0,len(puntoscriticos)-1):)

In [20]:
def optimizar(f):
    df=diff(f,x)
    print("La primera derivada es:\n",df)
    puntoscriticos=solve(df,x)
    l=len(puntoscriticos)
    print("Los puntos críticos de la función son:\n",puntoscriticos)
    ddf=diff(df,x)
    print("La segunda derivada es:\n",ddf)
    for i in range(0,len(puntoscriticos)):
        if ddf.subs(x,puntoscriticos[i])<0:
            print("En x=",puntoscriticos[i],"se alcanza un máximo y f(x)=")
    return plot(f,(x,puntoscriticos[0]-2,puntoscriticos[l-1]+2))