PRÓLOGO MATLAB es un programa que nos permite desarrollar numerosas aplicaciones al cálculo, la representación y la programación. En este manual, inspirado en el libro A MAT LAB companion f or Multivariable Calculus, de Jeffery M. Cooper, pretendemos complementar la asignatura de Cálculo Diferencial tratando la mayoría de los puntos del temario desde un punto de vista informático, para que el alumno pueda desarrollar en el ordenador los resultados que ha visto en clase. Este trabajo está dividido en seis secciones en las que se exponen los principios básicos para el manejo del programa sobre tratamiento de vectores: representación, posición relativa de dos planos, introducción a dimensión superior; curvas en el plano: curvas paramétricas, tangencias a curvas paramétricas, giros; funciones de dos y tres variables: declaración, representación, funciones polares, superficies de funciones de tres variables; resolución de ecuaciones: método de Newton, intersección de curvas y superficies y por último problemas de optimización. Además hemos apoyado las explicaciones con numerosos ejemplos y figuras generadas por MATLAB para que ilustren y ayuden a la hora de reproducir casos similares. Hemos utilizado algunas funciones no predeterminadas cuyo código puede encontrarse en la página web: http : //www.math.umd.edu/˜jec/matcomp/matcompmf iles/mf iles.html Esperamos que este trabajo sea de utilidad a la hora de introducirse en MATLAB como herramienta aplicable al campo del cálculo multivariable y que anime a los compañeros a ver el ordenador como una máquina capaz de ayudarnos en el trabajo matemático. Por último, agradecemos a nuestro tutor, el profesor José María Martínez Ansemil, la ayuda prestada para realizar este trabajo. Mario Díaz-Romeral Ruiz y Juan Jesús Tebar Moreno Alumnos de Matemáticas becarios de excelencia de la CAM CURSO 2005/06 1 1. 1.1. VECTORES RECTAS Y PLANOS Vectores en dimensiones dos y tres. Los vectores se escriben en MATLAB de la siguiente forma: v = [a, b, c], y la norma usada en principio es la norma euclídea . Podemos destacar los siguientes comandos para pintar vectores con punto de aplicación común, es decir, si tenemos dos vectores v, w y el punto p0 , utilizamos el comando arrow y arrow3 (para dimensión 3) %EJEMPLO 1.1 %nos muestra gráficamente la resta (lo mismo pasaría con la suma) %de dos vectores en el plano p0=[1,1]; v=[1 0]; arrow(p0,v) hold on %para pintar sobre el dibujo creado %con el arrow (sin borrarlo) w=[2,3]; arrow(p0,w) arrow(p0,v-w,’r’) %la ’r’ es para que la solución (v-w) salga en rojo axis equal %son los ejes coordenados hold off %anula hold on 4 3 2 1 0 -1 -2 -2 -1 0 1 2 3 4 5 Resta de vectores Tenemos también las funciones dot(v, w) o también v ∗ w0 para hacer el producto escalar de dos vectores; y para el producto vectorial (en tres dimensiones) está la función cross(v, w). 2 %EJEMPLO 1.2 %producto escalar y vectorial de dos vectores en tres dimensiones %producto vectorial SYMS a b c x y z %declaración de variables simbólicas v=[a b c]; w=[x y z]; cross(v,w) ans = [ b*z-c*y, c*x-a*z, a*y-b*x] %producto escalar v*w’ ans = a*conj(x)+b*conj(y)+c*conj(z) dot(v,w) ans = conj(a)*x+conj(b)*y+conj(c)*z 1.2. Dibujar rectas en dos y tres dimensiones Se pueden dibujar tan sólo sabiendo dos puntos ( P0 = (x0 , y0 ) y P1 = (x1 , y1 ) ) con el comando plot([x0 , x1 ], [y0 , y1 ]). Idem en tres dimensiones pero con el comando plot3. (Para una recta poligonal daremos los cinco puntos necesarios.) También podemos pintar los puntos de las rectas con plot3(x, y, z, 0 ∗ 0). Obsérvese en los dibujos: %EJEMPLO 1.3 %una recta poligonal x=[1,1,1,1,1]; y=[2,2,4,5,2]; z=[1,4,3,4,2]; plot3(x,y,z) %o con plot3(x,y,z,’*’) para que salga con asteriscos 3 4 3.5 3 2.5 2 1.5 1 5 2 4 1.5 1 3 0.5 2 0 Otro comando muy usado que sirve para hacer figuras es f ill (idem en 3 dimensiones.) %EJEMPLO 1.4 %si coinciden las coordenadas x0 con x4,saldrá un triángulo %en caso contrario une los vértices del punto (xo,yo),(x4,y4) x=[1,7,5,3,1];y=[2,-1,4,6,2]; fill(x,y,’r’)%para que salga dibujada en rojo 6 5 4 3 2 1 0 -1 1.3. 1 2 3 4 5 6 Planos Formas de determinar los planos en tres dimensiones: 1) por un punto del plano y su vector normal. 2) con tres puntos del plano. 3) un punto y dos vectores. 4 7 En este ejemplo damos dos vectores y un punto para construir el plano : %EJEMPLO 1.5 p0=[1 1 1]; v=[1 0 0]; w=[1 3 5]; for s=-1:.5:1 for t=-1:.5:1 arrow(p0,s*v+t*w) hold on end end 1 0.5 0 -0.5 -1 -1 0 1 2 3 -2 -1 0 1 2 3 4 Otra manera es con la función predefinida plane(p0 , N) en la que p0 es un punto y N el vector normal al plano, donde sale dibujado mejor el plano, e incluso está dibujado el vector normal. %EJEMPLO 1.6 %aquí dibujaremos un plano apoyándonos en la función plane %realizada por el autor del libro p0=[1 1 2]; N=[1 0 3]; plane(p0,N) 5 2.8 2.6 2.4 2.2 2 2 1.5 1.8 1 0.5 0.5 1 1.5 0 Podemos dibujar la intersección de dos planos, siempre y cuando éstos se corten. %EJEMPLO 1.7 %dibujamos dos planos que al tener un punto en común %y los vectores normales a ambos son diferentes, se cortan %a lo largo de una recta p0=[1 3 6]; %punto común N1=[0 3 3]; N2=[1 2 1]; plane(p0,N1) %dibuja primer plano hold on plane(p0,N2) L=cross(N1,N2); %vector normal a N1 y N2 arrow3(p0,L) %simula la recta intersección de ambos planos hold off 6 6.8 6.6 6.4 6.2 6 5.8 5.6 5.4 5.2 3.5 1.4. 3 2.5 2 1.5 1 0.5 0 Gráficos tridimensionales Es usual cambiar el punto de vista en gráficos tridimensionales, en MATLAB se hace dando dos ángulos, (azimut y elevación). Para cambiar dicho punto de vista, por ejemplo a 40 grados de azimut y 50 de elevación, lo que hacemos es: 1)Poner view(40, 50), para revisar dicho punto de vista; [az, el] = view . 2)Dar un vector view([1 2 1]). 3)Con el comando rotate3don. Pinchando en la figura con el botón izquierdo y rotando la figura, la elevación y el azimut van apareciendo en la pantalla. Con rotate3dof f se finaliza el comando. 7 2. CURVAS EN EL ESPACIO 2.1. Representación paramétrica de curvas. MATLAB reconoce y permite representar curvas dadas en forma paramétrica, esto es, funciones sobre cada una de las componentes del vector salida por un parámetro real t. %EJEMPLO 2.1 %División del intervalo [0,2*pi] en 1000 partes iguales y, %por expresión paramétrica y representación de la circunferencia unidad %centrada en el origen. t=linspace(0,2*pi,1000); x=cos(t); y=sin(t); plot(x,y) %También podemos declarar las funciones del parámetro %para las variables empleando el comando ’inline’. t=linspace(0,2*pi,1000); x=inline(’cos(t)’,’t’); y=inline(’sin(t)’,’t’); plot(x(t),y(t)) %Si declaramos el parámetro como una incógnita simbólica syms t x=cos(t); y=sin(t); ezplot(x,y) %El comando ezplot viene con un argumento que es %el intervalo de definición del parámetro. %MATLAB toma por defecto t en [0,2*pi] 8 1 0.5 0 1 0 -0.5 -1 -1 -0.5 0 0.5 1 -1 También en el caso tridimensional podemos representar curvas paramétricas de la forma (x(t), y(t), z(t)) con t el parámetro real con el que venimos trabajando. Un ejemplo clásico es la hélice circular. %EJEMPLO 2.2 %Se define el rango del parámetro. Se declaran %las variables en función del mismo y, por la %instrucción ’plot3’ %dibuja la hélice circular sobre el espacio. t=linspace(0,4*pi,1000); x=cos(t); y=sin(t); z=t/(2*pi); plot3(x,y,z) %Declarando el parámetro simbólicamente podemos %representar la hélice circular a través de la %instruccién ’ezplot3’ syms t x=cos(t); y=sin(t); z=t/(2*pi); ezplot3(x,y,z,[0,4*pi]) %Se explicita el dominio del parámetro, ya que %por defecto MATLAB hubiese tomado el intervalo [0,2*pi] 9 2 1.5 1 0.5 0 1 0.5 0 -0.5 -1 2.2. -1 -0.5 0 0.5 1 Vectores tangentes a una curva paramétrica. Nos planteamos ahora el problema de las tangencias a curvas paramétricas, y cómo MATLAB lo trabaja. Podemos conseguir representar conjuntamente la curva y los vectores tangentes en los puntos que nos interesen, así como obtener otras aplicaciones curiosas, como se explica a continuación: %EJEMPLO 2.3 %Declaramos la hélice circular como hemos visto %anteriormente y tras ello (por medio de ’hold on’ %para sobreescribir en la misma imagen), toma un nuevo %parámetro ’s’ que divide el dominio, de forma que %calculamos los vectores tangentes a la hélice %en esos puntos. Para ello, haciendo uso de un bucle ’for’, %introduce en ’p’ el punto en que se aplicará el vector, %y en v la dirección. Con la instrucción ’arrow3’ se representa t=linspace (0,4*pi,101); x=inline(’cos(t)’); y=inline(’sin(t)’); z=inline(’t/(2*pi)’); plot3(x(t),y(t),z(t)) hold on 10 for s=linspace(0,4*pi,17); p=[x(s),y(s),z(s)]; v=[-sin(s),cos(s),1/(2*pi)]; arrow3(p,v,’r’) end view(135,40) %La instrucción view cambia el punto de vista. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Dibujamos la hélice circular con un punto rojo recorriéndola %a una velocidad proporcional al módulo del vector velocidad %en el punto por el que pasa. syms t x=cos(t); y=sin(t); z=t/(2*pi); ezplot3(x,y,z,[0,4*pi],’animate’); 2.5 2 1.5 1 0.5 0 -2 -1 0 1 2 -1.5 -1 -0.5 0 0.5 1 1.5 También resulta representativo el estudio de algún caso en el que la derivada se anule. %EJEMPLO 2.4 %En este ejemplo vemos una curva paramétrica con 11 %un punto en que la derivada no es continua. Viene %representada junto con unos vectores tangentes por %algunos puntos. t=linspace(-1,1,101); x=inline(’t.^3’); y=inline(’t.^2’); plot(x(t),y(t),’c’) hold on for j=linspace(-1,1,4); p=[x(j),y(j)]; v=[3*j^2,2*j]; arrow(p,v,’r’) end 3 2.5 2 1.5 1 0.5 0 -0.5 -1 -1 0 1 2 3 4 Para la comprensión de estos códigos será necesario conocer las funciones arrow y arrow3 que se definen en los archivos del mismo nombre y que fueron programadas por el autor. 2.3. Longitud de arcos. El cálculo de la longitud de un segmento recto no plantea excesivas complicaciones. Basta con calcular el módulo del vector que une los puntos extremos del mismo. Tampoco es muy complejo calcular la longitud de un segmento poligonal, lo que se reduce a sumar las longitudes de cada uno de los lados que conforman el polígono. 12 Ahora bien, cuando se trata de calcular la longitud de una curva entre dos extremos definidos el problema no es en absoluto trivial. MATLAB lo tratará de varias formas Será útil también conocer la expresión de la longitud de una curva paramétrica que aporta el cálculo integral: Z a b Z bp kv(t)k dt = x0 (t)2 + y 0 (t)2 + z 0 (t)2 dt a %EJEMPLO 2.5 %Resolveremos el problema de calcular el valor %de la longitud de una curva usando la aproximación %por segmentos rectos. %Hallamos la longitud de la curva C(t)=[t^2,2*t,exp(t)] %1<=t<=2 n=input(’£En cuantos segmentos se quiere dividir la curva?’) t=1:(1/n):2; x=t.^2; y=2*t; z=exp(t); sum = 0; %Calculamos en un bucle ’for’ el vector que separa dos puntos %consecutivos de la partición de la curva. for j=1:n dx=x(j+1)-x(j); dy=y(j+1)-y(j); dz=z(j+1)-z(j); dr=[dx,dy,dz]; %usando el contador ’sum’ inicializado al principio, %sumamos las normas de los vectores que hemos calculado. sum=sum+norm(dr); end disp(’Este es el valor de la longitud de la curva’); sum disp(’La hemos dividido en’); n %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Otra forma de resolver el problema es empleando la fórmula %Aproximamos la curva del ejemplo anterior. normderiv=inline(’sqrt((2*t).^2+4+(exp(t)).^2)’,’t’); quad8(normderiv,1,2) %el comando quad8 calcula aproximaciones numéricas %de integrales entre los extremos de la variable indicados. %OBSERVACIÓN:Usar ’help quad8’ para considerar una 13 %diferencia de sintaxis según definamos la función %en línea o por un archivo *.m %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Por último podemos emplear un algoritmo simbólico. %Consideramos un límite de integración (el superior %en este caso), como una variable simbólica. %Empleamos la fórmula de la integral. syms t b r=[t.^2 2*t exp(t)]; v=diff(r) normderiv=sqrt(v(1)^2+v(2)^2+v(3)^2); longitud=int(normderiv, t, 1, b) pretty(longitud) %empleamos en este código dos comandos nuevos: %int(S,a,b) calcula la integral de la expresión simbólica S %entre ’a’ y ’b’. pretty(S) da a la expresión simbólica S %un formato matemático mas inteligible. 2.4. Geometría de las curvas. Estudiaremos en este apartado la definición de tres vectores característicos a la curva paramétrica en un punto donde exista diferencial, que surgen a partir del vector tangente a la curva en el punto en cuestión. Forman lo que se llama cuadro de F renet, y se definen: T (t) = v(t) [x0 (t), y 0 (t), z 0 (t)] =p kv(t)k x0 (t)2 + y 0 (t)2 + z 0 (t)2 El vector tangente unitario (simplemente el vector velocidad dividido por su módulo) N(t) = T 0 (t) kT 0 (t)k Vector unitario ortogonal a T (t) y que se denomina normal principal B(t) = N(t) × T (t) 14 El vector que completa la referencia. Se ha desarrollado una función f renet, que nos dibuja sobre una curva paramétrica lo que es el cuadro de Frenet sobre cuatro valores del parámetro. 2.5. Rotaciones en el plano. Las rotaciones en el plano euclídeo son una herramienta muy valiosa en geometría. Aplicándolas al estudio de curvas paramétricas, podemos usar MATLAB para calcular la imagen de una de ellas por una rotación respecto a cualquier punto y con cualquier argumento usando técnicas similares a las empleadas en álgebra. Si tenemos un punto (x, y) del plano y queremos realizar una rotación de centro el origen y argumento 0 ≤ θ ≤ 2π, la matriz · ¸ cos θ − sin θ R= sin θ cos θ Es lo que se llama una matriz de rotación, y si consideramos ahora la imagen por esa matriz de un vector de R2 w = Rv = [x cos θ − y sin θ, x sin θ + y cos θ] Podemos considerar en el caso paramétrico: q(s) = Rr(s) = [x(s) cos θ − y(s) sin θ, x(s) sin θ + y(s) cos θ] Donde s es el parámetro que define la curva sobre el plano. De esta forma, podemos trabajar en MATLAB con estos conceptos: % EJEMPLO 2.6 %Rotamos una curva paramétrica en el plano, por ejemplo la elipse %(x^2/16)+(y^2/9)=1 arg=input(’Dame el argumento de giro’); t=linspace(0,2*pi,101); x0=4*cos(t);y0=3*sin(t); %así representamos la elipse en primer término. plot(x0,y0); hold on 15 x=cos(arg)*x0-sin(arg)*y0; y=sin(arg)*x0+cos(arg)*y0; %dibujamos el giro sobre el mismo gráfico. plot(x,y,’r’); axis equal 4 3 2 1 0 -1 -2 -3 -4 -5 0 16 5 3. FUNCIONES DE DOS VARIABLES 3.1. Funciones de dos variables. Representación. Hay dos formas de definir funciones en MATLAB. a) Programándola como un archivo ∗.m %EJEMPLO 3.1.1 function z=f(x,y) z=x.^2+y; b) Introduciéndola directamente sobre la pantalla de ejecución. %EJEMPLO 3.1.2 f=inline(’x.^2+y’,’x’,’y’) f = Inline function: f(x,y) = x.^2+y %ahora podemos utilizar f de la forma habitual, por ejemplo : f(3,5) ans = 14 Por el primer método también es sencillo programar funciones de mayor complejidad %EJEMPLO 3.2 % vamos a programar la función f1(x,y)=exp(u-2v)*cos(3u), donde: % u=3x^2+5y y v=3x+2y function z=f1(x,y) u=3*x.^2+5*y; v=3*x+2*y; z=exp(u-2*v)*cos(3*u); Para representar funciones de dos variables sobre un rectángulo en el plano x, y con a < x < b, c < y < d MATLAB divide el rectángulo en las partes indicadas mediante el comando meshgrid. 17 %EJEMPLO 3.3.1 %-1<=x<=2 ; 2<=y<=4 con separación 0.5 x=-1:.5:2;y=2:.5:4; [X,Y]= meshgrid (x,y) X = -1.0000 -0.5000 0 0.5000 1.0000 1.5000 -1.0000 -0.5000 0 0.5000 1.0000 1.5000 -1.0000 -0.5000 0 0.5000 1.0000 1.5000 -1.0000 -0.5000 0 0.5000 1.0000 1.5000 -1.0000 -0.5000 0 0.5000 1.0000 1.5000 Y = 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.5000 2.5000 2.5000 2.5000 2.5000 2.5000 3.0000 3.0000 3.0000 3.0000 3.0000 3.0000 3.5000 3.5000 3.5000 3.5000 3.5000 3.5000 4.0000 4.0000 4.0000 4.0000 4.0000 4.0000 %Tenemos el rectángulo dividido, ahora representamos la función f2=inline(’x+exp(y.^2)’,’x’,’y’) f2 = Inline function: f2(x,y) = x+exp(y.^2) Z=f2(X,Y) Z = 1.0e+006 * 0.0001 0.0001 0.0001 0.0001 0.0001 0.0001 0.0005 0.0005 0.0005 0.0005 0.0005 0.0005 0.0081 0.0081 0.0081 0.0081 0.0081 0.0081 0.2090 0.2090 0.2090 0.2090 0.2090 0.2090 8.8861 8.8861 8.8861 8.8861 8.8861 8.8861 %ahora el gráfico se hace con el comando SURF surf(X,Y,Z) 18 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.5000 3.0000 3.5000 4.0000 0.0001 0.0005 0.0081 0.2090 8.8861 x 10 6 10 8 6 4 2 0 4 3.5 2 3 1 2.5 0 2 -1 Se puede omitir el paso de crear el rectángulo para representar dichas funciones programando una aplicación específica. %EJEMPLO 3.3.2 function salida=representacion(f, vertices) %vamos a dar los elementos del vector corners que son cada uno de los %puntos que el usuario ha dado como esquinas a=vertices(1); b=vertices(2); c=vertices(3); d=vertices(4); %dividimos como antes el rectángulo en subrrectángulos x=linspace(a,b,41); y=linspace(c,d,31); [X,Y]=meshgrid(x,y); %utilizamos el comando feval para evaluar la función en X,Y Z=feval(f,X,Y); surf(X,Y,Z) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Un ejemplo de aplicación en la pantalla de ejecución sería %f(x,y)=2*x*y^2/exp(x) f=input(’2*x.*y.^2./exp(x)’,’x’,’y’); representacion(f,[[0 0] [0 1] [1 0] [1 1]]) 3.2. Representación de funciones polares 19 El único cambio significativo es que en la representación nos interesara un dominio circular en vez de rectangular. %EJEMPLO 3.4 %primero hacemos un rectángulo en r,t r=linspace(0,2,16); t=linspace(0,2*pi,16); [R,T]=meshgrid(r,t); %ahora "curvamos" el rectángulo en coordenadas x,y X=R.*cos(T); Y=R.*sin(T); Z=f(X,Y); surf(X,Y,Z) %tomamos una f genérica. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %En la pantalla de ejecución f=input(’2*x.*y./exp(x)’,’x’,’y’); ejemplo3_4 20 10 0 -10 -20 2 1 2 1 0 0 -1 -1 -2 3.3. -2 Curvas de nivel MATLAB sabe representar la curva que define la intersección entre la gráfica de una función de dos variables y un plano de la forma z = c 20 %EJEMPLO 3.5 %para representar unas líneas de contorno podemos utilizar el %comando contour(X,Y,f(X,Y)),a función definida. Usando la función %contour con otros argumentos, contour(X,Y,f(X,Y),n) nos da %las líneas de contorno de n puntos equiespaciados en el %intervalo (min(f),max(f)), por último, podemos sustituir %el argumento n por un vector con las coordenadas que nos interesen x=-2:.05:2; y=-2:.05:3; [X,Y]=meshgrid(x,y); f=inline(’4*exp(x)+y.^2’,’x’,’y’); Z=f(X,Y); plot3(X,Y,Z); hold on contour(X,Y,Z,10) hold off 40 30 20 10 0 4 2 2 1 0 0 -1 -2 3.4. -2 Técnicas gráficas para funciones simbólicas MATLAB incluye una serie de comandos para la representación de funciones simbólicas de dos variables, entre ellos destacan: ezsurf , ezmesh y ezcontour. Por ejemplo: 21 %EJEMPLO 3.6 %declaramos como variables simbólicas ’x’ e ’y’ syms x y f=sin(x)*exp(y^2) f = sin(x)*exp(y^2) ezsurf(f,[[1 1][2 1] [1 2] [2 2]]) 2 sin(x) exp(y ) 3 2 1 0 -1 -2 -3 1 0.5 1 0.5 0 0 -0.5 y -0.5 -1 -1 x Los otros dos comandos funcionan de forma similar, sólo que para funciones de mayor complejidad. 3.5. Derivadas parciales y direccionales. Para medir la variación de una función, se considera la restricción de f a rectas paralelas a los ejes x e y , sobre las que se estudia el incremento en la otra variable, que queda fija. La definición precisa de derivadas parciales es: ∂f f (x, y0 ) − f (x0 , y0 ) (x0 , y0 ) = lı́m x→x0 ∂x x − x0 22 y forman el gradiente ∂f f (x0 , y) − f (x0 , y0 ) (x0 , y0 ) = lı́m y→y0 ∂y y − y0 · ¸ ∂f ∂f ∇f (x, y) = (x, y), (x, y) ∂x ∂y Las aplicaciones xslice e yslice (programadas por el autor) intersecan la función con el plano y = y0 (xslice) y con un plano x = x0 (yslice) %EJEMPLO 3.7 f=inline(’6*x.^2+8*y.^3+.5’,’x’,’y’); qsurf(f,[0 2 0 2]); shading flat %shading flat elimina la "redecilla" de la superficie. hold on x=linspace(0,2,51); xslice(f,x,1) hold off 100 80 60 40 20 0 2 1.5 2 1.5 1 1 0.5 0.5 0 3.6. 0 Derivadas direccionales De forma más general, tomamos en vez de v = [1, 0] y u = [0, 1] otro vector w = [w1 , w2 ] 23 para realizar una derivada direccional según la definición: f (x0 + hw1 , y0 + hw2 ) − f (x0 , y0 ) h→0 h Du f (x0 , y0 ) = lı́m La función mslice funciona con dos argumentos mslice(f, P ), donde f es una función definida en línea y P es un punto a partir del cual se define un vector (haciendo click en otro punto del plano) y MATLAB nos devuelve la derivada direccional del punto en la dirección del vector. %EJEMPLO 3.8 f f = Inline function: f(x,y) = x+y.^2 P P = 1 2 mslice(f,P) This is a chance to enlarge the window, and rotate the figure When you are finished, enter return u1 u2 Duf ans = -0.9681 -0.2507 -1.9709 ans = 0.8904 -0.4552 -0.9305 ans = 0.9623 0.2718 2.0497 ans = -0.8165 0.5773 1.4928 ans = 0.0104 0.9999 4.0102 24 z axis 20 10 0 3 2.5 2 1.5 1 y axis 2 1.5 1 0.5 0 x axis y axis 2.5 P 2 1.5 -0.5 0 0.5 1 x axis 1.5 2 2.5 Observamos que el vector gradiente en un punto es ortogonal a la curva de nivel que pasa por él. 3.7. Aproximación por un plano tangente Es de gran utilidad aproximar por una expresión lineal (afín) una curva en dos variables en el entorno de un punto (x0 , y0 ). El plano tangente a la curva en un punto nos sirve a tal efecto. Viene dado por la expresión f (x, y) = f (x0 , y0 ) + fx (x0 , y0 )(x − x0 ) + fy (x0 , y0 )(y − y0 ) + E Donde E es una expresión que tiende a cero cuando (x, y) → (x0 , y0 ) y fx , fy son las derivadas parciales. %EJEMPLO 3.9 f=inline(’x.^2+sin(y)’,’x’,’y’); fx=inline(’2*x’,’x’,’y’); fy=inline(’cos(y)’,’x’,’y’); %fx y fy con las parciales de f p(f,fx,fy,1,0) ans = -1+2*x+y %mirar definición de p después de la figura que sigue. 25 qsurf(f,[-1,1 -1,1]) hold on g=inline(’-1+2*x+y’,’x’,’y’); qsurf(g,[-.3,.7,-.9,.1]) 2 0 -2 -4 -1 -0.5 0 0.5 1 1 0.5 0 -0.5 -1 Sólo queda por explicar la función que se ha definido p.m y que nos da el plano tangente a la curva por un punto dándole la función, las derivadas parciales y el punto. La transcripción del código es: %funcion p function salida=p(f,fx,fy,x0,y0) syms x y salida=feval(f,x0,y0)+feval(fx,x0,y0)*(x-x0)+feval(fy,x0,y0)*(y-y0); 3.8. Reconversión de escala En algunas ocasiones para pequeñas surperficies en el pano xy , la imagen toma valores extremos. Cuando esto ocurre la escala del gráfico hace que se pierda detalle de cómo es en realidad la gráfica.Para solventarlo se pueden seccionar los valores de la función ganando precisión. Por ejemplo: %EJEMPLO 3.10 f=inline(’(x.^4+y.^2).^(-1)+cos(x).*sin(y)’,’x’,’y’) 26 f = Inline function: f(x,y) = (x.^4+y.^2+.01).^(-1)+cos(x).*sin(y) [X,Y]=meshgrid(-2*pi:.1:2*pi); Z=f(X,Y); %esta función tiene un máximo muy elevado en (0,0). %seccionamos la gráfica usando la función característica siguiente W=(Z-4<0).*(Z-4)+4; surf(X,Y,W); 4 3 2 -10 1 -5 0 0 5 -1 -8 3.9. -6 -4 -2 0 2 4 6 8 10 El comando subplot El comando subplot de MATLAB sirve para introducir en una misma ventana varios gráficos distintos. El comando subplot funciona con tres argumentos: los dos primeros indican la dimensión del array, y el tercero la posición particular de cada uno de los gráficos. %EJEMPLO 3.11 f=inline(’c*cos(3*x)+c*sin(2*y)’,’x’,’y’,’c’) f = Inline function: f(x,y,c) = c*cos(3*x)+c*sin(2*y) 27 [X,Y]=meshgrid(-2:.2:2); subplot(2,2,1) %para c=1 surf(X,Y,f(X,Y,1)) subplot(2,2,2) %para c=.4 surf(X,Y,f(X,Y,.4)) subplot(2,2,3) %para c=pi surf(X,Y,f(X,Y,pi)) subplot(2,2,4) %para c=10^(-4) surf(X,Y,f(X,Y,.0001)) %obsérvese la diferencia de escala 2 1 0 0 -2 2 0 -2 -2 0 2 -1 2 0 -2 x 10 10 2 0 0 -10 2 0 -2 -2 0 2 0 2 -4 -2 2 0 -2 28 -2 -2 0 2 4. 4.1. FUNCIONES DE TRES VARIABLES Y SUPERFICIES PARAMÉTRICAS Definición de funciones tridimensionales. Niveles. Las funciones de tres variables f : R3 → R pueden definirse en MATLAB de forma análoga a como se han venido definiendo en el caso unidimensional y bidimensional. Así, por ejemplo, tenemos: %EJEMPLO 4.1, %(a)definimos función de tres variables sobre la pantalla de ejecución. F=inline(’(x.^2-exp(y)).*z’,’x’,’y’,’z’) F = Inline function: F(x,y,z) = (x.^2-exp(y)).*z %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %(b)definimos funcion de tres variables sobre archivo *.m function u=f(x,y,z) u=x.^2/(sqrt(y.^2+z.^2+1)); El gráfico de una función de tres variables sería una superficie tridimensional contenida en un espacio en cuatro dimensiones, lo que no puede ser visualizado. Sin embargo, contamos con una herramienta: superficies tridimensionales de nivel. Estas son, conjuntos de la forma Sc = {(x, y, z) ∈ R3 : f (x, y, z) = c} Así, podremos considerar la representación gráfica de z = g(x, y) = x2 + y 2 − c Un ejemplo particular interesante de trabajar es el de las cuádricas, superficies de nivel de una función cuadrática en x y z: (a): f (x, y, z) = z − x2 − y 2 ⇒ z = g(x, y) = x2 + y 2 + c %EJEMPLO 4.2.1 %Representamos un paraboloide, superficie de nivel de una función %como la del ejemplo (a). Se representan para c=1, c=5. 29 f=inline(’x.^2+y.^2+c’,’x’,’y’,’c’); [X,Y]=meshgrid(-2:.2:2); surf(X,Y,f(X,Y,1)) hold on surf(X,Y,f(X,Y,5)) 15 10 5 0 2 1 2 1 0 0 -1 -1 -2 -2 (b): f (x, y, z) = z − x2 + y 2 ⇒ z = g(x, y) = x2 − y 2 + c %EJEMPLO 4_2_2 %Paraboloide hiperbólico, superficie de nivel de una función %como la del ejemplo (b). Se representa para c=1, c=10. f=inline(’x.^2-y.^2+c’,’x’,’y’,’c’); [X,Y]=meshgrid(-2:.2:2); surf(X,Y,f(X,Y,1)) hold on surf(X,Y,f(X,Y,10)) 30 15 10 5 0 -5 2 1 2 1 0 0 -1 -1 -2 -2 ½ p c ≥ 0, una rama 2 2 (c): f (x, y, z) = −z +x +y ⇒ z = g(x, y) = ± x + y − c ⇒ c < 0, dos ramas 2 2 2 %EJEMPLO 4.2.3 %Un hiperboloide es la superficie de nivel de una función %como la del ejemplo (c). Se representan para c=1, c=-1. f=inline(’sqrt(x.^2+y.^2-c)’,’x’,’y’,’c’); [X,Y]=meshgrid(-2:.2:2); plot3(X,Y,f(X,Y,1)) hold on plot3(X,Y,-f(X,Y,1)) hold off plot3(X,Y,f(X,Y,-1)) hold on plot3(X,Y,-f(X,Y,-1)) 31 3 2 1 0 -1 -2 -3 2 1 2 1 0 0 -1 -1 -2 -2 sµ ¶ x2 y 2 x2 y 2 z 2 (d): f (x, y, z) = 2 + 2 + 2 ⇒ z = ± + 2 − d (−c2 ) a b c a2 b %EJEMPLO 4.2.4 %Un elipsoide es la superficie de nivel de una función %como la del ejemplo (d). Para k=1,k=2 (caso a=2,b=3,c=1) f=inline(’sqrt(-x.^2/4-y.^2/9+k)’,’x’,’y’,’k’); [X,Y]=meshgrid(-2:.2:2); plot3(X,Y,f(X,Y,1)) hold on plot3(X,Y,f(X,Y,2)) 32 1.5 1 0.5 0 2 0 -2 -1 0 1 2 Muchas veces, sin embargo, será difícil o incluso imposible despejar una variable en función de las otras dos en una ecuación del tipo f (x, y, z) = c. El autor del libro nos deja la función impl.m, que tomará valores z = z0 y trazará, empleando el comando contour, curvas de nivel de la superficie de nivel que buscamos intesecada con el plano z = z0 . 4.2. Secciones planas de un sólido. Supongamos una función f : R3 → R que asigna a cada punto del espacio una característica numérica (por ejemplo temperatura, densidad, presión). Podemos dibujar planos paralelos a los coordenados que representarán mediante un índice de color el valor de la imagen. Esta representación es muy útil en casos donde no se pueda despejar una variable como anteriormente. Nos aportará una información comparativa muy ilustrativa, y será también válida para detectar extremos relativos. Será clave en este apartado el uso del comando slice, que precisamente realiza la tarea anteriormente descrita. %EJEMPLO 4.3 f=inline(’log(x.^2+0.1)+sin(y).*cos(z)’,’x’,’y’,’z’); x=0:.2:2; y=0:.2:2; z=0:.2:4; [X,Y,Z]=meshgrid(x,y,z); W=f(X,Y,Z); slice(X,Y,Z,W,1,1,2) colormap(hot) 33 colorbar 2 1.5 4 1 3 0.5 0 2 -0.5 1 -1 -1.5 0 2 -2 1.5 2 1.5 1 1 0.5 0.5 0 4.3. -2.5 -3 0 El espacio vectorial gradiente. Podemos definir el espacio vectorial gradiente como el conjunto de los vectores gradiente en cada punto del espacio por una función f : R3 → R . Por ejemplo, programamos para la función f (x, y, z) = − x3 3y 2 3z + + 3 2 2 %EJEMPLO 4.4 [X,Y]=meshgrid(0:.5:2); U=-X.^2; V=Y*3; W=3/2+0*X; for z=[-1,0,1] Z=1.5*z+0*X; quiver3(X,Y,Z,U,V,W) end 34 2 1 5 0 -1 0 -2 -0.5 0 0.5 1 1.5 Vectores gradiente 35 2 -5 5. RESOLUCIÓN DE ECUACIONES Veremos cómo resolver sistemas no lineales de dos ecuaciones con dos incógnitas ½ 5.1. f (x, y) = 0 g(x, y) = 0 Soluciones simbólicas Explicaremos con un ejemplo el procedimiento a seguir para resolver la intersección de dos curvas: ½ f (x, y) = x2 + y 2 − 2 g(x, y) = x2 − y Nos apoyaremos en las gráficas de nivel : f (x, y) = 0 g(x, y) = 0 %EJEMPLO 5.1 syms x y f=x^2-2*y; g=x^2+3*y; [a,b]=solve(f,g); double([a,b]) ans = 0 0 0 0 Estas gráficas tienen una intersección doble en el (0, 0). 36 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 Doble intersección 5.2. Soluciones de ecuaciones de una variable Un algoritmo muy conocido para la resolución de ecuaciones es el método de Newton 0 xn+1 = xn − f (xn )/f (xn ) 0 Esta sucesión converge bien a la solución buscada cuando f (xn ) 6= 0 aunque 0 también es utilizada para encontrar las raíces f (x) = 0 con f (x) = 0 (en este caso, si converge, será lentamente). Vamos a escribir un programa para obtener las raíces de una función basándonos en éste algoritmo %EJEMPLO 5.2 valorinicial=input(’introduce el valor inicial’) N=input(’introduce el número de iteraciones deseadas’) x=zeros(N,1) %vector de ceros x(1)=valorinicial; for n=1:n-1 x(n+1)=x(n)-f(x(n))/df(x(n)); end [x,f(x)] Donde f es la función deseada y df , su derivada, son dos funciones que se tienen que programar en MATLAB, devolviendo ambas un valor. 37 Si tenemos una situación en la que hay dos raíces y damos un valor más cercano a una (sin que éste sea un máximo o un mínimo relativo), el método de Newton convergerá a la raíz, si por el contrario es un máximo (o mínimo), no convergerá En MATLAB el comando f zero también sirve para encontrar raíces de la forma f (x) = 0 ; la forma de usarlo es la siguiente: %EJEMPLO 5.3 f=inline(’cos(3*x)+.5*x’,’x’); raiz=fzero(f,[-2,2]) %encontraremos las raíces en el intervalo [-2 2] Zero found in the interval: [-2, 2]. raiz = -0.4483 5.3. Resolución de una ecuación de dos variables Si no se puede resolver la ecuación planteada, podemos dar una aproximación. Si tenemos un punto (x0 , y0 ) tal que f (x0 , y0 ) = 0 y fy (x0 , y0 ) 6= 0 por el teorema de la función implícita sabemos que para los x cercanos a x0 la curva de nivel f (x, y) = 0 es la gráfica de una función y = g(x), ahora sí podemos encontrar los valores de la y en función de los de las x . Hay que tener en cuenta que el comando f zero sólo se utiliza en funciones de una variable ; si queremos que evalúe más de una variable lo que haremos será considerar todas las variables menos una como parámetros. Vamos a ver un ejemplo con la función: f (x, y) = 3 sin(x) + exp(y 2 ) en el intervalo [0, 1] × [1, 3] %EJEMPLO 5.4 function z=f(y,x) %hemos intercambiado f(y,x) z=3*sin(x)+y.*exp(y^2); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% x=-.2:.05:1.05; y=zeros(size(x)); y(1)=fzero(’f’,exp(1),[],-.2); for n=2:120 y(n)=fzero(’f’,y(n-1),[],x(n)); end 38 0.5 0 -0.5 -1 -0.2 0 0.2 0.4 39 0.6 0.8 1 1.2 6. 6.1. OPTIMIZACIÓN. Puntos críticos. Evaluación de la segunda derivada. Un punto crítico de una función bidimensional f (x, y) es un punto (x0 , y0 ) del dominio en el que f es diferenciable y en el que su diferencial es nula. Un punto crítico puede ser extremo local de f o no. Para encontrar los puntos críticos de una función debemos resolver el sistema: ½ fx (x, y) = 0 fy (x, y) = 0 donde fx fy son las derivadas parciales de f . Hay diversos caminos para encontrar soluciones a estas ecuaciones. Una vez que el gradiente es nulo, debemos observar las derivadas de orden mayor, para discutir el comportamiento de f en un entorno de los puntos críticos (recordar los resultados al respecto en funciones de una variable). 0 -0.5 -2 -1 -1.5 -1 -2 2 0 1 1 0 -1 -2 f (x, y) = xy 2 p 3 − x 2 − y2 Para extender el concepto de evaluación de un punto crítico por la segunda derivada del cálculo de variable real, se introduce la matriz hessiana, ¶ µ fxx (x, y) fxy (x, y) H(x, y) = fyx (x, y) fyy (x, y) Esta matriz será simétrica cuando f ∈ C 2 . Ahora, el resultado que determinará la naturaleza del punto crítico será: 40 Si Si Si Si det(H(x0 , y0 )) det(H(x0 , y0 )) det(H(x0 , y0 )) det(H(x0 , y0 )) > > < = 0 0 0 0 y fxx (x0 , y0 ) > 0 ⇒ (x0 , y0 ) es un mínimo local. y fxx (x0 , y0 ) < 0 ⇒ (x0 , y0 ) es un máximo local. ⇒ (x0 , y0 ) es un punto de ensilladura. ⇒ No podemos llegar a una conclusión. Como curiosidad notamos que en los puntos de ensilladura, al hacer intersecciones con planos horizontales, se tiende hacia un comportamiento hiperbólico en el punto en cuestión. 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2 -1.5 -1 -0.5 0 f (x, y) = xy 0.5 1 1.5 p 3 − x 2 − y2 %EJEMPLO 6.1 f=inline(’x.*y.*sqrt(3-x.^2-y.^2)’,’x’,’y’); x=-2:.4:2; y=-2:.4:2; [X,Y]=meshgrid(x,y); Z=f(X,Y); contour(X,Y,Z,25); Este es el código MATLAB que lleva al resultado gráfico superior. 41 6.2. Estimación de máximos y mínimos. MATLAB tiene algunas herramientas que nos ayudarán en el cálculo de extremos en un intervalo del dominio. Veamos un ejemplo en una variable: %EJEMPLO 6.2 f=inline(’(x.^(-2)+.01).*sin(x)’,’x’); [M,i]=max(f(x)) M = 14.2747 i = 24 xmax=x(i) xmax = 0.0700 [m,j]=min(f(x)) m = -49.9969 j = 23 xmin=x(j) xmin = -0.0200 Los comandos máx f (x) y mı́n f (x) funcionan dándonos los extremos que ha obtenido evaluando en f los valores de x que le hemos especificado. En el índice nos dan la posición de la muestra en que se encuentra este valor de la variable, y por último le pedimos que nos dé cuál es el valor de x para el que obtenemos el extremo. Un caso multivariable: %EJEMPLO 6.3 f=inline(’x.^4-exp(.05*y)’,’x’,’y’); x=-2:.09:2; y=-2:.09:2; [X,Y]=meshgrid(x,y); [fila,col]=max(f(X,Y)); %Guardamos los máximos de cada columna [maxf,j]=max(fila) %Hallamos el máximo del vector de máximos maxf = 42 15.0952 j = 1 x0=x(j) x0 = -2 y0=y(col(j)) y0 = -2 Así, tenemos que f (−2, −2) ≥ f (xj , yj ) para cualquier punto (xj , yj ) de la matriz. Vamos por último a realizar un ejemplo de búsqueda de extremos en una función bidimensional. %EJEMPLO 6.4 f=inline(’x.^2+y.^2’,’x’,’y’); x=-2:.09:2; y=-2:.09:2; [X,Y]=meshgrid(x,y); surf(X,Y,f(X,Y)) syms x y fx=2*x; fy=2*y; [a,b]=solve(fx,fy) a = 0 b = 0 double([a,b]) ans = 0 0 fxx=diff(fx,x); fxy=diff(fx,y); fyy=diff(fy,y); D=fxx*fyy-fxy^2 D = 4 subs(D,[x,y],[a,b]) ans = 4 %’subs’ sustituye variables simbólicas por números. 43 subs(fxx,[x,y],[a,b]) ans = 2 %det(H(0,0))>0,fxx(0,0)>0 -------> f tiene un mínimo en (0,0). 8 6 4 2 0 2 1 2 1 0 0 -1 -1 -2 6.3. -2 Funciones de tres variables. Como en el caso bidimensional, los puntos críticos son aquellos del dominio en los que f es diferenciable y ∇f (x0 , y0 , z0 ) = (0, 0, 0). Las soluciones de este sistema son candidatos a extremos relativos de la función. Para hacernos una idea, como se explicó anteriormente; podemos emplear la instrucción slice. Será fácil intuir posibles extremos a la luz de la representación por planos paralelos a los coordenados que han sido coloreados según la imagen de cada punto. Por ejemplo. %EJEMPLO 6.5 f=inline(’exp(sqrt(abs(x-y+z)))’,’x’,’y’,’z’); x=linspace(-2,2,43); y=linspace(-2,2,43); z=linspace(-2,2,43); [X,Y,Z]=meshgrid(x,y,z); 44 W=f(X,Y,Z); slice(X,Y,Z,W,[-1 0 1],0,0); colorbar 2 11 1 10 0 9 -1 8 -2 7 2 6 5 1 4 0 3 -1 -2 2 -2 0 -1 1 2 Podemos intuir que habrá un mínimo en (0, 0, 0), que valdrá aproximadamente 1. Efectivamente, %EJEMPLO 6.6 corners=[-2,2,-2,2,-2,2]; subplot(2,2,1) impl(f,corners,1.75) title(’c=1.75’) subplot(2,2,2) impl(f,corners,1.45) title(’c=1.45’) subplot(2,2,3) impl(f,corners,1.20) title(’c=1.20’) subplot(2,2,4) impl(f,corners,1.000000000000000000001) title(’c=1.000000000000000000001’) 45 c=1.75 c=1.45 2 0 z z 2 0 -2 2 -2 2 0 y -2 -2 x y c=1.2 x -2 -2 c=1.000000000000000000001 2 2 0 z z 0 0 2 0 2 -2 2 2 0 0 y -2 -2 0 -2 2 0 y x -2 -2 0 2 x Cada vez nos acercamos más al valor del mínimo, por lo tanto, el par de planos que representan la superficie de nivel para un valor de c cualquiera, van estando más próximos. En el valor límite, los planos serán coincidentes. 46 47