Practicas Con Python (Peña)
Practicas Con Python (Peña)
Practicas Con Python (Peña)
1
2. Grá…cas con Python 48
2.1. Gra…cas con el módulo sympy . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.1.1. Representación de funciones reales . . . . . . . . . . . . . . . . . . . . . 48
2.1.2. Representación de funciones reales de varias variables . . . . . . . . . . . 50
2.1.3. Visualización de recintos en R3 . . . . . . . . . . . . . . . . . . . . . . . 52
2.1.4. Plano tangente a la grá…ca de una función z = f (x; y) . . . . . . . . . . 54
2.1.5. Representación de curvas . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.1.6. Representación de super…cies parametrizadas . . . . . . . . . . . . . . . . 62
2.2. Grá…cas con el módulo matplotlib . . . . . . . . . . . . . . . . . . . . . . . . . . 64
2.2.1. Representación de funciones reales con el paquete matplotlib . . . . . . . 64
2.2.2. Visualización de conjuntos planos . . . . . . . . . . . . . . . . . . . . . . 69
2.2.3. Representación de funciones en 3D . . . . . . . . . . . . . . . . . . . . . 75
2.2.4. Visualización de conjuntos en el espacio . . . . . . . . . . . . . . . . . . . 79
2.2.5. Representación de curvas planas . . . . . . . . . . . . . . . . . . . . . . . 83
2.2.6. Representación de curvas en el espacio . . . . . . . . . . . . . . . . . . . 84
2.2.7. Vector y recta tangentes a una curva . . . . . . . . . . . . . . . . . . . . 85
2.2.8. Representación de super…cies . . . . . . . . . . . . . . . . . . . . . . . . 86
2.2.9. Vectores tangente y normal a una super…cie parametrizada. Plano tangente 90
2
Capítulo 1
a+b suma
a-b resta
a*b producto
a/b división
a//b proporciona la parte entera del cociente
a %b proporciona el resto de la división entera
a**b ab
El orden a la hora de hacer las operaciones es la usual. Por ejemplo, 2*2+3 realizará primero
la multiplicación y luego la suma. Los paréntesis también se usan de la forma usual, con lo que
2 (2 + 3) realizará primero la suma y luego el producto. La potencia tiene prevalencia frente
a la división, por ejemplo 2**3//2 dará 4 mientras que 2**(3//2) proporcionará el resultado 2.
Para obtener la aproximación de un número real a con n cifras tenemos la expresión
round(a; n). Por ejemplo, round(16;555; 2) = 16;55 y round(16;556; 2) = 16;56.
3
1.1.1. De…nición de constantes
A continuación, una reglas básicas para la de…nición de constantes y variables en Python.
Para asignar un valor a una variable tenemos el =. Por ejemplo a = 10 asignará a a el valor
10. Así, tecleando a=11, b=2 y luego a//b proporciona la salida 5.
Por defecto, Python asigna al símbolo “_” el valor de la última operación realizada. Si
después de hacer la operación a=11, b=2, a//b tecleamos _ obtendremos el valor 5.
Si se utiliza una variable no de…nida Python enviará un mensaje de error.
Se pueden asignar varias constantes a la vez, por ejemplo a,b,c=1,3,4 asignará a a el valor
1, a b el 3 y a c el 4.
Para quitar el valor a una variable o constante a teclearemos del(a):
x or y x j y x_y
x and y x & y x ^ y
not x x :x
4
En cuanto a las comparaciones tenemos las siguientes
x<y x menor que y
x>y x mayor que y
x<=y x menor o igual que y
x>=y x mayor o igual que y
x==y x igual a y
x!=y x distinto de y
Estas operaciones lógicas y comparaciones se pueden utilizar a la hora de realizar programas
en Python, como en los ejemplos anteriores.
con los cinco primeros números primos. Si tecleamos primos[0] obtendremos el valor 2, y el
último 11 será primos[4]. Además, los elementos también se pueden llamar con índices negativos.
Así, primos[-1]=11 y primos[-5]=2. Los índices fuera del rango de valores que va desde -5 a 4
proporcionará error. Nótese que el rango de índices depende del número de elementos de la
lista.
A continuación vamos a dar una serie de sentencias o instrucciones para manipular listas.
Para extraer un subconjunto tenemos “:”. Dada la lista de nombre lista y n > m > 0,
la sentencia lista[m:n] será una nueva lista que contendrá todos los elementos que van de
lista[n] a lista[m-1]. Así, primos[2:3] dará la salida [5] y primos[1:4] proporciona la salida
[3,5,7]. Si tecleamos lista[m:n] dará la lista vacía [].
Si se teclea lista[n:] tendremos todos los elementos de la lista a partir de lista[n]. Tecleando
lista[:m] dará todos los elementos de la lista desde el primero a lista[m-1]. En el ejemplo,
primos[2:] dará la salida [5,7,11] y primos[:2] es [2,3].
Las listas se pueden manipular tanto con índice negativos como con positivos. En el
ejemplo, primos[-3:-1] da la misma salida que primos[3:5]. Además primos[-3:5] da la
misma salida que primos[2:5] ya que primos[-3]=primos[2]. No obstante, es recomendable
no mezclar índices positivos con negativos.
Si tenemos dos listas de nombres lista1 y lista2, se pueden concatenar usando el símbolo
“+”. Si de…nimos la lista
cuad = [1; 4; 9; 16]
con los cuatro primeros cuadradados, podemos de…nir
5
como la lista
[2; 3; 5; 7; 11; 1; 4; 9; 16]:
Para añadir elementos a una lista tenemos la sentencia append. Tecleando lista.append(a)
añadimos a al último lugar de la lista. Por ejemplo, tecleando cuad.append(25) añadimos
25 a la lista cuad, que ahora será [1,4,9,16,25].
Para obtener el número de elementos de una lista tenemos la sentencia len(lista). Por
ejemplo, tecleando len(cuad) obtenemos el resultado 5.
Es posible construir listas cuyos elementos son listas. Por ejemplo, de…nimos las listas
primos=[2,3,5,7,11] y cuad=[1,4,9,16] y la lista conj=[primos,union]. Se tiene que conj
será
[[2; 3; 5; 7; 11]; [1; 4; 9; 16]]
y su tamaño será de 2 elementos. conj[0] es [2,3,5,7,11] y conj[1] es [1,4,9,16]. Si queremos
obtener el elemento 1, debemos teclear conj[1][0]. La manipulación con este tipo de lista
se hace como siguendo los casos anteriores. Por ejemplo, conj[0][2:4] es la lista [5,7].
Actividad 3 Dadas las listas A de los 10 primeros números naturales pares y B de los 5
primeros múltiplos de 3, hacer las siguientes operaciones:
6. Crear una nueva lista D con los elementos pares de C, sin escribir el número en cuestión,
sino seleccionándolo de la lista C.
6
1.1.5. Elementos básicos de programación
Describimos aquí elementos básicos de la programación en Python que son análagos a otros
lenguajes de programación.
print. La senetencia print(argumento) escribirá en pantalla el argumento que le pongamos.
Por ejemplo, print(7) escribirá el número 7. Para escribir un texto lo tenemos que escribir
entre el símbolo ’. Por ejemplo, print(’Python es rollero’) escribirá Python es rollero en
pantalla. Para escribir varios argumentos a la vez hemos de separarlos por comas. Por
ejemplo, print(’Python es rollero’,7).
while. La sentencia while ejecutará una expresión mientras se den las condiciones lógicas
para ello. Vamos a verlo con un ejemplo obteniendo los elementos de la sucesión de
Fibonacci menores de 100. La sucesión de Fibonacci xn se construye con los valores
iniciales x0 = x1 = 1 y la recurrencia xn+2 = xn + xn+1 . Esto es xn = (1; 1; 2; 3; 5; 8; :::).
Con el siguiente programa obtenemos los elementos de la sucesión menores que 20. Primero
introducimos a,b=1,1 y posteriormente tecleamos
while a<20:
print(a)
a,b=b,a+b
que escribirá en columna los números. Aquí los : se ponen al …nal de cada sentencia y se
ejecutará todo lo que haya a continuación que esté con al menos un espacio a la derecha.
Es importante dejar este espacio porque si no tendremos un error, como por ejemplo si
lo que escribimos es
while a<20:
print(a)
a,b=b,a+b
if. La sentencia if es un condicional que puede ir acompañado por else y elif. Veamos con
un ejemplo. En primer lugar introducimos x = 40: A continuación escribimos el programa
if x<10:
print(1)
el programa no devolverá salida porque x es menor que 10. El programa
if x<10:
print(1)
else:
print(2)
devolverá ahora 2, escribiéndolo en pantalla. Ahora el programa
if x<10:
print(1)
elif x<20:
print(2)
else:
print(3)
7
devolverá la salida 3 al ser x menor que 10 y 20. La sentencia elif es abreviatura de else
if.
for. Esta sentencia es un poco diferente a la que podemos encontrar en otros lenguajes de
programación ya que va asociada a un conjunto o lista. Veamos cómo se emplea. Creamos
la lista primos=[2,3,5,7]. Escribimos el programa
for i in primos:
print(i)
que devolverá como salida los números primos 2, 3, 5 y 7 en forma de columna. Nótese
que for siempre va a ir asociada con la sentencia in.
range. La sentencia range sirve para construir listas de números naturales para ser uti-
lizadas por for. Así, range(10) creará un conjunto con los números del 0 al 9. Si queremos
empezar por un valor distinto de 0, por ejemplo 5, tecleamos range(5,9) que creará un
conjunto del 5 al 9. Si deseamos crear un conjunto que empiece por 5, con cuatro elemen-
tos y vaya añadiendo naturales de dos en dos, tecleamos range(5,9,2) que dará la lista con
los números 5, 7 y 9. Combinado con for nos permite escribir el siguiente programa
for i in range(3):
print(i)
for i in range(3,6):
print(i)
for i in range(3,10,3):
print(i)
break, else y continue en bucles. La sentencia break se usa en un bucle para terminar de
ejecutar el mismo antes de que se llegue al …nal. Por ejemplo en el programa
for i in range(1,10):
if i>5:
break
else:
print(i)
8
escribirá los números de 1 al 5 ya que termina el bucle si i es mayor que 5. Nótese que
el else está asociado al if. La sentencia else se puede asociar al for como en el programa
siguiente:
for i in range(1,10):
a=i+1:
else:
print(a)
que devolverá en pantalla 10, esl resultado de la última suma i+1. La sentencia continue
produce la continuación del bucle después de comprobar una condición y proporcionar
una salida. Por ejemplo el programa
for i in range(2,4):
if i % 2==0:
print(i,’es par’)
continue
print(i,’es impar’)
for i in range(2,4):
if i % 2==0:
print(i,’es par’)
else:
print(i,’es impar’)
Actividad 4 Dada la función f (x) = 3;95x(1 x) y x0 = 0;5, obtener los 100 primeros
elementos de la recursión
xn+1 = f (xn ):
Actividad 5 Dada la recusión de la actividad 4, obtener los 100 primeros elementos pares, es
decir, los de la sucesión x0 ; x2 ; x4 ; x6 ; :::
Actividad 6 Dada la recusión de la actividad 4, obtener los 100 primeros elementos multiplos
de 4, es decir, los de la sucesión x0 ; x4 ; x8 ; x12 ; :::
Actividad 7 Dada la función f (x) = 3;95x(1 x) y x0 = 0;5, x1 = 0;25; obtener los 100
primeros elementos de la recursión
Actividad 8 Dados los elementos obtenidos en las activiadades 4 y 7, obtener una lista que
resulte de multiplicar los elementos de las dos lista dos a dos.
9
1.1.6. De…nición de funciones
Para de…nir funciones en Python tenemos la sentencia def, junto con return. Si queremos
de…nir por ejemplo la función f (x) = x2 tecleamos
def f(x):
return x**2
def f(x,y):
return x*y
Las funciones pueden tener de…niciones más so…sticadas. Por ejemplo, vamos a de…nir una
función que nos de los n primeros elementos de la sucesión de Fibonacci. Para ello escribimos
def …b(n):
seq=[]
a,b=1,1
for i in range(n):
seq.append(a)
a,b=b,a+b
return seq
10
lista.append(x). Añade a lista el elemento x en la última posición.
lista.insert(i, x). Añade a lista el elemento x en la posición i.
lista.remove(x). Elimina el primer elemento de la lista cuyo valor sea x.
lista.pop(i). Elimina el elemento de la lista de la posición i. Si no se indica posición, es
decir, lista.pop( ) elimina el último elemento de la lista.
lista.clear(). Elimina todos los elementos de la lista.
lista.index(x). Retorna el índice del primer elemento cuyo valor sea igual a x.
lista.count(x). Retorna el número de veces que x aparece en la lista.
lista.reverse(). Invierte los elementos de la lista.
list.sort(). Ordena los elementos de la lista de menor a mayor.
Podemos utilizar del para borrar los elementos de una lista. Escribiendo del lista[i] elim-
inamos el elemento i, del lista[i:j] elimina los elementos del i al j-1. Así con todas las
posibles formas de trabajar con los elementos de las listas.
Las listas largas pueden generarse fácilmente con bucles en su interior. Veamos un ejemplo.
Supongamos que queremos crear una lista con lo 10 primeros cuadrados 1,4,9,...,81. El siguiente
programa permite hacerlo
cuad=[]
for i in range(10):
squares.append(i**2)
Es posible hacer esto más cómodamente de la siguiente manera:
cuad=[i**2 for i in range(10)]
Es posible incorporar condiciones como por ejemplo
[(x,y) for x in [1,2,3] for y in [3,1,4] if x!=y]
que crea la lista de los pares (x,y) tales que x es distinto de y.
Actividad 11 Dadas las listas A de los 10 primeros números naturales impares y B de los 5
primeros múltiplos de 4, hacer las siguientes operaciones:
11
1.2.2. Conjuntos
Python también incluye un tipo de dato para conjuntos. Un conjunto es una colección no
ordenada y sin elementos repetidos. Las llaves o la función set() pueden usarse para crear
conjuntos. Para crear un conjunto vacío se usa set(). Por ejemplo, un conjunto
A={’a’,’b’,’c’,’d’,’e’,’e’,’b’}
será {’a’,’b’,’c’,’d’,’e’}, nótese que se eliminan elementos repetidos y que los elementos van entre
’. Otro
B=set(’caravana’)
que será {’a’,’c’,’n’,’r’,’v’}.
Para comprobar que un elemento está en A preguntamos con in, y se devolverá el valor True
si está y False si no lo esta. Por ejemplo ’a’ in A retorna True y ’v’ in A retorna False. Las
operaciones son las siguientes:
AjB A [ B
A&B A \ B
A-B A n B
A^B A 4 B
En el ejemplo, AjB retorna {’a’,’b’,’c’,’d’,’e’,’n’,’r’,’v’}, A&B da {’a’,’c’}, A-B da por solución
{’b’,’d’,’e’} y A^B proporciona el valor {’b’,’d’,’e’,’n’,’r’,’v’}.
A = f1; 2; 3; 4; 5g;
f1 (x) = x2 ;
f2 (x) = 2x
12
y
f3 (x) = x2 + 2x + 1:
Como sabemos, estás funciones se de…nen en Python como
def f1(x):
return x**2
def f2(x):
return 2*x
y
def f3(x):
return x**2+2*x+1
Vamos a crear el …chero mifun.py con un editor de textos plano incluyendo las tres funciones.
Ahora podemos importar el …chero desde la carpeta donde lo hemos guardado tecleando import
mifun. Una vez cargado, podemos usar cualquiera de las tres funciones del siguiente modo. Por
ejemplo, para calcular f3 (10) tecleamos
mifun.f3(10)
y obtendremos el valor 100.
No es esta la única manera de importar las funciones que hemos prede…nido. Pordemos usar
la expresión
from mifun import f3
Ahora, para obtener el valor f3 (10) basta teclear f3(10) para obtener el 100. Podemos importar
todas las funciones escribiendo
from mifun import *
Python tiene prede…nidos módulos con funciones y programas que podemos utilizar. El
funcionamiento es análogo aunque no es necesario buscar la ruta donde el …chero está guardado.
Una vez que se ha importado un módulo, podemos ver qué funciones tiene de…nidas tecleando
dir(modulo).
Todos los módulos se pueden cargar y usar con un nombre diferente usando la sentencia as.
Por ejemplo, podemos cargar el módulo creado tecleando
import mifun as func
y ahora sólo hemos de teclear
func.f3(10)
para obtener su valor 100. De igual forma podemos importar como
from mifun import f3 as f
y ahora basta escribir f(10) para obtener su valor 100.
Actividad 13 Crear un módulo llamado fun1var.py con las funciones de…nidas en la actividad
9.
Actividad 14 Crear un módulo llamado fun2var.py con las funciones de…nidas en la actividad
10.
13
1.4. Módulo math
En este módulo están de…nidas la mayoría de las funciones matemáticas usuales. A contin-
uación describimos algunas de las funciones que más se van a utilizar.
14
1.4.4. Constantes
Las constantes prede…nidas en Python son las siguientes:
pi
e número e 2.718281828459045
inf in…nito
nan No un número.
1.5.1. Lógica
Recordemos las sentencias lógicas de Python
x or y x j y x_y
x and y x & y x ^ y
not x x :x
15
Sin embargo, or, and y not debemos usarlos al programar, mientras que para ejercicios de lógica
usaremos j, & y ~.
Veamos que otras sentencias lógicas podemos encontrar en este módulo. Dadas las proposi-
ciones p y q, la implicación p implica q se escribe p>>q o q<<p. Con el siguiente texto se
puede construir la tabla de verdad de p ! q.
from sympy import symbols
p,q=symbols(’p q’)
(p>>q).subs({p:True, q:True })
True
(p>>q).subs({p:True, q:False })
False
(p>>q).subs({p:False, q:True })
True
(p>>q).subs({p:False, q:False })
True
Aquí, hemos escrito en negrita las salidas que proporciona Python. La sentencia de Python
subs() sirve para asignar valores a variables que a continuación son utilizados para veri…car la
operación a la izquierda.
La negación not no puede usarse como los anteriores operadores lógicos. Así, para hallar la
tabla de verdad de p _ :q hay que invertir el valor de q: Es decir, para ver que si p es verdadero
y q es verdadero, entonces p _ :q es verdadero tendríamos que escribir
(p or q).subs({p:True, q:False})
Para trabajar con implicaciones lógicas más complicadas tenemos a nuestra disposición en
sympy las sentencias And(), Not(), Or(). Usaremos la sentencia de Python equals() que permite
comparar dos expresiones que deben tener las mismas variables. Por ejemplo
from sympy import symbols
p,q,r=symbols(’p q r’)
from sympy import And, Or, Not
(p >> q).equals( q >> p)
True
Not(And(p, q, r)).equals(And(Not(p), Not(q), Not(r)))
False
Not(And(p, Not(p))).equals(Or(q, Not(q)))
False
16
equivalentes las proposiciones :(p ^ q ^ r) y (:p)^(:q) ^ (:r), y las proposiciones :(p ^ (:p))
y q _ (:q).
Es importante darse cuenta de que al usar equals se tienen que tener las mismas variables
en las dos fórmulas a comparar. Si no es así, el programa puede darnos un resultado erróneo.
Por ejemplo, la proposición (:p ^ :q ^ r) _ (:p ^ :q ^ :r) es quivalente a :p ^ :q. Sin embargo,
si tecleamos
from sympy import symbols
p,q,r=symbols(’p q r’)
from sympy import And, Or, Not
Or(And(Not(p),Not(q),r),And(Not(p),Not(q),Not(r))).equals(And(Not(p),Not(q)))
False
Actividad 17 Demostrar que las proposiciones :(p^q) y :p_:q son lógicamente equivalentes.
Con And(), Not() y Or() se pueden construir las tablas de verdad de proposiciones. Por
ejemplo
from sympy import And, Or, Not
And(True,True)
True
And(True,False)
False
And(False,True)
False
And(False,False)
False
construye la tabla de verdad de p^q. Como permiten incluir más argumentos, es posible trabajar
con proposiciones más complicadas. Por ejemplo, vamos a ver que ((p ! q) ^ (q ! r)) implica
(p ! r). Para ello tecleamos
y cambiando los valores de {p:True, q:True, r:True} incluyendo todas las combinaciones con
True y False vemos que siempre se obtiene True de salida, por lo que se tratará de una tautología
y la implicación es verdadera.
Al igual que los otros operadores lógicos, la implicación ! también está de…nida en sympy.
17
Se trata de la funcion Implies() y es equivalente a usar >>. Por ejemplo
from sympy import Implies, And, symbols
Implies(True,True)
True
p,q,r=symbols(’p q r’)
Implies(And(Implies(p,q),Implies(q,r)),Implies(p,r)).subs({p:False, q:False, r:False})
True
Similarmente, la doble implicación $ se de…ne como la función Equivalent(). Por ejemplo
from sympy import Equivalent
Equivalent(True,True)
True
1.5.2. Conjuntos
Los conjuntos se pueden estudiar en Python como vimos anteriormente. No obstante, puede
usarse la sentencia simplify_logic para estudiarlos en Python. Esto se debe a que el álgebra de
los operadores lógicos _, ^ y : es análoga al álgebra de conjuntos con [, \ y complementario.
De ejemplo anterior
(~p&~q&~r)j(~p&~q&r) ~p&~q
tiene su análogo en teoría de conjuntos
(Ac \ B c \ C c ) [ (Ac \ B c \ C) = Ac \ B c ;
y se puede obtener esta simpli…cación a partir de la obtenida usando las sentencias de lógica.
18
Actividad 24 Simpli…car los siguientes conjuntos
La sentencia primepi(n) nos permite saber cuántos primos hay menores o iguales que n. Por
ejemplo
from sympy import primepi
primepi(25)
9
La sentencias prevprime(n) y nextprime(n) nos dan, respectivamente, el mayor número primo
menor que n y el menor primo mayor que n. Por ejemplo
19
La sentencia primerange(n) da todos los primos menores que n, mientras que primerange(n,m)
da todos los primos mayores o iguales que n y menores que m, con n<m. La salida es de tipo
range, por lo que para visualizar la solución hay que usar la sentencia list(). Por ejemplo
Los números naturales que no son primos se llaman compuestos. Al igual que los primos,
buen número de ellos estan listados en el módulo y pueden ser llamados con la sentencia
composite(n), como muestra el siguiente ejemplo
De forma similar al caso de los primos, tenemos la sentencia compositepi(n) que da el número
de números compuestos menores o iguales que n. Por ejemplo
Para encontrar los divisores de un número natural n tenemos la sentencia divisors(n), y los
divisores distintos de n se calculan con proper_divisors(n), como muestra el siguiente ejemplo
20
y para calcular en número de divisores de n tenemos divisor_count(n), y proper_divisor_count(n)
para el número de divisores de n distintos de n. Como ejemplo
donde la salida se lee que hay dos divisores, 3 con potencia 2 y 17 con potencia 1, esto es,
153 = 32 17. Recordemos que en el módulo math tenemos de…nido el máximo común divisor y
mínimo común múltiplo, pero tambibén podemos importarlos desde el modulo sympy. Es decir,
se puede hacer el ejemplo
from sympy import gcd, lcm
gcd(24,64)
8
lcm(24,64)
192
Actividad 25 Calcular gcd(215; 36) y gcd(334; 562): Encontrar el mínimo común múltiplo de
ambos pares de números y los x0 e y0 del Teorema de Bezout.
Actividad 26 Calcular gcd(18; 256) y gcd(8316; 10920). Encontrar el mínimo común múltiplo
de ambos pares de números y los x0 e y0 del Teorema de Bezout.
21
La función de Euler es totient(n) para n natural. Así, tecleando
También tenemos implementado el Teorema chino de los restos, con la sentencia crt(lista1,lista2),
donde lista1 contiene los módulos y la lista2 los restos. Por ejemplo, si queremos encontrar x
tal que 8
< x 49(mod 99);
x 76(mod 97);
:
x 65(mod 95);
tecleamos
from sympy.ntheory.modular import crt
crt([99, 97, 95], [49, 76, 65])
(639985, 912285)
cuyo resultado es x = 639985: Nótese que el módulo desde el que se importa es sympy.ntheory.modular,
que es un paquete de sympy. Para comprobar que 639985 es la solución podemos testear
22
por lo que efectivamente, se trata de la solución. Nótese que 912285 = 99 97 95:
Para la resolución de congruencias lineales tenemos la sentencia solve_congruence(par1,par2,...)
donde introducimos pares con el resto y el módulo correspondiente. Por ejemplo, para resolver
8
< x 2(mod 3);
x 3(mod 5);
:
x 2(mod 7);
tecleamos
from sympy.ntheory.modular import solve_congruence
solve_congruence((2, 3), (3, 5), (2, 7))
(23, 105)
cuyo resultado es x = 23: Para comprobar que se trata de la solución podemos teclear
[23 % m for m in [3, 5, 7]]
[2, 3, 2]
Nótese que 105 = 3 5 7.
Actividad 34 Encontrar soluciones enteras de las siguientes ecuaciones, cuando sea posible.
1. 5x + 7y = 4:
2. 6x + 24y = 21:
3. 14x + 21y = 49.
Actividad 35 Resolver el siguiente sistema:
8
>
> 2x 3(mod 7);
<
x 1(mod 9);
>
> x 3(mod 8);
:
x 0(mod 11):
Podemos resolver congruencias del tipo
xn a(mod m)
donde a; n; m 2 N. Para ello, tenemos las sentencias sqrt_mod(par), donde par=(a,m), y
nthroot_mod(triple), donde triple=(a,n,m). En ambos casos, se proporciona una solución en
caso de existir. Para encontrarlas todas debemos añadir True después de introducir los datos.
A modo de ejemplo, para resolver la ecuación
x2 11(mod 43)
tecleamos
from sympy.ntheory import sqrt_mod
sqrt_mod(11, 43)
21
sqrt_mod(11, 43, True)
[21,22]
23
Para resolver
xn a(mod m)
tecleamos
from sympy import nthroot_mod
nthroot_mod(11, 4, 19)
8
nthroot_mod(11, 4, 19, True)
[8,11]
Actividad 36 Encontrar soluciones enteras de las siguientes ecuaciones, cuando sea posible.
1. x2 3(mod 29):
2. x3 3(mod 21):
3. x5 3(mod 19):
Terminamos esta sección con una sentencia para estudiar los elementos del grupo Zm . Dado
n 2 Zm se llama orden de n al menor número natural k tal que nk 1(mod m). Para calcular
el orden tenemos la sentencia Orden aritmetica modular n_order(par), donde par=(n,m). A
modo de ejemplo
from sympy import n_order
n_order(3, 7)
6
n_order(4, 7)
3
por lo que en Z7 el orden de 3 es 6 y el de 4 es 3.
n = ai 10i + ai 1 10i 1
+ ::: + a1 10 + a0
n ai 10i + ai 1 10i 1
+ ::: + a1 10 + a0
=
k k
10i 10i 1
10 1
= ai + ai 1 + ::: + a1 + a0
k k k k
24
es un número entero. Calculamos los restos
8 i
>
> 10 ri (mod k);
>
> i 1
< 10 ri 1 (mod k);
::::::::::::::::::
>
>
>
> 10 r1 (mod k);
:
1 r0 (mod k):
k = 2. Tenemos que 10i 0(mod 2) para todo i 1. Por lo tanto 2jn si y sólo si 2ja0 , es
decir, si a0 es par.
k = 3. Tenemos que 10i 1(mod 3) para todo i 1.Por lo tanto 3jn si y sólo si
3jai + ai 1 + ::: + a1 + a0 : Por ejemplo, 3j111 mientras que no divide a 112.
k = 4. Tenemos que 10 2(mod 4) y 10i 0(mod 4) para todo i 2. Así, 4jn si y sólo
si 4j2a1 + a0 . Por ejemplo, 4j236 ya que 2a1 + a0 = 12, que es divisible por 4.
k = 5. Tenemos que 10i 0(mod 5) para todo i 1. Por lo tanto 5jn si y sólo si 5ja0 , es
decir, si a0 es 0 o 5.
Actividad 38 Probar que 10i 1(mod 9) si i 1. Deducir que 9jn si y sólo si 9jai + ai 1 +
::: + a1 + a0 . Determinar si los siguientes números son divisibles por 9: 2312342123, 923649264,
45702357 y 982675625662956.
Actividad 39 Probar que 10i ( 1)i (mod 11) si i 1. Deducir que 11jn si y sólo si 11j( 1)i
ai + ( 1)i 1 ai 1 + ::: + a2 a1 + a0 . Determinar si los siguientes números son divisibles por
11: 2312342123, 923649264, 45702357 y 982675625662956.
Actividad 40 Probar que 10 3(mod 7), 100 2(mod 7), 1000 1(mod 7), 10000
1(mod 7), y 10i ( 1)i 2 (mod 7) si i 3. Deducir que 7jn si y sólo si 7jai ( 1)i 2 + ai 1
( 1)i 3 + ::: a3 + 2 a2 + 3 a1 + a0 . Determinar si los siguientes números son divisibles por
7: 2312342123, 923649264, 45702357 y 982675625662956.
Actividad 41 Deducir las reglas de divisibilidad de 13 y 17. Dar un número de 25 cifras que
sea múltiplo de 13 y otro que sea múltiplo de 17.
25
Dicho algoritmo se basa en la elección de dos números primos distintos p y q y tomamos
n = p q. A continuación elegimos d tal que es coprimo con (p 1)(q 1) y su inverso d 1 = e
en Z(p 1)(q 1) . Se hacen públicos los valores de n y e, y sólo el receptor del mensaje conoce el
valor de d. Para cifrar el mensaje hacemos la cuenta
y para descifrarlo
fD (x) = xd (mod n):
El código es muy dí…cil de descodi…car si no se tiene el valor de d cuando los primos p y q son
su…cientemente grandes. Nótese que se conoce el valor de n, pero no de p y q, que son necesarios
para obtener el valor de d. Veamos que la descodi…cación puede hacerse, es decir que
x = fD (fC (x)):
Así,
xd e = x1+r '(n) :
Así, hemos de probar que
x1+r '(n) x(mod n):
Distinguimos los siguientes casos:
1. Si gcd(x; n) = 1, entonces por el Teorema de Euler se veri…ca que x'(n) 1(mod n), por
lo que
x1+r '(n) = x (x'(n) )r x 1(mod n) x(mod n):
2. Si gcd(x; n) = p q, entonces x 0(mod n), y por tanto x1+r '(n) = 01+r '(n) 0(mod n).
26
de donde
pq 1
=1+s q
para algún entero s. Entonces
p1+r(p 1)(q 1)
p = p pr(p 1)(q 1)
p = p (1 + sq)r(p 1)
1 :
o equivalentemente
p1+r '(n) p(mod n):
Así
x1+r '(n) = p1+r '(n) (x0 )1+r '(n) p x0 (mod n) x(mod n):
84131476**d %n
22152624
27
Para obtener el valor de e hemos tenido que utilizar el algoritmo de Euclides extendido
y obtener este mediante el Teorema de Bezout. Para codi…car el mensaje hay que hacer la
operación
2215262461867215
y tardaría mucho tiempo de computación hacerlo de forma directa. Por este motivo se ha
calculado con el for.
Actividad 43 Construir un sistema de codi…cación con los primos número 2000 y 5000. Asig-
nando a la letra “a” el valor 11, a “b” el 12 y así consecutivamente, enviar el mensaje “me
gusta el helado de chocolate” sílaba a sílaba. Proporcionar la clave para que el receptor pueda
descodi…carlo.
A.col_del(0)
2 3
2 1
28
Para añadir …las o columnas tenemos las sentencias row_insert(n,b) y col_insert(n,A), donde
n es el número de …la o columna y b es la …la o columna de deseamos insertar. Así, para añadir
una tercera …la con ceros tecleamos
A.row_insert(2,Matrix([[0,
0 1 0]]))
2 3
@ 2 1 A
0 0
Aquí hemos de hacer la siguiente aclaración. Al eliminar …las o columnas, Python asigna a la
variable A la nueva matriz, pero al insertarlas no. Así, si tecleamos
A
2 3
2 1
C[0,2]=0
29
0 1
0 1 1
1 2 4 1 1
Actividad 44 Dados las matrices A = ; B = @ 1 0 1 A, C =
2 3 1 2 1
0 1 1 1 0
0 1 0
yD= @ 2 0 5 A calcular:
2 1 0
Matrices especiales
En nuestros problemas vamos a tener que construir matrices, por lo que es útil saber cómo
se construyen determinadas matrices especiales. Así, tenemos que
diag(a1 ; a2 ; :::; an ) es una matriz diagonal donde los elementos de su diagonal principal
son a1 ; a2 ; :::; an : Los elementos de la diagonal principal pueden ser matrices, por lo que
la diagonal principal puede entenderse como cajas de matrices.
diag(1,2,3)
0 1
1 0 0
@ 0 2 0 A
0 0 3
y tecleando
diag(-1,ones(2,2),Matrix([5,7,5]))
0 1
1 0 0 0
B 0 1 1 0 C
B C
B 0 1 1 0 C
B C
B 0 0 0 5 C
B C
@ 0 0 0 7 A
0 0 0 5
30
Determinantes y valores y vectores propios
Para calcular el determinante de una matriz cuadrada tenemos la sentencia det(). Así, para
calcular el determinante de la matriz
2 3
A=
2 1
tecleamos
from sympy import Matrix
A=Matrix([[2,3],[-2,-1]])
A.det()
4
Para calcular sus valores propios tenemos la sentencia eigenvals. Dada la matriz anterior,
sus valores propios son
A.eigenvals()
p p
f1=2 15i=2 : 1; 1=2 + 15i=2 : 1g
donde la salida muestra los valores propios y su multiplicidad. Para obtener los vectores propios
tenemos la sentencia eigenvects. Por ejemplo, si tecleamos
Matrix([[1,0],[1,1]]).eigenvects()
0
1; 2;
1
Python nos devuelve los valores propios, su multiplicidad y una base de vectores propios de la
matriz
1 0
:
1 1
En este caso tenemos un único valor propio 1 de multiplicidad 2 cuya base de vectores propios
está dada por el vector (0; 1).
Para obtener la forma diagonal de una matriz cuadrada tenemos la sentencia diagonalize.
Así, tecleando
Matrix([[0,1],[1,0]]).diagonalize()
1 1 1 0
;
1 1 0 1
obtenemos la matriz de cambio de base
1 1
1 1
y la forma diagonal
1 0
0 1
de la matriz
0 1
:
1 0
31
Actividad 45 Calcular el determinante de las siguientes matrices cuadradas
3 5 7 2 x a b c
1 cos x cos 2x
2 4 1 1 a x 0 0
(a) (b) cos x cos 2x cos 3x (c)
2 0 0 0 b 0 x 0
cos 2x cos 3x cos 4x
1 1 3 4 c 0 0 x
Actividad 46 Calcular los vectores y valores propios, y en caso de existir, la forma diagonal
de las matrices B y D del ejercicio 44.
Actividad 48 El radio espectral de una matriz es el máximo de los módulos de sus valores
propios. Determinar el radio espectral de las matrices de la actividad 47.
Actividad 49 Dados los grafos de la …gura 1.1, determinar su matriz de adyacencia, si son o
no conexos a partir de ésta y calcular su radio espectral.
32
Figura 1.1: Grafos diversos.
Grafo simple
33
Veamos algunos ejemplos
Para fracciones
from sympy import symbols, cancel, apart
x=symbols(’x’)
cancel((x**2+2*x+1)/((x+1)*(x-2)))
(x + 1)/(x - 2)
apart((x**2+2*x+1)/((x+1)*(x-2)))
1 + 3/(x - 2)
Para expresiones trigonométricas
Finalmente, si tenemos una expresión algebraica expr y queremos sustituir alguna de las
variables que la componen por un número u otra variable, tenemos la sentencia subs(). Los
siguientes ejemplos muestran cómo funciona esta sentencia.
donde tenemos que indicar la variable que queremos sustituir y por qué valor.
1. (x + 1)3 x3 3x.
3. (x + 2)4 (x 2)4 1.
34
2x3 6x2 +2x 6
4. 2x3 4x2 +2x 4
:
cos(2x) 3 cos2 x+1
5. 1 sin x
:
2. sin(x + y + z):
3. (x + 2)3 + (x + 2)2 + (x + 2) + 2:
tan( y)
4. tan(x+y)
:
(x+2)3 +(x+2)2 +(x+2)
5. x+2
:
tan( 3 x)
6. sin( 4 +x)
:
f = Function(0 f 0 )
35
de…nimos una función en la que no decimos qué variables la de…nen. A partir de este momento,
podemos asignarle valores, como por ejemplo
from sympy import symbols
x,y=symbols(’x y’)
f(1)
f(1)
f(x,y)
f(x,y)
f(1,y)
f(1,y)
La función queda así parcialmente evaluada.
Si queremos que la función se evalue completamente, tenemos la sentencia def explicada
anteriormente. Aquí puede ser útil la sentencia lambdify, que combierte la función en otra que
puede ser evaluada por el paquete numpy. Por ejemplo, tecleamos
from sympy import symbols, lambdify
x,y=symbols(’x y’)
f=lambdify([x,y],x+y)
f(1,1)
2
Aquí hemos tomado la función x + y y la hemos preparado para que se pueda emplear con el
paquete numpy, que como veremos es útil para hacer representaciones grá…cas de funciones.
Nótese que en la sentencia lamdify hemos de decir qué variables son las que de…nen la función
en una lista, en este caso, [x,y].
1.5.9. Límites
Para el cálculo de límites tenemos la sentencia limit(f(x), x, x0), donde f(x) es la función, x
la variable y x0 el punto donde queremos calcular el límite. Supongamos que queremos calcular
sin x
lm :
x!0 x
Veamos cómo hacer este límite usando Python. En primer lugar, cargamos
from sympy import symbols, limit
x=symbols(’x ’)
limit(sin(x)/x,x,0)
1
donde 1 es el resultado. En la sentencia limit hay que explicitar la función, la variable y el
punto donde queremos calcular el límite, separados por comas. Es posible hacer límites en 1
como muestra el siguiente ejemplo
from sympy import symbols, limit, oo
x=symbols(’x ’)
limit(x**2+1,x,oo)
oo
36
donde, como vemos oo es 1. También podemos hacer el límite importando ind del módulo
math. Para hacer límites por la derecha e izquierda tenemos la sentencia limit(f(x), x, x0, ’ ’).
Por ejemplo,
1
lm
x!0 x
se calculará como
from sympy import symbols, limit
x=symbols(’x ’)
limit(1/x,x,0,’-’)
-oo
Para calcular límites en varias variables tenemos que usar límites iterados. Por ejemplo, del
límite
x3 + y 3
lm
(x;y)!(0;0) (x2 + y 2 )
x3 + y 3 x3 + y 3
lmlm y lmlm
x!0 y!0 (x2 + y 2 ) y!0 x!0 (x2 + y 2 )
l m r(cos3 + sin3 );
r!0
aunque el alumno deberá saber si estos límites son su…cientes para determinar el valor del límite
doble. En Python
x3 + y 3
lm = 0:
(x;y)!(0;0) (x2 + y 2 )
37
1 cos 2x
1. l mx!0 sin x2
=
log x
2. l mx!1 x
=
1 x2
3. l mx!1 1 x
=
1
4. l mx!0 x
=
x2 +y 2 +x4
3. l m(x;y)!(0;0) x2 +y 2 y 3
:
x2 y+2x2 2xy 4x+y+2
4. l m(x;y)!(1; 2) x2 2x+y 4 +8y 3 +24y 2 +32y+17 :
2x3 x2 +y
3. l m(x;y)!(0;0) x3 x2 +y
:
xy y 2x+2
4. l m(x;y)!(1;1) x 1
:
38
1.5.10. Derivadas
Para el cálculo de derivadas tenemos la sentencia di¤(f(x),x), donde f(x) es la función a
derivar y x es la variable de derivación. Por ejemplo, para calcular la derivada de ex sin x
debemos teclear
from sympy import symbols, di¤, sin, exp
x=symbols(’x’)
di¤(sin(x)*exp(x), x)
exp(x)*sin(x) + exp(x)*cos(x)
Para calcular la derivada n-ésima, tenemos la sentencia di¤(f(x),x,n), donde n es el orden de la
derivada que queremos calcular. Tambié puede calcularse añadiendo la variable que queremos
derivar tantas veces como derivadas queremos hacer. Por ejemplo, a derivada segunda de ex sin x
se calcula tecleando
from sympy import symbols, di¤, sin, exp
x=symbols(’x’)
di¤(sin(x)*exp(x), x,2)
2*exp(x)*cos(x)
di¤(sin(x)*exp(x), x,x)
2*exp(x)*cos(x)
Si tenemos funciones de varias variables, las derivadas las hacemos indicando las variables que
queremos derivar en el orden en que queremos hacer las derivadas separadas por comas. Por
ejemplo
@
sin(xy)
@x@y
se calcula como
from sympy import symbols, di¤, sin
x,y=symbols(’x y’)
di¤(sin(x*y), x,y)
-x*y*sin(x*y) + cos(x*y)
3x+exp
3. f (x) = 1 + x2 +tan x
:
Actividad 60 Calcula la derivada cuarta y sexta de cada una de las funciones del ejercicio
59.
@f @f 2 2 3 @4f
Actividad 61 Calcula ; ; @ f ; @ f; @ f
@x @y @x@y @x2 @x@y@x
y @x4
de cada una de las siguientes funciones:
39
1
2. f (x; y) = arcsin x2 +y 2
:
1+log(x+e ) y
3. f (x; y) = p 2
:
x tan xy
x2
f (x; y) = x2 tan ;
x2 + y 2
@g @g g(x; y)
x (x; y) + y (x; y) = :
@x @y 2
Actividad 65 Sea f : R3 ! R una función dada por f (x; y; z) = log('(x + yz)), donde
' : R ! (0; +1), es una función positiva de clase C 2 . Probar que
Nota: Aquí, teniendo en cuenta que '(t) es una función real de una variable, hay que hacer el
cambio de variable t = x + yz para construir la función f .
1.5.11. Diferencial
Dada una función diferenciable f : A Rn ! Rm podemos calcular la diferencial en un
punto x0 2 A obteniendo la matriz Jacobiana de f en dicho punto. Para ello hay que introducir
la función en forma de matriz y usar la sentencia jacobian.
Veamos por ejemplo como obtener la diferencial de la función f : R ! R3 dada por
f (t) = (cos t; et ; t)
40
en el punto t = 1. Para ello tecleamos
from sympy import symbols, cos, exp, Matrix
t=symbols(’t’)
f=Matrix([[cos(t),exp(t),t]])
f.jacobian([t])
2 3
sin(t)
4 et 5
1
y obtenemos la matriz Jacobiana de la función en un punto arbitrario t. Nótese que hay que
indicar en la sentencia jacobian las variables de las que depende la función. Si tecleamos
f.jacobian([t]).subs({t:1})
2 3
sin(1)
4 e 5
1
obtendremos la matriz Jacobiana en el punto indicado. La diferencial será la aplicación lineal
dada por
df (1)(t) = ( t sin 1; te; t):
Si ahora queremos calcular la diferencial de la función f (x; y) = (xy ; xy) en un punto arbi-
trario, tecleamos
from sympy import symbols, Matrix
x,y=symbols(’x y’)
f=Matrix([[x**y,x*y]])
f.jacobian([x,y])
xy y
x
xy log(x)
y x
41
1.5.12. Integrales
La sentencia para calcular integrales es integrate, que tiene diferentes sintaxis según se trate
de una integral de…nida o inde…nida. Para el cálculo de primitivas, por ejemplo
Z
ex xdx
debemos añadir los límites de integración separados por comas según la sintaxis integrate(f(x),(x,x0,x1)),
donde xo es el límite inferior y x1 el superior. Debemos teclear
tecleando
from sympy import symbols, integrate, exp,oo
x=symbols(’x’)
integrate(x*exp(x),(x,-oo,0))
-1
La integrales dobles y triples se calculan mediante el uso del teorema de Fubbini. Tenemos
dos alternativas a la hora de hacer las integrales, bien usando dos veces la integral simple, bien
explicitando el recinto de integración como se muestran en los siguientes ejemplos, donde se
hace el cálculo por ambos medios. Por ejemplo, para calcular
Z Z
xydxdy
[ 1;1] [0;1]
42
tecleamos
from sympy import symbols, integrate
x,y=symbols(’x y’)
integrate(integrate(x*y,(x,-1,1)),(y,0,1))
0
integrate(x*y,(x,-1,1),(y,0,1))
0
Para calular Z Z
xydxdy
donde
= f(x; y) : y < x; 0 x 1g
tecleamos
from sympy import symbols, integrate
x,y=symbols(’x y’)
integrate(integrate(x*y,(y,0,x)),(x,0,1))
1/8
integrate(x*y,(y,0,x),(x,0,1))
1/8
Actividad 70 Calcular Z Z
(sin x + y + 3)dxdy
D
Actividad 71 Calcular Z Z
x2 dxdy
D
donde D es el recinto limitado por y = x, y = xy0 x 1.
43
Actividad 72 Calcular el área comprendida entre las circunferencias x2 +y 2 = 2x, x2 +y 2 = 4x
y las rectas y = x e y = 0.
Actividad 74 Calcular Z Z Z
xdxdydz
D
Actividad 75 Evaluar Z Z Z
(1 z 2 )dxdydz
D
donde D es la pirámide con vértice superior (0; 0; 1) y vértices de la base (1; 1; 0), (1; 1; 0),
( 1; 1; 0) y ( 1; 1; 0).
Actividad 76 Calcular Z Z Z
xdxdydz
D
donde
D = f(x; y; z) 2 R3 : x2 + z 2 z2; 0 z 2g:
Actividad 77 Calcular Z Z Z
xdxdydz
D
donde
D = f(x; y; z) 2 R3 : x2 + z 2 z 2 ; x2 + y 2 + z 2 1; 0 zg:
D = f(x; y; z) 2 R3 : x2 + z 2 z; 2 x2 y2 + z2 zg:
Actividad 79 Calcular Z Z Z
zdxdydz
D
donde
D = f(x; y; z) 2 R3 : x2 + z 2 + z 2 9; x 0; y 0; z 0g:
44
1.5.13. Resolución de ecuaciones
Para escribir una ecuación en Python tenemos que hacerlo con la sentencia Eq que debemos
importar desde sympy. Si tenemos la ecuación
eq1 = eq2;
ésta se escribe en Python Eq(eq1,eq2) y el programa iguala ambas expresiones. Para resolver la
ecuación tenemos la sentencia solveset que debemos importar desde sympy. Por ejemplo, para
resolver la ecuación x3 + x = 0 tecleamos
from sympy import symbols, Eq, solveset
x=symbols(’x’)
solveset(Eq(x**3+x,0),x)
{0, -I, I}
Notar que debemos indicar la variable que deseamos calcular, ya que es posible reolver la
ecuación
x2 = ax + b
tecleando
from sympy import symbols, Eq, solveset
x,a,b=symbols(’x a b’)
solveset(Eq(x**2,a*x+b),x)
{a/2 - sqrt(a**2 + 4*b)/2, a/2 + sqrt(a**2 + 4*b)/2}
Si la ecuación tiene una de los lados de la igualdad igual a 0, como en el ejemplo x3 + x = 0,
solveset puede usarse de forma más simple
from sympy import symbols, solveset
x=symbols(’x’)
solveset(x**3+x,x)
{0, -I, I}
Tambien podemos usar la sentencia solve, de una sintaxis similar a solveset, que permite
encontrar soluciones de ecuaciones de la forma
ecuacion = 0
y sistemas de ecuaciones de…nidos de la forma de la ecuación anterior. Por ejemplo, para resolver
la ecuación x3 + x = 0 podemos teclear
from sympy import symbols, solve
x=symbols(’x’)
solve(x**3+x,x)
[0, -I, I]
y para resolver el sistema
x + y2 1 = 0;
x+y 1=0
45
tecleamos
from sympy import symbols, solve
x,y=symbols(’x y’)
solve([x+y**2-1,x+y-1],x,y)
[(0, 1), (1, 0)]
La sentencias solve y solveset tienen limitaciones pues permiten obtener soluciones de al-
gunos tipos de ecuaciones polinómicas. Por ejemplo, la sentencia
solveset(cos(x)-x,x)
46
que nos da la grá…ca en el dominio (-2,2) siguiente
que muestra como la aproximación es buena cerca de 0, y varía en los extremos del intervalo.
Si no estamos interesados en el resto, podemos utilizar la sentencia remove para quitar la
O(). Así al teclear
47
Capítulo 2
y obtenemos la representación
Como vemos, tenemos que indicar el intervalo donde queremos representar la función entre
paréntesis. Podemos representar varias funciones a la vez, por ejemplo
48
representa a la vez el seno y el coseno como muestra la siguiente …gura
obtenemos la representación del seno entre 0 y y la del coseno entre 0 y 2 , como muestra la
siguiente …gura
49
2.1.2. Representación de funciones reales de varias variables
Para representar funciones de dos variables tenemos la sentencia plot3d, que tenemos que
importar del módulo sympy.plotting. Habrá que indicar tanto la función como los intervalos
de ambas variables donde queremos hacer la representación. Por ejemplo, para representar la
función sin(xy) en [0; ]2 tecleamos
De nuevo, es posible representar varias funciones separándolas por comas. Por ejemplo, tecle-
ando
from sympy import symbols
from sympy.plotting import plot3d
x,y=symbols(’x y’)
plot3d(x*y, -x*y, (x, -5, 5), (y, -5, 5))
50
obtenemos la grá…ca
que da la grá…ca
2. f (x; y) = x2 + y 2 en el dominio [ 2; 2] [ 2; 2] :
51
1
3. f (x; y) = e x2 +y2 en el dominio [ 2; 2] [ 2; 2] :
1
4. f (x; y) = (x2 + y 2 ) sin x2 +y 2 en el dominio [ 1; 1] [ 1; 1] :
En general, así sólo podremos visualizar conjuntos cuando se puedan expresar como grá…cas
de funciones reales del plano. Veremos más adelante cómo visualizar estos conjuntos usando un
concepto más general de super…cie parametrizada. No obstante, es útil a la hora de representar
el siguiente conjunto
52
Figura 2.1: Visualización del conjunto A:
z = x2 + y 2 ;
z = 10 + x + y;
53
Figura 2.2: Representación del plano z = 10 + x + y y z = x2 + y 2 .
por lo que un dominio apropiado para representar las funciones es [ 3; 4] [ 3; 4]. Para rep-
resentar tecleamos
from sympy import symbols
x,y=symbols(’x y’)
def f(x,y):
return x**2+y**2
def g(x,y):
return 10+x+y
from sympy.plotting import plot3d
plot3d(f(x,y),g(x,y), (x, -3, 4), (y, -3, 4))
pero vemos que la imagen no es nítida. Disminuyendo el dominio donde se hace la representación
tecleando
plot3d(f(x,y),g(x,y),(x,-2,2),(y,-2,2))
obtenemos la …gura 2.2, que nos da una idea de qué conjunto se trata.
es decir la grá…ca de una función real de dos variables. También cómo representar sus curvas
de nivel dadas por la expresión
f (x; y) = c,
donde c es un número real. A continuación, vamos a ver cómo calcular el plano tangente a la
super…cie en un punto (x0 ; y0 ; z0 ) de la misma.
54
Una primera advertencia es que no todo punto (x0 ; y0 ; z0 ) 2 R3 está en la super…cie. Debe
veri…carse que z0 = f (x0 ; y0 ). Por ejemplo, dada la función f (x; y) = sin(xy) de…nida en todo
el plano real, el punto (0; 1; 0) está en la super…cie ya que f (0; 1) = 0, mientras que el punto
(0; 1; 2) no lo está. Debemos siempre veri…car que el punto esté contenido en la super…cie.
Veamos qué es el plano tangente.
Dados (x0 ; y0 ; z0 ) en la super…cie determinada por la grá…ca de la función f de clase C 1 , de
la noción de diferencial tenemos que, dado h = (h1 ; h2 ) 2 R2 , ésta es
h1
Df (x0 ; y0 )(h1 ; h2 ) = Jf (x0 ; y0 )
h2
@f @f h1
= (x0 ; y0 ); (x0 ; y0 )
@x @y h2
@f @f
= (x0 ; y0 )h1 + (x0 ; y0 )h2 :
@x @y
De la de…nición de diferencial tenemos que
@f @f
f (x0 + h1 ; y0 + h2 ) f (x0 ; y0 ) @x
(x0 ; y0 )h1 + @y
(x0 ; y0 )h2
lm = 0;
h!(0;0) jjhjj
o equivalentemente
@f @f
f (x; y) f (x0 ; y0 ) @x
(x0 ; y0 )(x x0 ) + @y
(x0 ; y0 )(y y0 )
lm = 0:
(x;y)!(x0 ;y0 ) jj(x; y)jj
Entonces
@f @f
lm f (x; y) f (x0 ; y0 ) (x0 ; y0 )(x x0 ) + (x0 ; y0 )(y y0 ) = 0;
(x;y)!(x0 ;y0 ) @x @y
es una aproximación de f (x; y). La grá…ca de dicha aproximación es un plano que se llama
plano tangente de f en (x0 ; y0 ; f (x0 ; y0 )).
A continuación vamos a ver cómo calcular con Python el plano tangente de la función
f (x; y) = x2 + y 3 + 3xy el el punto (1; 1; 5) y vamos a hacer una representación conjunta de
ambas funciones. Para ello debemos importar del módulo sympy las sentencias para derivar y
55
representar funciones grá…camente. Tecleamos
z = 5x + 6y 6:
Una representación grá…ca en un conjunto más pequeño conteniendo al (1; 1), por ejemplo
el cuadrado (0;5; 1;5) (0;5; 1;5) nos permite darnos cuenta de que efectivamente, el plano
tangente aproxima a la función. Para ello tecleamos
plot3d(f(x,y),p(x,y), (x,0.5,1.5),(y,0.5,1.5))
56
Figura 2.3: Representación conjunta de la función y el plano tangente a la grá…ca de la función
en el punto (1; 1; 5).
Figura 2.4: Representación conjunta del función y plano tangente en un conjunto más pequeño.
57
4. El punto (1; 1; 2) a la grá…ca z = x2 y2 5x + 2y xy.
Actividad 84 Obtener el plano tangente a la grá…ca de las siguientes funciones en los puntos
que se indican:
1. La función z = x2 + y 4 + 2xy y el punto (0; 1; 1).
2. La función z = x2 + y 3 2xy y el punto (6; 1; 47).
3. La función z = ex + yx y el punto (0; 1; 1).
4. La función z = x2 y2 5x y el punto ( 1; 1; 5).
Actividad 85 Dibujar conjuntamente las grá…cas de las funciones y planos tangentes del ejer-
cicio anterior en un dominio apropiado. Realizar un zoom de la representación grá…ca anterior
que muestre que el plano tangente es una aproximación de la función.
Como en los casos anteriores, podemos representar de forma análoga varias curvas a la vez,
en el mismo dominio, o en dominios diferentes. Por ejemplo
from sympy import symbols, plot_parametric, sin, cos
t=symbols(’t’)
plot_parametric((cos(t), sin(t)), (t, cos(t)), (t, -10, 10))
58
y obtener la grá…ca siguiente, con dos curvas representadas en el mismo dominio.
En el siguiente ejemplo
from sympy import symbols, plot_parametric, sin, cos
t=symbols(’t’)
plot_parametric((cos(t), sin(t), (t, -10, 10)), (t, cos(t), (t, -1, 1)))
para obtener la grá…ca de curvas en diferentes dominios
Como sabemos, es posible que una curva venga expresada en forma implícita. Por ejemplo,
una circunferencia de centro (0,0) y radio 4 viene dada por la ecuación
x2 + y 2 = 4:
Para estos casos tenemos la sentencia plot_implicit, que debemos importar del módulo sympy.plotting.
Para utlizar esta sentencia tenemos que importar de sympy la sentencia Eq(eq1,eq2) que per-
mite introducir la ecuación eq1=eq2. No hace falta introducir entonces dominio alguno. Veámos
59
un ejemplo de como representar la curva anterior
from sympy import symbols
from sympy.plotting import plot_implicit
x,y=symbols(’x y’)
plot_implicit(Eq(x**2 + y**2, 4))
que da la curva
60
Otro ejemplo
from sympy import symbols, sin, cos
from sympy.plotting import plot3d_parametric_line
t=symbols(’t’)
plot3d_parametric_line((cos(t), sin(t), t, (t, -5, 5)),(sin(t), t**2, t, (t, -5, 5)))
que representa dos curvas sobre el mismo dominio como se muestra en la en la siguiente grá…ca
61
x (t) = 1t
2. en el dominio [ 1; 1] :
y (t) = t2
t3
x (t) = p
3. en el dominio [0; 2] :
y (t) = t
8
< x (t) = cos t2
4. sin t2 en el dominio [0; 2 ] :
y (t) = p
:
z (t) = t
x (t) = t2
5. en el dominio [0; 2] :
y (t) = t
Para representar una esfera de radio uno y centro el origen de coordenadas escribimos
from sympy import symbols, sin, cos
from sympy.plotting import plot3d_parametric_surface
u,v=symbols(’u v’)
plot3d_parametric_surface(sin(u)*sin(v), cos(u)*sin(v),cos(v), (u, 0,pi), (v,0,2*pi))
62
que da la grá…ca
63
8
>
> x(u; v) = 3 cos v
<
y(u; v) = 3 sin v
7.
>
> z(u; v) = u
:
(u; v) 2 [0; 10] [0; 2 ]:
8
>
> x(u; v) = 3 cos v
<
y(u; v) = 8 sin v
8.
>
> z(u; v) = u
:
(u; v) 2 [0; 10] [0; 2 ]:
8
>
> x(u; v) = v cos u
<
y(u; v) = v sin u
9.
>
> z(u; v) = v 2
:
(u; v) 2 [0; 2 ] [0; 2]:
8
>
> x(u; v) = cos u cosh v
<
y(u; v) = sin u cosh v
10.
>
> z(u; v) = sinh v
:
(u; v) 2 [0; 2 ] [0; 2]:
8
>
> x(u; v) = u cos v
<
y(u; v) = u sin v
11.
>
> z(u; v) = log(cos v + u)
:
(u; v) 2 [0; 3] [ =2; =2]:
12. El toro es una super…cie producida al girar una circunferencia de radio r alrededor de un
eje situado a una distancia a de la misma. Puede parametrizarse por
8
>
> x(u; v) = (r cos u + a) cos v
<
y(u; v) = (r cos u + a) sin v
>
> z(u; v) = r sin u
:
(u; v) 2 [0; 2 ] [0; 2 ]:
64
Figura 2.5: Representación grá…ca de la función sin(x2 + 1) en el intervalo [ ; ].
…g, ax = subplots()
ax.plot(x, y)
f=lambda x:sin(x**2+1)
…g, ax = subplots()
ax.plot(x, f(x))
65
Figura 2.6: Grá…ca de la función sin(1 + x2 ) con un mallado insu…ciente.
representan esos puntos y se unen mostrando la grá…ca …nal. Obviamente, la grá…ca obtenida
depende de los puntos que se toman en el mallado ya que si no son su…ciente no va a dar una
buena representación grá…ca. Por ejemplo, haciendo
from numpy import linspace,sin,pi
x = linspace(-pi, pi, 2)
y=sin(x**2+1)
es dcir, tomando un mallado con dos puntos y haciendo la representación grá…ca tecleando
…g, ax = subplots()
ax.plot(x,y)
obtenemos la grá…ca de la …gura 2.6, que como vemos no es para nada la función que queremos
representar. Al …nal, siempre es un problema de equilibrio entre el número de puntos del mallado
y el tiempo de computación necesario para producir el resultado.
Si no se explicitan argumentos en la sentencia subplots, ésta de…ne una …gura y unos ejes.
Esta sentencia admite otros argumentos para hacer grá…cas variadas. Tecleando subplots(n,m)
indicamos que vamos a representar conjuntamente n m grá…cas en n …las y m columnas. Por
ejemplo, si ejecutamos
from numpy import linspace
x = linspace(-1, 1, 200)
y posteriormente tecleamos
from matplotlib.pyplot import subplots
…g, ((ax1, ax2, ax3), (ax4, ax5, ax6)) = subplots(2, 3)
ax1.plot(x, x)
ax2.plot(x, x**2)
ax3.plot(x, -x)
ax4.plot(x, -x**2)
ax5.plot(x, x**3)
ax6.plot(x, -x**4)
66
Figura 2.7: Varias representaciones grá…cas.
Tecleando
from matplotlib.pyplot import subplots
…g, (ax1, ax2) = subplots(2, 1)
ax1.plot(x, x)
ax2.plot(x, x**2)
Se obtienen las …guras representadas una debajo de la otra, mientras que
3. f (x) = sin(x2 ) y g(x) = sin2 (x2 ) en el intervalo [ 2 ; 2 ], una grá…ca encima de la otra.
67
Figura 2.8: Representación conjunta de tres funciones.
También es posible representar varias grá…cas en elpmismo dibujo. Por ejemplo, supongamos
que queremos representar las funciones y = x2 , y = x y y = ex 1 a la vez en el intervalo
[0; 1]. Para ello tecleamos
68
2.2.2. Visualización de conjuntos planos
Python puede ayudarnos a visualizar recintos planos que nos puedan ser útilies a la hora de,
por ejemplo, resolver integrales dobles. Para ello debemos de hacer un mallado de una región del
plano, para lo cual usaremos el modulo numpy. De…niremos las funciones mediante la sentencia
de Python lambda, y posteriomente utilizaremos el paquete matplotlib, en particular las
sentecias contour y contourf.
Veamos con un ejemplo práctico cómo hacer estas representaciones grá…cas. Por ejemplo,
vamos a representar circunferencias concéntricas centradas en el origen de coordenadas y de
diferentes radios. Como sabemos, vendrán dadas por la ecuación
x2 + y 2 = R 2 ;
donde R es el radio de la circunferencia.
En primer lugar seleccionamos un rectángulo del plano donde vamos a representar las …guras
y haceos un mallado del mismo. Para ello recurrimos al módulo numpy, tecleando
from numpy import linspace, meshgrid
x = linspace(-1.5, 1.5, 200)
y = linspace(-1.5, 1.5, 200)
X, Y = meshgrid(x, y)
dividimos el intervalo [ 1;5; 1;5] en 200 subintervalos mediante la sentencia linspace, y con
la sentencia meshgrid hacemos un mallado de 200 por 200 puntos del cuadrado [ 1;5; 1;5]
[ 1;5; 1;5], que es la región donde vamos a representar las circunferencias.
Una vez de…nida la región, de…nimos la función f (x; y) = x2 + y 2 . De esta función vamos
a representar sus curvas de nivel de la forma f (x; y) = c para distintos valores de c. Eviden-
temente, c = R2 , por lo que será el cuadrado del radio de cada circunferencia. De…nimos la
función usando la sentencia lambda tecleando
f = lambda x, y: x**2 + y**2
69
Figura 2.9: Circunferencia de radio 1.
70
Figura 2.11: Anillo comprendido entre dos circunferencias.
Si lo que deseamos es dibujar las regiones entre dos valores, es decir una anillo, tenemos la
sentencia contourf, de sintaxis parecida. Por ejemplo, tecleando
Ambas sentencias pueden llevar además una componente adicional, llamada alpha, para
determinar la opacidad, y que viene dada por un número comprendido entre 0 y 1, de manera
que 0 es nada opaco y 1 lo es mucho. Por ejemplo,
contourf(X,Y,f(X,Y),[0.5,1],colors=’blue’, alpha=0.5)
nos da el mismo anillo de la …gura 2.11 con una menor opacidad, como puede verse en la …gura
2.12.
71
Figura 2.13: Tres grá…cas combinadas.
Los límites contenidos en la tabla de contourf pueden ser 1 (escrito ’-inf’) y +1 (intro-
ducido como ’inf’). Por ejemplo, tecleando
contourf(X,Y,f(X,Y),[0.5,1],colors=’blue’)
Es necesario aclarar que precisamos importar las funciones del modulo numpy, y no del
sympy. Por ejemplo, si queremos usar la exponencial, ésta debe ser importada de numpy, en
otro caso dará error.
Otra cuestión a tener en cuenta es que el dominio en el que dibujar las curvas normalmente
se determina por tanteo. Es decir, en los ejemplos anteriores sabemos que las circunferencias
que hemos utilizado están contenidas en el cuadrado [ 2;5; 2;5]. Para otras curvas es posible
que este conjunto dominio no esté claro, y haya que ir variando éste hasta obtener una buena
representación grá…ca.
Veamos cómo representar el conjunto
72
Figura 2.14: El conjunto A, que es la parte del dibujo que queda sin colorear.
73
Figura 2.15: Recinto con una frontera incorporada.
74
Figura 2.16: Grá…ca de la función f (x; y) = x2 + y 2 en [ 1;5; 1;5] [ 1;5; 1;5]:
A veces es útil representar la …gura en un dominio circular. Para ello necesitamos coor-
denadas polares. Veámos como proceder en ese caso con un ejemplo. Tomamos la función
f (x; y) = sin( xy) y vamos a representarla en el círculo de centro el origen de coordenadas y
radio 1. En primer lugar tecleamos
75
Figura 2.17: Grá…ca en un recinto circular.
Con esto de…nimos las coordenadas polares. El radio será r y el ángulo lo hemos denotado por
ang. Hemos toamdo 8 valores para el radio y 36 para el ángulo y hacemos un mallado en las
coordenadas polares (r,ang). La sentencia endpoint=False es para no incluir el valor de 2 ,
porque puede dar poblemas por el teorema de la función inversa.
A continuación, pasamos a coordenadas cartesianas tecleando
from numpy import sin, cos, append
x = append(0, (r*cos(ang)).‡atten())
y = append(0, (r*sin(ang)).‡atten())
z = sin(-x*y)
Aquí, ‡atten se usa para colapsar el array en una dimensión. Notar que también hemos de…nido
los puntos (x,y,z) donde vamos a dibujar la función. Para dibujarla escribimos
from matplotlib.pyplot import subplots
…g, ax = subplots(subplot_kw={’projection’: ’3d’})
ax.plot_trisurf(x, y, z)
donde ahora usamos la sentencia plot_trisurf en vex de plot_surface. Aquí la diferencia está
en cómo es el mallado en cada caso, en uno triangular y en el otro rectangular. Obtenemos la
grá…ca de la …gura 2.17.
Es interesante ver cómo quedaría la anterior grá…ca si hubiéramos usado plot_surface. Para
ello tecleamos
from numpy import meshgrid
X, Y = meshgrid(x, y)
Z=sin(-X*Y)
para el mallado, y
from matplotlib.pyplot import subplots
…g, ax = subplots(subplot_kw={’projection’: ’3d’})
ax.plot_surface(X, Y, Z)
76
Figura 2.18: Otra representación de la función sin( xy) usando plot_surface.
y obtenemos la grá…ca de la …gura 2.18, que como vemos es bastante peor. En cualquier caso,
tenemos dos posibilidades para representar funciones de dos variables en el espacio y siempre
podemos usar la que mejor resultado proporcione.
Es posible visualizar varias grá…ca a la vez. Por ejemplo, dada la función f (x; y) = x2 +
3
y + 3xy veremos que el punto (1; 1; 5) está en la super…cie de…nida por z = f (x; y) y el plano
tangente en dicho punto viene dada por la ecuación z = 5x+6y 6 (ver la sección 2.1.4). Vamos
77
Figura 2.19: Representación conjunta de la función y el plano tangente.
a hacer una representación conjunta de ambas super…cies utilizando la sentencia …gure. Para
ello vamos a selecionar un dominio centrado en (1; 1), por ejemplo [ 2; 4] [ 2; 4]. Ejecutamos
y posteriormente tecleando
Haciendo el conjunto donde representamos las funciones más pequeño, por ejemplo [0; 2]
[0; 2] podemos ver como las grá…cas de las funciones se parecen mucho ya que el plano tangente
es una aproximación local lineal de la función. Simplemente tecleamos
78
Figura 2.20: Representación grá…ca de plano tangente y función en un dominio más reducido.
y
from matplotlib.pyplot import …gure, show
…g = …gure(…gsize=(7, 6))
ax = …g.add_axes([0, 0, 1, 1], projection=’3d’)
ax.plot_surface(X, Y, f(X, Y), color=’yellow’, alpha=0.5)
ax.plot_surface(X, Y, p(X, Y), color=’blue’, alpha=0.25)
show()
para obtener la representación de la grá…ca 2.20.
Actividad 95 Obtener el plano tangente a la grá…ca de las siguientes funciones en los puntos
que se indican:
y vamos a visualizarlo. Para ello de…nimos las funciones siguientes, junto con un mallado tecle-
ando
79
Figura 2.21: Grá…ca del recinto A.
y obtenemos el recinto que se muestra en la …gura 2.21. En la representación aparecen todos los
elementos de…nidos entre la sentencias …gure y show. La primera sentencia …g.add_axes([0, 0,
1, 1], projection=’3d’) de…ne unos ejes en tres dimensiones donde la tupla [0,0,1,1] representan
la dimensiones izquierda, suelo, anchura y altura de los mismos. Una vez de…nidos los ejes ax
se les va añadiendo super…cies con la sentencia plot_surface, que tiene la posibilidad de elegir
color y opacidad.
80
Figura 2.22: Recinto en el espacio tridimensional.
81
Figura 2.23: Grá…ca del conjunto B.
82
Figura 2.24: Curva parametrizada.
p
1. A = f(x; y; z) 2 R3 : x2 + y 2 < z < x + y; x; y 2 [0; 1]g.
p
2. A = f(x; y; z) 2 R3 : 0 < z < x2 + 1; x 2 [ 1; 1]; y 2 [0; 1]g.
para crear un mallado del intervalo [0; 10] y calcular en los puntos del mismo los valores de la
curva que vamos a representar. A continuación hacemos
83
Figura 2.25: Curva en el espacio tridimensional.
Dado que las sentencias son análogas a las usadas para representar funciones reales, pueden
realizarse las mismas operaciones que se podían realizar en ese caso. Por ejemplo, representar
varias curvas a la vez en el mismo sistema de ejes coordenados, o agrupar las …guras matricial-
mente.
84
x (t) = cos 2t
1. en el dominio [0; 2 ] :
y (t) = sin t
x (t) = 1t
2. en el dominio [ 1; 1] :
y (t) = t2
t3
x (t) = p
3. en el dominio [0; 2] :
y (t) = t
8
< x (t) = cos t2
4. sin t2 en el dominio [0; 2 ] :
y (t) = p
:
z (t) = t
8
< x (t) = t2
5. y (t) = t en el dominio [0; 2] :
:
z(t) = 1 + t + t2
85
Figura 2.26: Recta tangente y curva.
para el mallado y cómputo de los puntos de la recta tangente. Para representarlos conjuntamente
tecleamos
from matplotlib.pyplot import …gure, show
ax = …gure().add_subplot(projection=’3d’)
ax.plot(x, y, z)
ax.plot(x1, y1, z1)
show()
obteniendo la representación conjunta de la …gura 2.26.
86
Figura 2.27: Representación grá…ca de un cono.
donde u 2 [0; 2 ] y v 2 [0; 10] se procede de un modo análogo al que se seguía para representar
funciones. Empezamos de…niendo el mallado y las funciones a representar tecleando
Posteriormente tecleamos
from matplotlib.pyplot import subplots
…g, ax = subplots(subplot_kw={"projection": "3d"})
ax.plot_surface(X, Y, Z)
De nuevo aquí pueden considerarse todos los casos que había cuando vimos la representación
de funciones de la forma z = f (x; y). Podemos representar varias super…cies a la vez, y utilizar la
sentencia para hacer mallados triangulares. Por ejemplo, vamos a obtener la super…cie generada
por las super…cies 8
< x (u; v) = v cos u
y (u; v) = v sin u
:
z(u; v) = v
donde u 2 [0; 2 ] y v 2 [0; 1] y 8
< x (u; v) = cos u sin v
y (u; v) = sin u sin v
:
z(u; v) = 1 + cos v
87
Figura 2.28: Super…cie unión de una semiesfera y un cono.
88
8
>
> x(u; v) = u
<
y(u; v) = v
1.
> z(u; v) = u2 + v 2
>
:
(u; v) 2 [ 2; 2] [ 2; 2]:
8
>
> x(u; v) = u
<
y(u; v) = v
2.
>
> z(u; v) = u2 v 2
:
(u; v) 2 [ 4; 4] [ 4; 4]:
8
>
> x(u; v) = u
<
y(u; v) = v
3. 2 2
>
> z(u; v) = e (u +v )
:
(u; v) 2 [ 2; 2] [ 2; 2]:
8
>
> x(u; v) = u
<
y(u; v) = v
4.
>
> z(u; v) = sin u2 sin v 2
:
(u; v) 2 [ 2; 2] [ 2; 2]:
8
>
> x(u; v) = u
<
y(u; v) = v
5.
>
> z(u; v) = sin(uv)
:
(u; v) 2 [ 2; 2] [ 2; 2]:
8
>
> x(u; v) = 16 sin u cos v
<
y(u; v) = 10 sin u sin v
6.
>
> z(u; v) = 10 cos u
:
(u; v) 2 [0; ] [0; 2 ]:
8
>
> x(u; v) = 3 cos v
<
y(u; v) = 3 sin v
7.
>
> z(u; v) = u
:
(u; v) 2 [0; 10] [0; 2 ]:
8
>
> x(u; v) = 3 cos v
<
y(u; v) = 8 sin v
8.
>
> z(u; v) = u
:
(u; v) 2 [0; 10] [0; 2 ]:
8
>
> x(u; v) = v cos u
<
y(u; v) = v sin u
9.
>
> z(u; v) = v 2
:
(u; v) 2 [0; 2 ] [0; 2]:
89
8
>
> x(u; v) = cos u cosh v
<
y(u; v) = sin u cosh v
10.
>
> z(u; v) = sinh v
:
(u; v) 2 [0; 2 ] [0; 2]:
8
>
> x(u; v) = u cos v
<
y(u; v) = u sin v
11.
>
> z(u; v) = log(cos v + u)
:
(u; v) 2 [0; 3] [ =2; =2]:
12. El toro es una super…cie producida al girar una circunferencia de radio r alrededor de un
eje situado a una distancia a de la misma. Puede parametrizarse por
8
>
> x(u; v) = (r cos u + a) cos v
<
y(u; v) = (r cos u + a) sin v
>
> z(u; v) = r sin u
:
(u; v) 2 [0; 2 ] [0; 2 ]:
n1 (x x0 ) + n2 (y y0 ) + n3 (z z0 ) = 0:
90
Veamos con un ejemplo como representar conjuntamente la super…cie y el plano tangente a
un punto regular de la misma. Por ejemplo, tomamos la super…cie
8
>
> x(u; v) = 3 cos v
<
y(u; v) = 3 sin v
>
> z(u; v) = u
:
(u; v) 2 [0; 10] [0; 2 ]:
p p
Tomamos u0 = 5 y v0 = 5 =4, por lo que el punto ( 3 2=2; 3 2=2; 5) pertenece a la
super…cie. Sabemos que
Tu (u; v) = (0; 0; 1)
y
Tv (u; v) = ( 3 sin v; 3 cos v; 0)
por lo que
p p
n(5; 5 =4) = (0; 0; 1) (3 2=2; 3 2=2; 0)
i j k p p
= p0 0
p 1 = (3 2=2; 3 2=2; 0):
3 2=2 3 2=2 0
o equivalentemente p
x + y + 3 2 = 0;
que en ecuaciones paramétricas es
8
>
> x(u; v) = u p
<
y(u; v) = 3 2 u
>
> z(u; v) = v
:
(u; v) 2 R2 :
91
Figura 2.29: Plano tangente del cilindro.
Actividad 99 Calcular el plano tangente de las siguiente super…cies en los puntos que se
indican y hacer una representación grá…ca conjunta de la super…cie y su plano tangente.
8
>
> x(u; v) = u
<
y(u; v) = v
1. en el punto (1; 1; 2):
>
> z(u; v) = u2 + v 2
:
(u; v) 2 [ 2; 2] [ 2; 2]:
92
8
>
> x(u; v) = u
<
y(u; v) = v
2. en el punto (1; 1; 0):
> z(u; v) = u2 v 2
>
:
(u; v) 2 [ 4; 4] [ 4; 4]:
8
>
> x(u; v) = u
<
y(u; v) = v
3. en el punto (0; 0; 0):
>
> z(u; v) = sin u2 sin v 2
:
(u; v) 2 [ 2; 2] [ 2; 2]:
8
>
> x(u; v) = 16 sin u cos v
<
y(u; v) = 10 sin u sin v
4. en el punto (0; 0; 10):
>
> z(u; v) = 10 cos u
:
(u; v) 2 [0; ] [0; 2 ]:
8
>
> x(u; v) = 3 cos v
<
y(u; v) = 8 sin v
5. en el punto (3; 0; 1):
>
> z(u; v) = u
:
(u; v) 2 [0; 10] [0; 2 ]:
8
>
> x(u; v) = v cos u
<
y(u; v) = v sin u
6. en el punto (0; 1; 1):
>
> z(u; v) = v 2
:
(u; v) 2 [0; 2 ] [0; 2]:
93
Bibliografía
[2] The Python Library Reference, Versión 3.10.5, Guido van Rossum and the Python devel-
opment team.
[3] Python Tutorial, Versión 3.10.5, Guido van Rossum and the Python development team.
[4] https://matplotlib.org/
94