Ejercicios del Tema 5 En este documento encontrará cómo se puede emplear el programa Maxima para resolver o apoyar algunos pasos de la resolución de varios de los ejercicios del tema. Debe tener en cuenta que: • En esencia se utilizan los comandos que aparecen en la bibliografı́a básica de la asignatura. Pero aparecen algunos más que pueden resultarle interesantes para resolver ejercicios y apoyar sus cálculos actuales y futuros. • En muchas ocasiones existe más de una forma de llegar al mismo resultado, es decir, se pueden utilizar distintos comandos o los comandos en orden diferente. • Le animamos a experimentar con el programa. Tiene los comandos escritos y solamente debe ejecutarlos para comprobar la salida. Pero ¿qué ocurre si cambia los datos? ¿Obtiene lo que esperaba? • La forma ideal de trabajar con este documento es. – Primero leer el enunciado del ejercicio y tratar de resolverlo sin ayuda de Maxima. – Si encontramos dificultades en las que creemos que Maxima nos puede ayudar o queremos verificar el resultado, intentar utilizar el programa para realizar esas tareas. – Finalmente recurrir a la información de este documento para comprobar la solución y ver qué sugerencias de resolución o apoyo aparecen. 1 Ejercicio 193 El producto escalar entre dos vectores se realiza en Maxima con un ”.” Es importante dejar espacios antes y después del punto para distingirlo del punto decimal. En las siguientes instrucciones de Maxima, primero definimos los vectores y después calculamos su producto escalar. --> v1:[0,1,2]; v2:[-3,-4,2]; v1 . v2; (%o1) [0, 1, 2] (%o2) [−3, −4, 2] (%o3) 0 Como el resultado es cero los vectores resultan ser ortogonales. 1 2 Ejercicios 194 y 196 Definimos los vectores u y v. --> u:[-1,1]; v:[2,3]; (%o4) [−1, 1] (%o5) [2, 3] Calculamos sus normas (recordemos que la norma de un vector es la raı́z cuadrada del producto escalar del vector por sı́ mismo), su suma y la norma de su suma. --> normu:sqrt(u . u); normv:sqrt(v . v); u+v; sqrt(% . %); √ (%o6) 2 √ (%o7) 13 (%o8) [1, 4] √ (%o9) 17 Calculamos el vector 3u y su norma. --> 3*u; sqrt(% . %); (%o10) [−3, 3] √ (%o11) 3 2 Calculamos el coseno del ángulo que forman u y v. --> (u . v)/(normu*normv); 1 (%o12) √ √ 2 13 El ángulo formado por los vectores se consigue aplicando la función arco coseno al valor anterior. --> acos(%); 1 (%o13) acos √ √ 2 13 Si deseamos conocer el valor numérico aproximado utilizamos el comando ”float”. 2 --> float(%); (%o14) 1.373400766945016 Para expresar u en coordenadas polares utilizamos las ecuaciones que relacionan estas coordenadas con las coordenadas cartesianas. Las componentes del vector u se denotan por u[1] y u[2] en Maxima. --> rho=sqrt(u . u); solve(tan(theta)=u[2]/u[1],theta); √ (%o15) ρ = 2solve : usingarc−trigf unctionstogetasolution.Somesolutionswillbelost. π (%o16) [θ = − ] 4 Maxima nos avisa de que ha utilizado la función arco tangente para resolver la ecuación y que es posible que se hayan perdido soluciones. En este caso efectivamente se ha perdido la solución que nos interesa. El vector u está en el segundo cuadrante y el valor buscado es el que da Maxima más 2pi. 3 Ejercicio 197 Utilizamos las ecuaciones que relacionan coordenadas cilı́ndicas y cartesianas. --> kill(all); u:[1,1,1]; rho=sqrt([u[1],u[2]] . [u[1],u[2]]); solve(tan(theta)=u[2]/u[1],theta); z=u[3]; (%o0) done (%o1) [1, 1, 1] √ (%o2) ρ = 2solve : usingarc−trigf unctionstogetasolution.Somesolutionswillbelost. π (%o3) [θ = ] 4 (%o4) z = 1 En este caso, puesto que el vector (1,1) está en el primer cuadrante, la solución que nos propone Maxima para theta es la que buscábamos. 4 Ejercicio 198 Nuestro primer objetivo es calcular las coordenadas cilı́ndricas del vector (1,2,1). Limpiamos la memoria del programa e introducimos el vector. 3 --> kill(all); u:[1,2,-1]; (%o0) done (%o1) [1, 2, −1] Ahora reutilizamos el código del ejercicio anterior para calcular las coordenadas cilı́ndricas. --> rho=sqrt([u[1],u[2]] . [u[1],u[2]]); solve(tan(theta)=u[2]/u[1],theta); z=u[3]; √ (%o2) ρ = 5solve : usingarc−trigf unctionstogetasolution.Somesolutionswillbelost. (%o3) [θ = atan (2)] (%o4) z = −1 Las coordenadas buscadas son las que aparecen porque el vector (1,2) pertenece al primer cuadrante. Podemos aproximar numéricamente el valor de theta. --> theta=atan(2.0); (%o5) θ = 1.10714871779409 Pasemos ahora a las coordenadas esféricas. Resolviendo con el comando ”solve” las ecuaciones que relacionan las coordenadas esféricas con las cartesianas. --> rho=sqrt(u . u); solve(tan(theta)=u[2]/u[1],theta); solve(sin(phi)=u[3]/sqrt(u . u)); √ (%o6) ρ = 6solve : usingarc−trigf unctionstogetasolution.Somesolutionswillbelost. (%o7) [θ = atan (2)]solve : usingarc−trigf unctionstogetasolution.Somesolutionswillbelost. 1 (%o8) [φ = −asin √ ] 6 5 Ejercicios 204 y 205 Maxima tiene un comando para representar las curvas de nivel de una función. Se llama ”contour plot” y lo utilizamos a continuación. --> wxcontour_plot(x^2-y^2/3+8, [x, -4, 4], [y, -4, 4])$ 4 (%t9) --> wxcontour_plot(x^2-y, [x, -4, 4], [y, -5, 5])$ (%t10) 6 Ejercicio 206 Maxima no calcula lı́mites de funciones de varias variables. Pero podemos calcular con Maxima los lı́mites reiterados porque se definen a partir de lı́mites de una variable. --> kill(all); f(x,y):=(x^2+y^3)/(x^2+y^2); (%o0) done (%o1) f (x, y) := x2 + y 3 x2 + y 2 Definimos los lı́mites reiterados anidando dos sentencias ”limit”, es decir poniendo una dentro de la otra, del modo siguiente. 5 --> limit(limit(f(x,y),x,0),y,0); limit(limit(f(x,y),y,0),x,0); (%o2) 0 (%o3) 1 Como los valores no coinciden el lı́mite no existe. Como complemento mostramos la gráfica de la función y sus curvas de nivel. --> wxplot3d(f(x,y),[x,-2,2],[y,-2,2]); wxcontour_plot(f(x,y),[x,-2,2],[y,-2,2]); (%t4) (%o4) (%t5) (%o5) Fı́ese en cómo, debido a la no existencia de lı́mite, algunas curvas de nivel pueden tender al mismo punto en (0,0). 6 7 Ejercicio 209 --> kill(all); f(x,y):=(x^2+y^2)*sin(1/(x^2+y^2)); (%o0) done 2 (%o1) f (x, y) := x + y 2 sin 1 2 x + y2 En este ejercicio se realiza un cambio a coordenadas polares y no se estudian los lı́mites laterales. Calcularemos esos lı́mites aquı́. --> limit(limit(f(x,y),x,0),y,0); limit(limit(f(x,y),y,0),x,0); (%o2) 0 (%o3) 0 Observamos que el valor coincide y no obtenemos información sobre la continuidad de f en (0,0). Para calcular el lı́mite en coordenadas polares en Maxima hacemos: --> limit(f(rho*cos(theta),rho*sin(theta)),rho,0); (%o4) 0 Como complemento representamos la función y sus curvas de nivel. Hemos utilizado la opción grid para aumentar la definición de las gráficas. --> wxplot3d(f(x,y),[x,-1,1],[y,-1,1],[grid, 90, 90]); wxcontour_plot(f(x,y),[x,-1,1],[y,-1,1],[grid, 90, 90]); (%t5) (%o5) 7 (%t6) (%o6) 8 Ejercicio 210 Utilizaremos este ejercicio para mostrar cómo podemos utilizar Maxima para calcular lı́mites al tender a un punto siguiendo una determinada curva. Queremos estudiar la continuidad en el origen de la función que para x distinto de 0 toma el valor y^2/x y en otro caso es 0. En primer lugar nos acercamos utilizando alguna recta del haz y=m*x. --> limit((m*x)^2/x,x,0); (%o7) 0 Observamos que no depende de m. A continuación tendemos a (0,0) utilizando alguna parábola de ecuación y=k*x^2. --> limit((k*x)^2/x,x,0); (%o8) 0 Tampoco depende de k. Y no podemos afirmar nada sobre la continuidad. Probamos con parábolas de ecuación x=l*y^2. --> limit(y^2/(l*y^2),y,0); 1 l Resulta que el lı́mite depende de la parábola que utilizamos para aproximarnos al origen y la función no es continua. (%o9) 8 9 Ejercicio 213 En primer lugar definimos la función poniendo un apóstrofe delante del comando ”integrate” para indicar a Maxima que no deseamos que calcule la integral. --> kill(all); f(x,y):=x*’integrate(s*exp(s),s,0,y); (%o0) done Z (%o1) f (x, y) := x y s exp (s) ds 0 Calculamos el gradiente. Recuerde que es el vector formado por las derivadas parciales. --> gradf=[diff(f(x,y),x),diff(f(x,y),y)]; Z y (%o2) gradf = [ s es ds, x y ey ] 0 Veamos que si retiramos el apóstrofe llegamos al mismo resultado, pero con la integral calculada. --> f(x,y):=x*integrate(s*exp(s),s,0,y); gradf=[diff(f(x,y),x),diff(f(x,y),y)]; Z y (%o3) f (x, y) := x s exp (s) dsIsypositive, negative, orzero?p; 0 (%o4) gradf = [(y − 1) ey + 1, x ((y − 1) ey + ey )] Al ejecutar el comando Maxima nos pregunta el signo de y. Para indicárselo escribimos la inicial p y después pulsamos mayúsculas + enter. 10 Ejercicio 214 y 216 En primer lugar definimos la función y calculamos las derivadas parciales. --> kill(all); f(x,y):=y*tan(exp(x))+(cos(x+y))^2; g(x,y):=log(x*y); (%o0) done 2 (%o1) f (x, y) := y tan (exp (x)) + cos (x + y) (%o2) g (x, y) := log (x y) 9 Ahora calculamos la expresión del gradiente en un punto arbitrario. --> gradf:[diff(f(x,y),x),diff(f(x,y),y)]; gradg:[diff(g(x,y),x),diff(g(x,y),y)]; 2 (%o3) [ex sec (ex ) y−2 cos (y + x) sin (y + x) , tan (ex )−2 cos (y + x) sin (y + x)] 1 1 (%o4) [ , ] x y Por último, evaluamos esa expresión en el punto (0,0). --> at(gradf,[x=0,y=0]); at(gradg,[x=2,y=3]); (%o5) [0, tan (1)] 1 1 (%o6) [ , ] 2 3 Otra opción para calcular el gradiente es utilizar el paquete linearalgebra que contiene el comando jacobian. --> load(linearalgebra); jacobian([f(x,y)],[x,y]); at(%,[x=0,y=0]); jacobian([g(x,y)],[x,y]); at(%,[x=2,y=3]); (%o7) C : /P ROGRA 2/M AXIM A 1.0/share/maxima/5.27.0/share/linearalgebra/linearalgebra.mac (%o8) ex sec (ex )2 y − 2 cos (y + x) sin (y + x) tan (ex ) − 2 cos (y + x) sin (y + x) (%o9) 0 tan (1) (%o10) x1 y1 (%o11) 12 13 11 Ejercicio 217 Comenzamos limpiando la memoria y definiendo la función. --> kill(all); f(x,y,z):=x^2+y^3+z^2-2*z; (%o0) done (%o1) f (x, y, z) := x2 + y 3 + z 2 + (−2) z 10 Calculamos el gradiente. --> gradf:[diff(f(x,y,z),x),diff(f(x,y,z),y),diff(f(x,y,z),z)]; (%o2) [2 x, 3 y 2 , 2 z − 2] Resolvemos el sistema que resulta de igualar a cero cada una de las componentes del gradiente. --> solve([gradf[1]=0,gradf[2]=0,gradf[3]=0]); (%o3) [[z = 1, y = 0, x = 0]] Por lo tanto el punto en el que se anula el gradiente es (0,0,1). 12 Ejercicio 218 y 219 Definimos la función utilizando el comando ”if”. --> kill(all); f(x,y):=if ([x,y]=[0,0]) then (0) else (x*y)^2/(x^2+y^2); (%o0) done 2 (%o1) f (x, y) := if[x, y] = [0, 0]then0else (x y) x2 + y 2 A continuación calculamos las derivadas parciales. --> dfdx:diff(f(x,y),x); dfdy:diff(f(x,y),y); (%o2) 2 x y2 2 x3 y 2 − 2 2 2 y +x (y 2 + x2 ) (%o3) 2 x2 y 2 x2 y 3 − 2 2 2 y +x (y 2 + x2 ) Para comprobar que las expresiones dadas por Maxima son las mismas que aparecen en el libro podemos utilizar el comando factor. --> (%o4) (%o5) factor(dfdx); factor(dfdy); 2 x y4 2 (y 2 + x2 ) 2 x4 y 2 (y 2 + x2 ) 11 Las expresiones que obtenemos para las derivadas parciales no están definidas en (0,0). Utilizamos la definición para calcularlas en ese punto. --> limit((f(0+h,0)-f(0,0))/h,h,0); limit((f(0,0+h)-f(0,0))/h,h,0); (%o6) 0 (%o7) 0 En el ejercicio 219 nos piden estudiar la continuidad de las derivadas parciales. Para hacerlo realizamos primero un cambio a polares y después calculamos el lı́mite haciendo tender rho a 0. --> at(dfdx,[x=rho*cos(theta),y=rho*sin(theta)]); limit(%,rho,0); 3 2 (%o8) 2 ρ3 cos (θ) sin (θ) 2 2 ρ2 sin (θ) + ρ2 cos (θ) − 2 ρ5 cos (θ) sin (θ) 2 2 2 ρ2 sin (θ) + ρ2 cos (θ) 2 (%o9) 0 Los cálculos anteriores son para la derivada parcial con respecto a x. Para el caso de la derivada parcial con respecto a la variable y hacemos. --> at(dfdy,[x=rho*cos(theta),y=rho*sin(theta)]); limit(%,rho,0); 2 2 (%o10) 2 ρ3 cos (θ) sin (θ) 2 2 ρ2 sin (θ) + ρ2 cos (θ) − 2 ρ5 cos (θ) sin (θ) 2 3 2 ρ2 sin (θ) + ρ2 cos (θ) 2 (%o11) 0 13 Ejercicio 220 Limpiamos la memoria y definimos la función que queremos verificar que es solución de la ecuación de ondas. --> kill(all); u(x,t):=sin(x-t); (%o0) done (%o1) u (x, t) := sin (x − t) Necesitamos calcular las derivadas parciales segundas con respecto a x y con respecto a t; y después comprobar que son iguales. Maxima calcula estas derivadas de orden superior directamente con el comando ”diff”. 12 --> diff(u(x,t),x,2); diff(u(x,t),t,2); (%o2) − sin (x − t) (%o3) − sin (x − t) 14 Ejercicio 221 Maxima dispone de un comando especı́fico para calcular la matriz hessiana de una función: ”hessian”. --> kill(all); f(x,y,z):=cos(x)+y^2/2; (%o0) done y2 2 El comando hessian es similar a ”diff” o ”jacobian”. Primero aparece la función y después las variables con respecto a las que se deriva. (%o1) f (x, y, z) := cos (x) + --> (%o2) hessian(f(x,y,z),[x,y,z]); −cos (x) 0 0 0 1 0 0 0 0 Para evaluar la matriz ”hessiana” en un punto utilizamos el comando ”at” del modo siguiente. --> (%o3) 15 at(%,[x=0,y=1,z=0]); −1 0 0 0 1 0 0 0 0 Ejercicio 223 Realizaremos con Maxima los cálculos de este ejercicio. --> kill(all); load(linearalgebra); (%o0) done 13 (%o1) C : /P ROGRA 2/M AXIM A 1.0/share/maxima/5.27.0/share/linearalgebra/linearalgebra.mac --> f(x,y):=x^2*y; jacobian([f(x,y)],[x,y]); at(%,[x=1,y=0]); hessian(f(x,y),[x,y]); at(%,[x=1,y=0]); (%o2) f (x, y) := x2 y (%o3) 2 x y x2 (%o4) 0 1 2y 2x (%o5) 2x 0 0 2 (%o6) 2 0 16 Ejercicio 224 Comenzamos limpiado la memoria y definiendo la función. --> kill(all); f(x,y):=if ([x,y]=[0,0]) then 0 else ((x^3*y-x*y^3)/(x^2+y^2)); (%o0) done (%o1) f (x, y) := if[x, y] = [0, 0]then0else x3 y − x y 3 x2 + y 2 Calculamos las derivadas parciales y asignamos a las expresiones obtenidas el nombre dfdx y dfdy porque las volveremos a utilizar en el cálculo de las derivadas parciales segundas en (0,0). --> dfdx:diff(f(x,y),x); dfdy:diff(f(x,y),y); 2 x x3 y − x y 3 3 x2 y − y 3 (%o2) − 2 y 2 + x2 (y 2 + x2 ) 2 y x3 y − x y 3 x3 − 3 x y 2 (%o3) − 2 2 2 y +x (y 2 + x2 ) Las expresiones obtenidas no son válidas en (0,0). Utilizando la definición calculamos las derivadas parciales en (0,0). 14 --> dfdx00:limit((f(0+h,0)-f(0,0))/h,h,0); dfdy00:limit((f(0,0+h)-f(0,0))/h,h,0); (%o4) 0 (%o5) 0 Con los datos obtenidos calculamos las derivadas segundas en (0,0) de la forma siguiente. --> dfdxx00:limit((at(dfdx,[x=0+h,y=0])-dfdx00)/h,h,0); dfdxy00:limit((at(dfdx,[x=0,y=0+h])-dfdx00)/h,h,0); dfdyx00:limit((at(dfdy,[x=0+h,y=0])-dfdy00)/h,h,0); dfdyy00:limit((at(dfdy,[x=0,y=0+h])-dfdy00)/h,h,0); (%o6) 0 (%o7) −1 (%o8) 1 (%o9) 0 17 Ejercicio 225 Vamos a comprobar que la derivada parcial segunda con respecto a x e y no es continua en (0,0). Lo haremos comprobando que los lı́mites reiterados no coinciden. --> kill(all); f(x,y):=(x^3*y-x*y^3)/(x^2+y^2); g(x,y):=diff(f(x,y),x,1,y,1); limit(g(x,y), x, 0); limit(g(x,y), y, 0); (%o0) done (%o1) f (x, y) := x3 y − x y 3 x2 + y 2 (%o2) g (x, y) := diff (f (x, y) , x, 1, y, 1) (%o3) −1 (%o4) 1 15 18 Ejercicio 226 Para calcular la derivada direccional en la dirección u debemos en primer lugar calcular el vector unitario en la dirección u, es decir, u/norma(u). --> u:[sqrt(2),3,sqrt(5)]; norma_u:sqrt(u . u); u_unit:u/norma_u; √ √ (%o5) [ 2, 3, 5] (%o6) 4 (%o7) [ √ 1 3 5 , , ] 3 22 4 4 Ahora debemos multiplicar escalarmente el vector obtenido por el gradiente en el punto en el que queremos calcular la derivada direccional. Como en este caso ese gradiente coincide con u tenemos que el valor de la derivada buscada es el siguiente. --> u . u_unit; (%o8) 4 19 Ejercicio 227 En primer lugar limpiamos la memoria y definimos la función f. --> kill(all); f(x,y,z):=x*y-z; (%o0) done (%o1) f (x, y, z) := x y − z Calculamos el vector unitario en la dirección y sentido de (0,1,1). --> u:[0,1,1]; norma_u:sqrt(u . u); u_unit:u/norma_u; (%o2) [0, 1, 1] √ (%o3) 2 1 1 (%o4) [0, √ , √ ] 2 2 16 Ahora calculamos el lı́mite que define la derivada direccional. --> limit((f(1+h*u_unit[1],-1+h*u_unit[2],2+h*u_unit[3])-f(1,-1,2))/h,h,0); (%o5) 0 Como complemento calculamos el lı́mite utilizando el gradiente. --> (%o6) at(jacobian([f(x,y,z)],[x,y,z]),[x=1,y=-1,z=2]); −1 1 −1 --> % . u_unit; (%o7) 0 20 Ejercicio 228 Limpiamos la memoria, definimos la función y calculamos su gradiente en el punto (0,0). --> kill(all); f(x,y):=x*cos(x+y); at(jacobian([f(x,y)],[x,y]),[x=0,y=0]); (%o0) done (%o1) f (x, y) := x cos (x + y) (%o2) 1 0 El coseno del ángulo formado por el gradiente que acabamos de calcular y el vector (1,1) viene dado por la siguiente expresión. --> (% . [1,1])/(sqrt(% . %)*sqrt([1,1] . [1,1])); 1 (%o3) √ 2 Utilizando la función arco coseno obtenemos el ángulo buscado. --> acos(%); (%o4) π 4 17 21 Ejercicio 229 La dirección de máximo crecimiento coincide con la dirección del gradiente. Calculamos el gradiente en ese punto para después dividirlo por su norma y obtener un vector unitario. --> kill(all); f(x,y):=x^2*(x^2+y^2)^(-1); at(jacobian([f(x,y)],[x,y]),[x=1,y=1]); (%o0) done (%o1) f (x, y) := x2 x2 + y 2 1 − 12 (%o2) 2 −1 Construimos el vector unitario. --> (%o3) %*1/sqrt(% . %); √1 √1 − 2 2 18