Source: http://docplayer.es/30536-Matematicas-elementales-con-sage.html
Timestamp: 2018-06-20 08:02:40+00:00

Document:
Matemáticas Elementales con Sage - PDF
Download "Matemáticas Elementales con Sage"
Blanca Ortíz Escobar
1 /Author (J. L. Tábara /Title (Matemáticas Elementales con ) Matemáticas Elementales con J. L. Tábara 27 de enero de 2009
2 ÍNDICE GENERAL 1. Aritmética Básica Operaciones con enteros Operaciones con números racionales y reales La ayuda en Comparación de números Primos y factorización División euclídea Máximo común divisor y Mínimo común múltiplo Números complejos Miscelánea Ecuaciones y sistemas Resolución de ecuaciones elementales en modo exacto Resolución de sistemas Manipulación de ecuaciones Resolución numérica de ecuaciones Polinomios Operaciones con polinomios Factorización Raíces de polinomios Fracciones algebraicas Miscelánea Gráficas y objetos gráficos Gráficas de funciones Funciones a trozos y varias funciones Diversos objetos gráficos Análisis Límites Derivadas Integrales Polinomio de Taylor Álgebra Lineal Elemental Vectores y operaciones Matrices y operaciones Determinantes i
3 6.4. Operaciones elementales con matrices Sistemas de ecuaciones Álgebra Lineal Espacios vectoriales Las matrices y los espacios vectoriales Polinomio característico y autovectores Teoría elemental de números Los anillos Z n Funciones multiplicativas A. Cuaterniones 49 B. Grupos abelianos finitos 51 ii
4 CAPÍTULO ONE Aritmética Básica Suele denominarse Aritmética al estudio de las operaciones con números enteros. Nosotros entenderemos por Aritmética también el estudio de las operaciones con otros tipos de números, como pueden ser los racionales y los reales Operaciones con enteros Las operaciones con enteros se realizan en con los operadores habituales. El uso de paréntesis es similar al que se realiza en matemáticas, así como la jerarquía de operaciones. Para calcular potencias se emplea el circunflejo (o el doble asterisco). sage: # Todo lo que aparece tras el signo # es un comentario sage: sage: sage: 125* sage: 125/5 25 sage: 45/23 # Si la division no es exacta tenemos un numero racional 45/23 sage: 190/24 # Si la fraccion es reducible, la reduce 95/12 sage: # Podemos escribir dos o mas operaciones separadas por punto y coma sage: 2^34; 2** sage: # Tambien se pueden separar por comas, y el resultado aparece sage: # en forma de lista, esto es, entre parentesis sage: 2^34, 2**34 ( , ) sage: 2^(-4) # Las potencias de exponente negativo producen fracciones 1/16 sage: # Los parentesis y la jerarquia funcionan como se espera sage: (2 + 6)^2-30* sage: a = 3 # Las variables se inicializan con el signo = sage: 2*a, a^2, 3*a - 2 (6, 9, 7) 1
5 1.2. Operaciones con números racionales y reales Las fracciones se escriben en la forma habitual, con la barra de división. Los números reales se escriben con el punto decimal. Si queremos escribirlos en notación científica, el exponente de la potencia de 10 se escribe tras la letra e. La raíz cuadrada se calcula con la función sqrt(). Para calcular la raíz n-ésima elevamos a 1/n. simplifica radicales, extrayendo factores siempre que es posible. sage: 4/7 + 8/3 68/21 sage: 3/5-6/11 3/55 sage: (3/4-4/5)^3 + (2/3) / (34/89) / sage: sage: 1.456e25 / 2.456e e36 sage: ( )^ sage: # Si aparecen numeros racionales y decimales en una operacion sage: # el programa da la solucion en numeros decimales sage: 4/ sage: sqrt(4), sqrt(8), sqrt(32) (2, 2*sqrt(2), 4*sqrt(2)) sage: 1024^(1/4) # La raiz cuarta 4*sqrt(2) sage: 1024^(1/7) 2*8^(1/7) En Matemáticas existen distintos conjuntos numéricos. Tenemos el conjunto de los números enteros, denotado por Z, el conjunto de los números racionales Q, etc. En hay algo similar, aunque no totalmente igual: en Z y en Q el programa utiliza aritmética exacta, sin embargo en R y en C utiliza aritmética aproximada, por lo que pueden producirse errores. El conjunto de los enteros se denota en el programa por ZZ. Los racionales, los reales y los complejos se denotan QQ, RR y CC. Para saber en que conjunto considera que está cada número utilizamos el método aunque también se puede utilizar la función.base_ring() type() La diferencia entre método y función es su forma de utilización. Para usar una función escribimos el nombre de la función y entre paréntesis el objeto al que se le aplica la función. Sin embargo para utilizar un método, primero escribimos el objeto sobre el que va a actuar, después escribimos un punto y finalmente el método. Para obtener aproximaciones decimales utilizamos la función (y a la vez método) n() 2 Capítulo 1. Aritmética Básica
6 Esta función admite como opción digits para obtener las aproximaciones con distinto número de cifras. sage: a = 2 sage: a.base_ring() Integer Ring sage: type(a) <type sage.rings.integer.integer > sage: # El comando in se utiliza como el simbolo pertenece sage: a in ZZ, a in QQ, a in RR, a in CC (True, True, True, True) sage: a = 3/7 sage: a.base_ring() Rational Field sage: type(a) <type sage.rings.rational.rational > sage: a in ZZ, a in QQ, a in RR, a in CC (False, True, True, True) sage: a = sage: a.base_ring() Real Field with 53 bits of precision sage: type(a) <type sage.rings.real_mpfr.realliteral > sage: a in ZZ, a in QQ, a in RR, a in CC (False, True, True, True) sage: # El numero decimal tambien es un numero racional sage: n(sqrt(2)) # Precision por defecto sage: n(sqrt(2), digits=50) # Mayor precision sage: n(sqrt(2), digits=5) sage: sqrt(2).n() # Actuando como metodo sage: sqrt(2).n(digits=30) # El modificador digits como metodo Para extraer el denominador y el numerador de un número racional.denominator(),.numerator() Los números reales se pueden aproximar a los enteros de distintos modos. La forma más habitual es el redondeo, que devuelve el número entero más próximo al número decimal en cuestion. Pero también podemos redondear por defecto y por exceso. Los comandos para realizar todos estos tipos de redondeo son.round(),.floor(),.ceil() Estas 5 instrucciones se pueden utilizar como funciones o como métodos. El método.round() admite una opción, que nos sirve para especificar con cuantos decimales queremos el redondeo. Incluso admite números negativos, si queremos redondear a las decenas, centenas,.... Sin embargo, y por razones no muy bien conocidas, esto solamente funciona si utilizamos la función y no sirve con el método Operaciones con números racionales y reales 3
7 sage: a = 77/23 sage: denominator(a) 23 sage: a.denominator(). 23 sage: a.numerator() 77 sage: a = -74/21 sage: a.numerator(), a.denominator() (-74, 21) sage: a = 3.67 sage: a.round(), a.floor(), a.ceil() (4, 3, 4) sage: a = sage: a.round(), a.floor(), a.ceil() (3, 3, 4) sage: a = sage: a.round(), a.floor(), a.ceil() (-4, -4, -3) sage: a = sage: round(a), round(a,2), round(a,5) (3457, , ) sage: round(a,-1), round(a,-2), round(a,-4) (3460.0, , 0.0) 1.3. La ayuda en La notación de función es más intuitiva y más próxima al hacer matemático. Sin embargo los métodos tienen una ventaja adicional: como primero debemos escribir el objeto, ya sabe qué métodos se pueden aplicar a dicho objeto. Si escribimos un objeto y el punto y pulsamos el tabulador, el programa nos muestra un menú con los métodos que se pueden aplicar a dicho objeto. Si hemos empezado a escribir el método y pulsamos el tabulador, el programa completa la escritura, o en caso de que haya varios métodos que comiencen por dichas letras nos da las alternativas. Esto ayuda mucho en el estudio y hace que muchas veces no tengamos que retener en la memoria la escritura exacta del método. Por esta razón nosotros potenciaremos la utilización de métodos. Para obtener ayuda sobre un método o función, en vez de escribir los paréntesis, escribimos el signo de interrogación? y pulsamos el tabulador. Si la ayuda ocupa más de una pantalla la barra espaciadora nos permite avanzar página. Para salir de la ayuda debemos pulsar la tecla q (del inglés quit). Puede ocurrir que gran parte de la ayuda sea incomprensible para nosotros, pero hay una parte de texto (eso si, en inglés) y ejemplos de uso que nos pueden ser de utilidad. El uso de la ayuda es imprescindible, así como la completación con el tabulador, a pesar de que el texto quede con peor presentación y más difícil de leer. Otra cosa, la completación automática también sirve para funciones, pero aquí el problema es que alguna de las funciones puede no ser aplicable al objeto con el que estamos trabajando. Si en vez de escribir el signo de interrogación escribimos dos signos de interrogación, el programa nos informa del código fuente de la función. En principio esto sólo tiene utilidad para una utilización más avanzada de que la que proponemos en estas notas. 4 Capítulo 1. Aritmética Básica
8 sage: # Veamos que metodos se pueden aplicar a un numero racional sage: a = 7/3 sage: a. a.abs a.inverse_mod a.period a.additive_order a.is_integral a.py a.base_extend a.is_nilpotent a.quo_rem a.base_ring a.is_one a.rename a.category a.is_square a.reset_name a.ceil a.is_unit a.round a.charpoly a.is_zero a.save a.conjugate a.lcm a.sobj a.copy a.list a.sqrt a.db a.minpoly a.sqrt_approx a.denom a.mod a.squarefree_part a.denominator a.mod_ui a.str a.divides a.multiplicative_order a.subs a.dump a.n a.substitute a.dumps a.norm a.support a.factor a.nth_root a.trace a.floor a.numer a.val_unit a.gamma a.numerator a.valuation a.gcd a.order a.version a.height a.parent sage: # Ahora los metodos que empiezan por d sage: a.d a.db a.denominator a.dump a.denom a.divides a.dumps sage: # Pedimos ayuda sobre metodo denominator sage: a.denominator? Type: builtin_function_or_method Base Class: <type builtin_function_or_method > String Form: <built-in method denominator of sage.rings.rational.rational object at 0x9df295c> Namespace: Interactive Docstring: self.denominator(): Return the denominator of this rational number. EXAMPLES: sage: x = -5/11 sage: x.denominator() 11 sage: x = 9/3 sage: x.denominator() 1 Class Docstring: <attribute doc of builtin_function_or_method objects> sage: # Ahora las funciones que empiezan por j j_invariant_qexp jacobi_p join jsmath jacobi jobs jordan_block 1.3. La ayuda en 5
9 1.4. Comparación de números Los operadores de orden son <, >, <=, >= Cuando comparamos dos números con uno de estos operadores, la respuesta es True, si la desigualdad es verdadera y False en caso contrario. Además de los operadores de orden, tenemos los operadores ==,!= El primero devuelve True cuando los dos números que comparamos son iguales. En cambio el segundo operador devuelve True cuando ambos son distintos. sage: 5 < 6 True sage: -5 > 6 False sage: 78 < 78, 78 <= 78 (False, True) sage: # El signo de comparacion es == y no = sage: 45 == 9 * 5 True sage: 78!= 78 False sage: # En vez del simbolo!= tambien se puede emplear <> sage: 78 <> 78, 78 <> 123 (False, True) 1.5. Primos y factorización Un número natural es primo si sus únicos divisores (positivos) son la unidad y él mismo. Los números que no son primos se denominan compuestos. Para ellos rige el Teorema Fundamental de la Aritmética, que afirma que todo número compuesto admite una factorización (única salvo signos) en producto de primos. La comprobación de que un número es primo es un problema computacionalmente costoso. Por ello muchas veces (sobre todo para enteros muy grandes) se hace un análisis probabilístico para verificar si un número es primo. Aún peor, desde el punto de vista computacional, es el problema de la factorización. Por ello solo debemos esperar de resultados para enteros razonables. Para saber si un número es primo debemos emplear el método.is_prime() también puede informarnos si un número es una potencia de un número primo.is_prime_power() 6 Capítulo 1. Aritmética Básica
10 Dado un número entero n, el primer número mayor que n y primo.next_prime() Análogamente el primo inmediatamente anterior a n se calcula con la función (en la versión de no es un método) previous_prime() Las siguientes funciones se expresan por si mismas (del mismo modo que la anterior, no son métodos, solamente funciones) next_prime_power(), previous_prime_power() sage: a = 89; a.is_prime() True sage: 81.is_prime_power() # Sabemos que 81 = 3^4 True sage: 100.is_prime_power() # Sin embargo 100 = 2^2*5^2 False sage: 9.next_prime() 11 sage: previous_prime(16) 13 sage: next_prime_power(14) 16 sage: previous_prime_power(90) 89 sage: # Efectivamente, puesto que 89 = 89^1 Cuando el número es compuesto podemos estar interesados en obtener su descomposición en factores primos.factor() Muy relacionado con el problema de la factorización, se encuentra el problema de hallar todos los divisores de un número dado. Multiplicando cualesquiera factores de la descomposición de un número obtenemos un divisor de dicho número. Es más, cualquier divisor se puede obtener de ese modo. Para obtener una lista con todos los divisores de un número.divisors() sage: 360.factor() 2^3 * 3^2 * 5 sage: # Comprobemos que es correcto sage: 2^3 * 3^2 * sage: 180.divisors() [1, 2, 3, 4, 5, 6, 9, 10, 12, 15, 18, 20, 30, 36, 45, 60, 90, 180] 1.5. Primos y factorización 7
11 1.6. División eucĺıdea En el conjunto de los números enteros existe el concepto de división eucĺıdea. Dados dos números enteros arbitrarios a, b podemos encontrar dos números, únicos, c y r que verifican: a = bc + r. r es un entero positivo o nulo, menor que b. Para obtener el cociente de la división de n entre m se emplean el comando // Para obtener el resto se pueden emplear dos formas alternativas.mod(), % sage: 23 // 5 4 sage: 23 % 5 3 sage: # Comprobemos sage: 4 * sage: # Tambien funciona con numeros negativos sage: -26 // 5-6 sage: -26 % 5 4 sage: -6 * sage: # Lo mismo lo podemos realizar con el metodo mod sage: (-26).mod(5) 4 sage: # El quinto numero de Fermat es sage: 2^(2^5) sage: # Fermat pensaba que era primo. Sin embargo Euler comprobo que sage: % Máximo común divisor y Mínimo común múltiplo Dado un entero n consideramos el conjunto de sus divisores positivos. Ciertamente este es un conjunto finito contenido en N. Dado otro número m consideramos nuevamente el conjunto de sus divisores. Hacemos la intersección de ambos conjuntos, que es necesariamente no vacía puesto que la unidad divide a todo número. El mayor de los números de dicha intersección es, por definición, el máximo común divisor de ambos números. Esta es la definición clásica de este concepto. 8 Capítulo 1. Aritmética Básica
12 Ahora consideramos los múltiplos positivos de n y los de m. Hacemos la intersección de dichos conjuntos. Dicha intersección es no vacía, puesto que nm está en ambos conjuntos. De todos los elementos de dicha intersección debe existir uno que sea el menor de todos (necesariamente es menor o igual que nm). Dicho número es el mínimo común múltiplo. Para calcular el máximo común divisor de dos enteros.gcd() El mínimo común múltiplo.lcm() sage: (78).gcd(24) 6 sage: (78).lcm(24) 312 sage: # El producto del minimo por el maximo da el producto de los numeros sage: 6 * 312, 78 * 24 (1872, 1872) 1.8. Números complejos Los números complejos son expresiones de la forma a + bi donde a y b son números reales e i es una raíz cuadrada de 1 (o lo que es lo mismo, i 2 = 1). Por defecto reconoce a la letra i como un objeto simbólico con la propiedad i 2 = 1. Sin embargo para el programa dicha letra no es todavía un número complejo. Para decirle al programa que trate a la letra i como número complejo debemos escribir (no es necesario comprender el funcionamiento de esta orden). i = CC(i) sage: type(i) <class sage.functions.constants.i_class > sage: type(3 + 4*i) <class sage.calculus.calculus.symbolicarithmetic > sage: i^2-1 sage: i = CC(i) sage: type(i) <type sage.rings.complex_number.complexnumber > sage: type(3 + 4*i) <type sage.rings.complex_number.complexnumber > sage: i^ Las operaciones aritméticas se realizan nuevamente con los operadores habituales. En las respuestas de la unidad imaginaria se escribe en mayúsculas. Las operaciones con números complejos se realizan en aritmética aproximada, por lo que son susceptibles a errores. Además el número de decimales que da el programa puede hacer difícil la lectura del resultado Números complejos 9
13 sage: i = CC(i) sage: a = 5 + 8*i sage: b = *i sage: a + b *I sage: 3*a + 8.9*b *I sage: a - b *I sage: a * b *I sage: a / b *I sage: a^ *I Dado el número complejo z = a+bi su parte real es a y su parte imaginaria es b. Para obtenerlas utilizamos los métodos.real(),.imag() El módulo o valor absoluto es a 2 + b 2.abs() El conjugado es a bi.conjugate() La norma de un número complejo se obtiene multiplicando dicho número por su complejo conjugado. Es siempre un número real, que resulta coincidir con a 2 + b 2.norm() Si imaginamos el número complejo z = a + bi como el vector (a, b), dicho vector forma con la parte positiva del eje de las x un cierto ángulo. Es el denominado argumento del número complejo ( lo mide en radianes).arg(), argument() sage: i = CC(i) sage: a = 5 + 8*i sage: a.real() sage: a.imag() sage: a.abs() sage: a.norm() Capítulo 1. Aritmética Básica
14 sage: sqrt(89.0) sage: a.conjugate() *I sage: a * a.conjugate() sage: a.arg() Como consecuencia del Teorema Fundamental del Álgebra todo número complejo tiene exactamente n raíces n-ésimas (pues el polinomio x n a debe tener n soluciones). Para conocerlas utilizamos el comando.nth_root(n) donde debemos indicar como argumento el orden de la raíz deseada. Por defecto solamente nos devuelve una de las raíces. Si utilizamos la opción all = True nos devuelve una lista con todas las raíces. Para el caso de la raíz cuadrada se puede utilizar sqrt(). sage: i = CC(i) sage: a = *i sage: b = a.nth_root(5); b *I sage: b^ *I sage: a.nth_root(5, all = True) [ *I, *I, *I, *I, *I] sage: sqrt(a) *I sage: sqrt(a, all = True) [ *I, *I] 1.9. Miscelánea Normalmente los números se escriben en base 10, pero se pueden expresar en otras bases. está especialmente preparado para esta circunstancia. Si escribimos un número entero que comience por 0, entenderá que es un número escrito en el sistema octal. Si el número empieza por 0x entiende que es un número escrito en hexadecimal. Para transformar un número a otra base b (necesariamente menor que 36, que es la suma de las diez cifras y las 26 letras) se emplea el método.str(b) La factorial de un número entero positivo es el producto de todos los números enteros positivos menores o iguales que el dado 1.9. Miscelánea 11
15 .factorial() La sucesión de Fibonacci es 1, 1, 2, 3, 5, 8,.... Los dos primeros términos son la unidad. Los siguientes se obtienen sumando los dos anteriores. Para conocer el término n-ésimo de la sucesión fibonacci() En una sección anterior hemos dado la definición más elemental del concepto de máximo común divisor. Sin embargo muchas veces es más útil utilizar la siguiente. Dados dos enteros p y q, consideremos todos los números naturales que se pueden expresar en la forma np+mq, siendo n y m números enteros arbitrarios. El elemento mínimo de dicho conjunto coincide con el máximo común divisor. Además del máximo común divisor d, muchas veces es necesario conocer una pareja de números enteros n, m que cumplan np + mq = d. Para obtener todo empleamos el comando.xgcd() sage: 010, 011, 012 (8, 9, 10) sage: 0x10, 0x11, 0x12 (16, 17, 18) sage: x23a 2408 sage: 348.str(2) sage: 348.str(23) f3 sage: factorial(4), factorial(5), 5*factorial(4) (24, 120, 120) sage: fibonacci(6), fibonacci(7), fibonacci(8) (8, 13, 21) sage: xgcd(78,24) (6, 9, -29) sage: 9*78 + (-24)* Capítulo 1. Aritmética Básica
16 CAPÍTULO TWO Ecuaciones y sistemas puede resolver muchos tipos de ecuaciones. Algunas las resuelve de un modo exacto y otras de un modo aproximado. Además de esto también resuelve ecuaciones en modo simbólico. En este caso los coeficientes de la ecuación son letras Resolución de ecuaciones elementales en modo exacto En esta sección llamamos ecuaciones elementales a las polinómicas de grados bajos, para las que existe un fórmula (utilizando operaciones racionales y extracción de raíces) para su resolución. Los matemáticos italianos del Renacimiento encontraron las fórmulas de resolución para las ecuaciones de grado menor que 5. A principios de siglo 19 Abel y Ruffini demostraron que no existía ninguna fórmula general para la resolución de las ecuaciones de grado igual o superior al quinto. Finalmente, también en el siglo 19, Galois dió las condiciones necesarias y suficientes para que una ecuación de grado superior al cuarto fuese resoluble (por radicales). En las ecuaciones están separadas por dos signos igual. Si las separamos solamente por un signo igual nos dará un error. Si no escribimos el doble igual el programa supone que la ecuación está igualada a cero. También es capaz de resolver algunas ecuaciones de grado superior al cuarto. El comando para resolver ecuaciones es solve(ecuacion, x) Este comando no tiene en cuenta la multiplicidad de las soluciones. sage: solve(x^2-5*x +6 == 0, x) # Una ecuacion tipica de segundo grado [x == 3, x == 2] sage: solve(x^2-5*x + 6, x) # Ahora sin el signo igual [x == 3, x == 2] sage: solve(x^2-4*x + 4 == 0, x) # Una con solucion doble [x == 2] sage: solve(x^3-3*x + 2 == 0, x) # Una ecuacion de tercer grado facil [x == -2, x == 1] sage: solve((x + 1)/9 +(3*x - 4)/45 == x + (5*x - 54)/12, x) [x == 814/223] sage: solve(x^8-10*x^6 + 37*x^4-60*x^2 + 36, x) [x == -sqrt(2), x == sqrt(2), x == -sqrt(3), x == sqrt(3)] sage: # Esta ecuacion de octavo grado la ha resuelto sage: # Sin embargo una arbitraria quinto grado no la resuelve sage: solve(x^5-4*x^4-13*x^2 + 2*x -4, x) [0 == x^5-4*x^4-13*x^2 + 2*x - 4] 13
17 Hasta ahora en todas las ecuaciones que hemos resuelto la incógnita (o varible) es x. Si intentamos repetir esto con otra letra, el programa nos informará de un error. Naturalmente se pueden resolver ecuaciones con otro nombre de variable, pero para ello, antes de intentar resolverla debemos escribir var( letra ) La letra debe ir necesariamente entre comillas simples. Se pueden inicializar más letras escribiendo varias separadas por comas (o simplemente por espacios). sage: var( a ) a sage: solve(a^2-5*a + 6, a) [a == 3, a == 2] sage: var( b,c,d,e ) # Ya podemos utilizar todas estas letras (b, c, d, e) sage: solve(d^2-5*d + 6, d) [d == 3, d == 2] Es muy común que al resolver ecuaciones aparezcan soluciones complejas. El símbolo que usa el programa para la unidad imaginaria es I. sage: solve(x^2 +4,x) # Solucion compleja [x == -2*I, x == 2*I] sage: solve(3*x^3 + 5*x^2-4*x +5,x) [x == 61*(sqrt(3)*I/2-1/2)/(81*(sqrt(1423)/(18*sqrt(3)) /1458)^(1/3)) + (sqrt(1423)/(18*sqrt(3)) /1458)^(1/3)*(-sqrt(3)*I/2-1/2) - 5/9, x == (sqrt(1423)/(18*sqrt(3)) /1458)^(1/3)*(sqrt(3)*I/2-1/2) + 61*(-sqrt(3)*I/2-1/2)/(81*(sqrt(1423)/(18*sqrt(3)) /1458)^(1/3)) - 5/9, x == (sqrt(1423)/(18*sqrt(3)) /1458)^(1/3) + 61/(81*(sqrt(1423)/(18*sqrt(3)) /1458)^(1/3)) - 5/9] 2.2. Resolución de sistemas Un sistema es simplemente un conjunto de ecuaciones. En se escriben formando lo que técnicamente se conoce como una lista. Debemos escribir entre corchetes cada una de las ecuaciones y separarlas por comas. Además, en el comando solve, después de escribir la lista, debemos escribir los nombres de las variables que queramos resolver. sage: var( x,y ) (x, y) sage: solve([x + y == 2, x - y == 0], x, y) # Un sistema lineal [[x == 1, y == 1]] sage: solve(x^2 + y == 2, y) # Despejamos una letra [y == 2 - x^2] sage: solve([x + y == 2, 2*x + 2*y == 4], x, y) # Un sistema indeterminado [[x == 2 - r1, y == r1]] sage: # denomina r1 al parametro sage: solve([x^2 + y^2 == 2, 2*x + 2*y == 3], x, y) # Un sistema no lineal [[x == (3 - sqrt(7))/4, y == (sqrt(7) + 3)/4], [x == (sqrt(7) + 3)/4, y == (3 - sqrt(7))/4]] 14 Capítulo 2. Ecuaciones y sistemas
18 2.3. Manipulación de ecuaciones Cuando trabajamos con las ecuaciones en secundaria, el profesor nos indica que sigamos una serie de pasos. El primero sueler ser desarrollar totalmente ambos miembros de la ecuación. Después podemos mover términos de un miembro a otro de la ecuación empleando las reglas lo que esta sumando pasa restando,... En realidad lo que hacemos con esa regla es sumar (o restar) la misma cantidad a ambos miembros de la ecuación. Lo mismo sucede con las otras reglas. Cuando aplicamos el método de reducción (o de Gauss) decimos que sumamos dos ecuaciones y lo que hacemos es sumar las parte izquierda y derecha por separado. Aunque no es muy habitual, también podemos multiplicar dos ecuaciones, multiplicando por separado las partes izquierda y derecha. Todo es lo hace de un modo muy visual. También es habitual elevar al cuadrado ambos miembros de una ecuación. Esto no lo hace el programa directamente, pero podemos hacerlo multiplicando la ecuación por si misma. sage: # Aunque no es necesario damos nombre a las ecuaciones sage: f = (x^2 + 2 == x^3 + x) sage: g = (3*x^2-5*x == 8) sage: # Restamos 2 a la ecuacion f sage: f - 2 x^2 == x^3 + x - 2 sage: # Tambien podriamos haber restado x^3 + x sage: f - (x^3 + x) -x^3 + x^2 - x + 2 == 0 sage: # Multiplicamos la ecuacion g por 9 sage: 9 * g 9*(3*x^2-5*x) == 72 sage: g / 88 # Ahora la dividimos por 88 (3*x^2-5*x)/88 == 1/11 sage: f + g # "Sumamos" las dos ecuaciones 4*x^2-5*x + 2 == x^3 + x + 8 sage: f * g # "Multiplicamos" las dos ecuaciones (x^2 + 2)*(3*x^2-5*x) == 8*(x^3 + x) sage: f * f # Elevamos al cuadrado ambos miembros (x^2 + 2)^2 == (x^3 + x)^2 Para desarrollar (expandir) ambos miembros de una ecuación se emplea el método.expand() Si queremos quedarnos con el primer miembro de la ecuacion.left() y para la parte derecha.right() Para sustituir la variable por un valor particular.subs(x = valor) 2.3. Manipulación de ecuaciones 15
19 sage: f = (x-3)^2 + (3*x-5)/89 == (2*x - 5)*(x-2) sage: f (3*x - 5)/89 + (x - 3)^2 == (x - 2)*(2*x - 5) sage: f.expand() x^2-531*x/ /89 == 2*x^2-9*x + 10 sage: f.left() (3*x - 5)/89 + (x - 3)^2 sage: f.right() (x - 2)*(2*x - 5) sage: # Sustituimos x por el valor 7 sage: f.subs(x=7) 1440/89 == Resolución numérica de ecuaciones Cuando empezamos a estudiar las ecuaciones parece que todas tienen solución exacta y que basta seguir un método (más o menos complicado) para conseguir resolver de modo exacto la ecuación. Ello es debido, o bien a que las ecuaciones son muy sencillas, o bien a que están preparadas para que funcionen los métodos. Pero la realidad nos dice que en general una ecuación no es resoluble de modo exacto. Si queremos conseguir soluciones debemos recurrir a métodos númericos que nos porporcionarán las soluciones con el grado de aproximación deseado. Debido a los algoritmos empleados para los métodos númericos, debemos especificar el intervalo donde el algoritmo debe buscar la solución. Normalmente aunque haya varias soluciones en el intervalo dado, el algoritmo nos encontrará solamente una. En el caso de ecuaciones polinómicas hay métodos que nos permiten encontrar todas las soluciones, pero eso lo veremos en una sección posterior. El método para encontrar la solución númerica de una ecuación es.find_root(intervalo) sage: f = (x^2-5*x + 6 == 0) sage: # Encontrar solucion en el intervalo (-20,5) sage: f.find_root(-20,5) 3.0 sage: f.find_root(0,2.5) 2.0 sage: g = (sin(x^2)+3 == exp(x)) # Una ecuacion mas complicada sage: g.find_root(-10,10) sage: g.subs(x=_) == sage: # La variable _ guarda siempre el ultimo valor calculado sage: # El problema de este metodo es fijar un intervalo adecuado sage: h = x^6-5*x^4-3*x^2 + 5*x - 12 # Una de sexto grado sage: h.find_root(-10,20) Capítulo 2. Ecuaciones y sistemas
20 CAPÍTULO THREE Polinomios A nivel elemental, un polinomio es simplemente una expresión algebraica formada con números, letras y operaciones de suma, resta, multiplicación y potenciación. Sin embargo a un nivel más avanzado debemos indicar, de manera explícita, que tipo de números van a ser los coeficientes y la letra con la que vamos a trabajar. Nosotros adoptaremos este último punto de vista para extraer todo el potencial de. En general, de ahora en adelante, los coeficientes serán números racionales o enteros, puesto que el programa trabaja con ellos utilizando aritmética exacta. Para ello, al comienzo del trabajo con debemos escribir lo siguiente (no es necesario entender lo que significa esta instrucción). R.<x> = PolynomialRing(QQ) En este caso empleamos la letra x y QQ es la forma en que denota el cuerpo de los números racionales. Existen otras formas de construir el anillo de polinomios con coeficientes en Q. La siguiente tiene el mismo efecto y es más corta R.<x> = QQ[] 3.1. Operaciones con polinomios La suma, la resta, la multiplicación y la potenciación se realizan con los operadores habituales. El cociente de la división euclídea se consigue con el operador // y el resto con %. El uso de paréntesis es similar al utilizado en matemáticas. Cada polinomio con coeficientes racionales induce una función real de variable real. Todo lo referente a funciones que veremos en los capítulos siguientes se puede aplicar a los polinomios. Si trabajamos con polinomios sobre varios cuerpos el método.base_ring() nos indica sobre que cuerpo (o anillo) está definido el polinomio. La orden.parent() nos informa prácticamente de lo mismo que la anterior, pero es más completa. 17
21 sage: R.<x> = QQ[] sage: # Aunque no es obligatorio es conveniente nombrar los polinomios sage: f = 3*x^4 + 5*x^3 + 3*x + 2 sage: type(f) <class sage.rings.polynomial.polynomial_element_generic. Polynomial_rational_dense > sage: # Si hemos nombrado al polinomio, evaluarlo se hace como en Matematicas sage: f(0), f(1), f(89) (2, 13, ) sage: g = x^2-4*x + 1 sage: f + g 3*x^4 + 5*x^3 + x^2 - x + 3 sage: f - g 3*x^4 + 5*x^3 - x^2 + 7*x + 1 sage: f * g 3*x^6-7*x^5-17*x^4 + 8*x^3-10*x^2-5*x + 2 sage: g^3 x^6-12*x^5 + 51*x^4-88*x^3 + 51*x^2-12*x + 1 sage: # Hallamos el cociente sage: f // g 3*x^2 + 17*x + 65 sage: # Ahora el resto sage: f % g 246*x - 63 sage: f.base_ring() Rational Field sage: f.parent() Univariate Polynomial Ring in x over Rational Field 3.2. Factorización Decimos que un polinomio g divide a f si al realizar la división euclídea de f entre g el resto es nulo. Es claro que todo polinomio f no nulo es divisible por cualquier constante k. Asimismo es divisible por todo polinomio de la forma kf, siendo k una constante no nula. Estos divisores se denominan triviales. Si un polinomio posee algún divisor no trivial decimos que es reducible. En caso contrario, esto es, si sus únicos divisores son los triviales, decimos que el polinomio es irreducible. La cuestión de la irreducibilidad es delicada, pues depende en gran medida del cuerpo base. Por ejemplo, x es irreducible como polinomio con coeficientes racionales, pero entendido como polinomio con coeficientes complejos es reducible, pues es divisible entre x i. El mismo comentario es válido en la cuestión de la factorización de un polinomio en factores irreducibles. La comprobación de que un polinomio es irreducible (sobre el cuerpo de definición).is_irreducible() Para factorizar un polinomio (sobre el cuerpo de definición).factor() Para obtener el máximo común divisor de dos polinomios (que es independiente del cuerpo base) 18 Capítulo 3. Polinomios
22 .gcd() y para el mínimo común múltiplo.lcm() sage: R.<x> = PolynomialRing(QQ) sage: f = (x-1)^2 * (x-6)^2 * (x^2 + 1) sage: g = (x-1)^3 * (x-6) * (3*x - 10) sage: f.factor() (x - 6)^2 * (x - 1)^2 * (x^2 + 1) sage: g.factor() (3) * (x - 6) * (x - 10/3) * (x - 1)^3 sage: f.gcd(g) x^3-8*x^2 + 13*x - 6 sage: _.factor() (x - 6) * (x - 1)^2 sage: f.lcm(g) 3*x^8-55*x^ *x^6-1240*x^ *x^4-2493*x^ *x^2-1308*x sage: _.factor() (3) * (x - 10/3) * (x - 6)^2 * (x - 1)^3 * (x^2 + 1) sage: f.is_irreducible() False sage: (x^2-2).is_irreducible() True sage: # En Q este polinomio es irreducible. Sobre R es claro que no, sage: # pues tiene raices, sqrt(2) y -sqrt(2) sage: R.<x> = RR[] sage: f = x^2-2 sage: f.is_irreducible() False sage: f.factor() ( *x )*( *x ) 3.3. Raíces de polinomios Cuando hablamos de raíces de un polinomio debemos tener en cuenta en que cuerpo se encuentran las raíces. Por ejemplo, el polinomio x 2 2 no tiene raices en Q, pero si que las tiene en R. Por ello existen distintos comandos para hallar las raíces. Si queremos hallar las raíces (con su multiplicidad) que existen en el cuerpo base (en nuestro caso Q).roots() Si queremos las raíces reales (calculadas por métodos aproximados).real_roots() y si queremos las complejas (también por métodos aproximados).complex_roots() 3.3. Raíces de polinomios 19
23 sage: R.<x> = QQ[] sage: f = (x^2 + 1) * (x - 3)^2 * (x^2-2) * (5*x -13) sage: f.roots() [(13/5, 1), (3, 2)] sage: # Tiene la raiz 13/5 simple y la raiz 3 doble. No tiene mas raices en Q sage: f.real_roots() [ , , , , ] sage: # Han aparecido dos soluciones mas, que son las raices cuadradas de 2 sage: # Ademas observamos que la raiz doble 3 ahora son dos soluciones sage: # muy proximas a 3. Esto es debido a que se trabaja en modo aproximado sage: f.complex_roots() [ , , , , , e *I, e *I] sage: # Las soluciones complejas, que son i y -i, se dan de modo aproximado 3.4. Fracciones algebraicas Con dos polinomios podemos formar una fracción, que en general no será un polinomio. Las fracciones de polinomios se suelen denominar fracciones algebraicas o también funciones racionales. Sobre ellas se aplican gran parte de los comandos estudiados para polinomios y también para fracciones (númericas). sage: R.<x> = QQ[x] sage: r = (x^3-4)/(3*x^2-5*x + 1); s = (6*x^2-4*x)/(2*x-5) sage: r + s (20*x^4-47*x^3 + 26*x^2-12*x + 20)/(6*x^3-25*x^2 + 27*x - 5) sage: s^3 (216*x^6-432*x^ *x^4-64*x^3)/(8*x^3-60*x^ *x - 125) sage: r(4), r(-2), r(100) (60/29, -12/23, /29501) sage: r.denominator() 3*x^2-5*x + 1 sage: r.numerator() x^3-4 sage: type(r) <class sage.rings.fraction_field_element.fractionfieldelement > sage: r.base_ring() Rational Field sage: r.parent() Fraction Field of Univariate Polynomial Ring in x over Rational Field 20 Capítulo 3. Polinomios
24 3.5. Miscelánea Muchos de estos comandos pueden parecer inútiles, y ciertamente lo son, si trabajamos con en modo interactivo (esto es, tecleando comandos y esperando la contestación). Sin embargo pueden ser muy útiles cuando se programa en. El grado de un polinomio.degree() Para obtener una lista con todos los coeficientes, ordenados de grado menor a grado mayor.coeffs() Para derivar e integrar polinomios.derivative(),.integral() La gráfica del polinomio se obtiene con.plot() Se pueden pasar varias opciones a este último método para mejorar la visualización de la gráfica (ver el capítulo sobre representación gráfica). sage: R.<x> = QQ[x] sage: f = x^4 + 3*x^3-2*x^2 + 9 sage: f.degree() 4 sage: f.coeffs() [9, 0, -2, 3, 1] sage: f.derivative() 4*x^3 + 9*x^2-4*x sage: f.integral() 1/5*x^5 + 3/4*x^4-2/3*x^3 + 9*x sage: f.plot() sage: # Por defecto lo dibuja en el intervalo (0,1) y en color azul sage: f.plot(-3,2, color = red ) sage: # Ahora se dibuja en el intervalo (-3,2) y en color rojo 3.5. Miscelánea 21
25 Figura 3.1: Gráfica construida con f.plot() Figura 3.2: Gráfica construida con la orden f.plot(-3,2, color = red ) 22 Capítulo 3. Polinomios
26 CAPÍTULO FOUR Gráficas y objetos gráficos es capaz de realizar gráficas de funciones reales de variable real dadas en varias formas: explícita (que es la forma habitual de presentar una función), paramétrica, implícita,... Asimismo puede realizar gráficas de funciones de dos variables, cuyo dibujo es una superficie. Analizaremos únicamente el dibujo de las funciones dadas en forma explícita. Además puede realizar el dibujo de ciertos objetos geométricos, como puntos, rectas, circunferencias,... El formato gráfico por defecto de las imágenes generadas por es png, que es un formato libre, de alta calidad y de pequeño tamaño (en bytes) Gráficas de funciones La instrucción básica para representar gráficas de funciones es la orden plot(f, xmin, xmax, opciones) siendo obligatorio únicamente el primer argumento. Si simplemente escribimos la función entre paréntesis, el programa realizará el dibujo en el intervalo [ 1, 1]. El eje y lo adaptará a la función. Normalmente la escala no será la misma en el eje x y en el eje y. sage: f(x) = x^2-2*x +3 sage: f.plot() Después de la función, podemos añadir, separados por comas, los extremos del intervalo donde queremos dibujar la gráfica. sage: f(x) = x^2-2*x +3 sage: f.plot(-2,5) # Dibujo en el intervalo [-2,5] Podemos cambiar el color de gráfica añadiendo la opción color. El nombre del color debe figurar entre comillas simples. Existen otras opciones como thickness que afecta al grosor de la gráfica. Para ver todas las opciones del comando (y sus valores por defecto) tecleamos plot.options (sin paréntesis). sage: f = x^2-2*x + 3 sage: plot(f, -3, 4, color = red, thickness = 2) 23
27 Figura 4.1: plot(f, -2, 5) Figura 4.2: plot(f, -3, 4, color = red, thickness = 2) 4.2. Funciones a trozos y varias funciones Podemos dibujar varias gráficas en los mismos ejes. Para ello no debemos más que sumar las distintas ordenes plot. Con esto podremos simular una función definida a trozos, pero en realidad estamos haciendo trampas. plot(sin(x),-5,-1) + plot(x^2,-1,2) + plot(x,2,4) Sin embargo la mejor opción es construir una verdadera función definida a trozos y después representarla. A efectos gráficos no tiene mucha importancia, pero en otros temas si la tendrá. La orden para definir una función con varios trozos es Piecewise() sage: f = Piecewise([[(-5,-1),sin(x)],[(-1,2),x^2],[(2,4),x]]); f Piecewise defined function with 3 parts, [[(-5, -1), sin(x)], [(-1, 2), x^2], [(2, 4), x]] sage: f.plot() 24 Capítulo 4. Gráficas y objetos gráficos
28 Figura 4.3: La gráfica de una función compuesta por 3 trozos 4.3. Diversos objetos gráficos Los diversos objetos gráficos de esta sección se pueden dibujar directamente con los comandos dados. Sin embargo los ejes se adaptan al dibujo, lo que conlleva que la apariencia de los dibujos sea muy distinta a la real (una circunferencia parece una elipse, la pendiente de una recta no es la que corresponde,...). Por ello lo mejor es guardar cada uno de los objetos gráficos en una variable y después utilizar el comando show() con la opción aspect_ratio = 1 que hace que los ejes tengan la misma escala. Para dibujar un punto point2d(p) donde p es un punto. Para dar las coordenadas de un punto, escribimos ambas entre paréntesis. Además de esto se le pueden añadir varias opciones. Para conocerlas todas (y sus valores por defecto) escribimos point2d.options (sin paréntesis) Para dibujar una recta line2d([p,q]) donde p es un punto extremo de la recta y q el otro. Ambos puntos deben ir colocados dentro de corchetes. Para ver las opciones se hace lo mismo que en el caso anterior. Para dibujar una circunferencia circle(centro, radio) donde centro es un punto y radio un número positivo. sage: point2d.options { alpha : 1, faceted : False, pointsize : 10, rgbcolor : (0, 0, 1)} sage: line2d.options { alpha : 1, rgbcolor : (0, 0, 1), thickness : 1} sage: circle.options { alpha : 1, fill : False, rgbcolor : (0, 0, 1), thickness : 1} 4.3. Diversos objetos gráficos 25
29 sage: a = point2d((2,3)) sage: b = line2d([(-1,-2),(4,1)]) # Una linea (o mejor un segmento) sage: c = circle((2,1), 1.5) sage: type(a) <class sage.plot.plot.graphics > sage: # El comando show muestra los objetos graficos. La suma de objetos sage: # graficos significa que los muestra todos sage: show(a + b + c, aspect_ratio = 1) # Ejes con la misma escala Figura 4.4: Un montón de objetos en un solo gráfico 26 Capítulo 4. Gráficas y objetos gráficos
30 CAPÍTULO FIVE Análisis Puede definirse el Análisis, de una manera un tanto tosca, como el estudio de las funciones. Las funciones más elementales son sin lugar a duda las polinómicas, construidas con una variable y las operaciones de suma, resta y multiplicación. A un nivel un poco más elevado están las funciones algebraicas, formadas por cocientes de polinomios. En estas encontramos ya los primeros problemas con el dominio de definición. Sin embargo pronto se descubre que con estas funciones no es suficiente. A pesar de que el abanico de posibilidades es ilimitado, la siguiente tabla muestra algunas de las funciones predefinidas en. Su uso es similar al que se realiza en Matemáticas. sin(x) Seno de x medido en radianes cos(x) Coseno de x medido en radianes tan(x) Tangente de x medido en radianes asin(x) ArcoSeno de x acos(x) ArcoCoseno de x atan(x) ArcoTangente de x abs(x) Valor absoluto de x sinh(x) Seno hiperbólico de x cosh(x) Coseno hiperbólico de x tanh(x) Tangente hiperbólica de x exp(x) Exponencial de base el número e log(x, base) Logaritmo. Por defecto la base es e ln(x) Logaritmo natural (en base e) 5.1. Límites El primer concepto necesario para desarrollar el Análisis es el de límite. Para calcular un limite necesitamos al menos dos datos: una función y un punto en el que calcular el límite. Para la existencia de límite los dos límites laterales deben existir y coincidir. Si queremos especificar un límite lateral necesitamos informar al programa de otro dato, lo que haremos con la opción dir, que puede adoptar los valores (siempre entre comillas simples) plus (por la derecha) o minus (por la izquierda). También es muy habitual calcular límites en el infinito. La notación de para el infinito es oo. El comando para calcular límites es limit(f, x = a) Este comando tiene una opción, llamada Taylor, que nos permite resolver más límites. Un comentario sobre el polinomio de Taylor se da en la última sección de este capítulo. 27
31 sage: f = x^2 + 3 sage: limit(f, x = 7) # Un limite sencillo 52 sage: f.subs(x = 7) # Se podria haber hecho por sustitucion 52 sage: limit(sin(x)/x, x = 0) # Este da lugar a una indeterminacion 1 sage: limit(ln(x), x = 0, dir = plus ) # Por la izquierda no existe -Infinity sage: limit(exp(x), x = oo), limit(exp(x), x = -oo) (+Infinity, 0) sage: var( t ) # Se puede utilizar cualquier variable t sage: limit(sin(t)/t, t = 0) Derivadas Las derivadas de funciones se calculan con los comandos (ambos comando son alias, o sea, son exactamente iguales) diff(), derivative() Si la función a derivar es de una sola variable se pueden usar con un único argumento.el segundo argumento, que por defecto es 1, indica el orden de derivación (derivada segunda, tercera, etc). sage: f(x) = x^4 + 3*x^3 + 2*x + sin(x); f x --> sin(x) + x^4 + 3*x^3 + 2*x sage: f.diff() x --> cos(x) + 4*x^3 + 9*x^2 + 2 sage: f.diff(3) # Derivada tercera x --> -cos(x) + 24*x + 18 sage: f.derivative() # El otro comando x --> cos(x) + 4*x^3 + 9*x^2 + 2 Si la función es de varias variables, tenemos la derivada parcial. Para ello es necesario indicar, como segundo argumento, la variable sobre la que se deriva. Por lo demás el funcionamiento es similar al caso de una variable. sage: var( x,y ) (x, y) sage: f(x,y) = x^4*y^5 sage: f.diff(x) # Derivada parcial respecto a x (x, y) --> 4*x^3*y^5 sage: f.diff(x,3) # Derivada parcial tercera respecto a x (x, y) --> 24*x*y^5 sage: f.diff(x,y) # Derivada parcial respecto a x y a y (x, y) --> 20*x^3*y^4 sage: f.diff(x,2,y,3) # Segunda respecto a x y tercera respecto a y (x, y) --> 720*x^2*y^2 28 Capítulo 5. Análisis
32 5.3. Integrales Para realizar integrales empleamos los comandos (alias) integral(), integrate() Dicha función tiene cuatro argumentos, siendo los tres ultimos opcionales. El primero es la funcion a integrar. Si la funcion tiene una sola variable con esto llega para realizar integrales indefinidas. El segundo argumento es la letra sobre la que se realiza la integración. Si la función tiene más de una variable es imprescindible informar de ello al programa. La integración en cualquiera de los dos casos es indefinida. Los dos últimos argumentos son los límites inferior y superior, por lo que si los añadimos estaremos realizando una integración definida. sage: f(x) = x^2 sage: f.integral() x --> x^3/3 sage: f.integral(x,0,10) 1000/3 sage: var( a ) a sage: f(a,x) = a * sin(x) sage: f.integral(x) (a, x) --> -a*cos(x) sage: f.integral(a) (a, x) --> a^2*sin(x)/2 # Esta ya es una integral definida # Una funcion con dos variables 5.4. Polinomio de Taylor Consideremos una función f(x) y un punto x = a en el dominio de f. Sea n un número natural. Consideramos ahora el conjunto de todos los polinomios reales de grado menor que n. Entre todos ellos, existe uno que, en cierto sentido, es el más próximo a f(x) en un entorno del punto x = a. Para calcular dicho polinomio utilizamos la orden taylor(f, x, a, n) sage: f = exp(x) * sin(x) sage: t3 = taylor(f, x, 1, 3); t3 sin(1)*e + (sin(1) + cos(1))*e*(x - 1) + cos(1)*e*(x - 1)^2 - (sin(1) - cos(1))*e*(x - 1)^3/3 sage: expand(t3) -1*e*sin(1)*x^3/3 + e*cos(1)*x^3/3 + e*sin(1)*x^2 + e*sin(1)/3 - e*cos(1)/3 sage: # Observese que es un polinomio de grado 3. Los senos, cosenos sage: # y exponenciales que aparecen son numeros sage: t7 = taylor(f, x, 1, 7) sage: plot(f, -2, 4) + plot(t3, -2, 4, color = red ) sage: plot(f, -2, 4) + plot(t7, -2, 4, color = green ) 5.3. Integrales 29
33 Figura 5.1: El polinomio de grado 3 se pega a la función cerca del 1 Figura 5.2: El polinomio de grado 7 se aproxima todavía más 30 Capítulo 5. Análisis
34 CAPÍTULO SIX Álgebra Lineal Elemental 6.1. Vectores y operaciones Los objetos más básicos del Álgebra Lineal son los vectores. A nivel elemental un vector es simplemente una colección ordenada de números. Si tenemos dos números decimos que el vector es de dos dimensiones, si tenemos una terna hablamos de vectores tridimensionales,... Para construir un vector se utiliza la orden vector(r, lista) Las listas en siempre van entre corchetes. El tamaño de la lista coincide con la dimensión del vector. Matemáticamente todo vector es un elemento de cierto A n, donde A es anillo. Para indicarle a el anillo o cuerpo que contiene a los coeficientes, lo introducimos como opción en el comando que crea los vectores. Si no introducimos ninguno, asocia a cada vector el mínimo anillo que contiene a los coeficientes que forman parte del vector. Para saber cual es el conjunto que considera que contiene a los coeficientes.base_ring() sage: u = vector([2, 5, 6]) sage: type(u) <type sage.modules.vector_integer_dense.vector_integer_dense > sage: u.base_ring() Integer Ring sage: v = vector([4, 3/5, 8/3]) sage: type(v) <type sage.modules.vector_rational_dense.vector_rational_dense > sage: v.base_ring() Rational Field sage: w = vector([3, 6, 1.56]) sage: type(w) <type sage.modules.free_module_element.freemoduleelement_generic_dense > sage: w.base_ring() Real Field with 53 bits of precision sage: u + v (6, 28/5, 26/3) sage: 4*u + 6*v *w ( , , ) sage: # Podemos cambiar el anillo asociado a un vector sage: a = vector(qq, [2, 5, 6]); a.base_ring() Rational Field 31
35 Para realizar el producto escalar de dos vectores se pueden emplear indistintamente los siguientes métodos (aunque también se puede utilizar el asterisco).dot_product(),.inner_product() La norma de un vector (que es la raíz cuadrada del producto escalar del vector consigo mismo).norm() sage: u = vector([2, 5, 6]); v = vector([4, 3/5, 8/3]) sage: u.dot_product(v) 27 sage: v.inner_product(u) 27 sage: u * v # La multiplicacion de vectores es la escalar 27 sage: u.norm(), u * u (sqrt(65), 65) Para el producto vectorial (definido solamente para vectores tridimensionales).cross_product() Aunque no es muy habitual, también a veces es necesario multiplicar dos vectores coordenada a coordenada, siendo el resultado un vector de la misma dimensión.pairwise_product() Para transponer un vector y colocarlo vertical.transpose() El resultado de transponer un vector, no es un vector sino una matriz. puede dibujar vectores de dos y tres dimensiones. El método para hacerlo es.plot() sage: u = vector([2, 5, 6]) sage: v = vector([4, 3/5, 8/3]) sage: # El producto vectorial no conmuta, sino que anticonmuta sage: u.cross_product(v); v.cross_product(u) (146/15, 56/3, -94/5) (-146/15, -56/3, 94/5) sage: u.pairwise_product(v) (8, 3, 16) sage: u.transpose() [2] [5] [6] sage: type(_) <type sage.matrix.matrix_integer_dense.matrix_integer_dense > sage: u = vector([2,4]) sage: u.plot() 32 Capítulo 6. Álgebra Lineal Elemental
36 6.2. Matrices y operaciones Figura 6.1: Vector bidimensional construido con u.plot() A nivel operativo, puede decirse que la parte fundamental del Álgebra Lineal es la teoría de matrices. A nivel matemático un vector es simplemente una matriz de una sola fila. Sin embargo para son distintos y se definen con distintos comandos. Para construir una matriz utilizamos el comando matrix(r, [f1, f2,..., fn]) Una matriz es una lista de listas. Por lo tanto dentro del paréntesis debe ir situado siempre un corchete. Dentro de dicho corchete deben figurar las filas de la matriz en cuestión. Dichas filas son ellas mismas listas, por lo que también debemos colocarlas entre corchetes. De la misma forma que en los vectores, podemos cambiar el anillo asociado, añadiéndolo como opción. Las operaciones con matrices y vectores se realizan con los operadores habituales. El producto matricial se realiza con el asterisco y las potencias con el circunflejo. sage: A = matrix([[1,4,6],[3,6,8],[-3,8,1]]); A [ 1 4 6] [ 3 6 8] [-3 8 1] sage: B = matrix([[-3,7,9],[8,-3,-7],[-2,0,9]]); B [-3 7 9] [ ] [-2 0 9] sage: type(a) <type sage.matrix.matrix_integer_dense.matrix_integer_dense > sage: A.base_ring() Integer Ring sage: A + B [ ] [11 3 1] [ ] 6.2. Matrices y operaciones 33
Prácticas de ordenador con wxmaxima Jerónimo Alaminos Prats Camilo Aparicio del Prado José Extremera Lizana Pilar Muñoz Rivas Armando R. Villena Muñoz Reconocimiento-No comercial 3. España Usted es libre
CAPÍTULO 2 CÁLCULO DIFERENCIAL
CAPÍTULO 2 CÁLCULO DIFERENCIAL 1. INTERROGANTES CENTRALES DEL CAPÍTULO Límite de una función Límites laterales Reglas para el cálculo de límites Regla del bocadillo Continuidad de una función Propiedades
Funciones sin primitiva elemental Carlos Ivorra (http://www.uv.es/ivorra) 1 Introducción La función de densidad de la distribución normal (con media 0 y desviación típica 1) viene dada por la función f(t)
Cálculo de Raíces Reales de Polinomios
Cálculo de Raíces Reales de Polinomios Carlos D Andrea Departament d Àlgebra i Geometria Universitat de Barcelona carlos@dandrea.name Agosto de 2006 1. Introducción El propósito de estas notas es el de

References: Resolución 
 Resolución 
 Resolución 
 Resolución 
 resolución 
 resolución 
 Resolución 
 Resolución