# Práctica 3: Función escalar de varias variables y derivación parcial.

## Funciones multivariables:

kill(all);

Una función escalar de dos variables:

f(x,y):=sin(x-y);

Evaluada en el punto (π/2, 0):

f(%pi/2,0);

Representamos su gráfica (una superficie en el espacio) mediante plot3d:

plot3d(f(x,y),[x,-5,5],[y,-5,5]);

Algunos parámetros gráficos adicionales:

plot3d(f(x,y),[x,-5,5],[y,-5,5],
    [grid, 100,100],
    [legend,false],
    [palette, false],
    [color, red]);

Contourplot (añade curvas de nivel sobre el plano XY):

plot3d(f(x,y),[x,-5,5],[y,-5,5],
    [gnuplot_preamble, "set contour"]);

Con plot3d también podemos representar superficies definidas paramétricamente. Aquí, un ejemplo con un toro de revolución:

expr_1: cos(y)*(2+cos(x))$
expr_2: sin(y)*(2+cos(x))$
expr_3: -sin(x)$

plot3d([expr_1, expr_2, expr_3], [x, 0, 2*%pi], [y, 0, 2*%pi],
     [grid, 40, 40], same_xyz);

Para representar conjuntamente dos funciones debemos meterlas en una lista (usando corchetes), tanto las funciones como los intervalos de x e y.

g(x,y):=2*x;

plot3d([f(x,y),g(x,y), [x,-2,2], [y,-2,2]]);

## Limites

kill(all);

f(x,y):=(x-y)^2/(x^2+y^2);

He aquí una superficie que no es continua en el origen.

plot3d(f(x,y),[x,-2,2],[y,-2,2]);

plot3d(f(x,y),[x,-20,20],[y,-20,20],
[gnuplot_preamble,"set contour"]);

Limites reiterados: 
Hacer limites en dos pasos: 
Primero por x y despues por el variable y.

limit(f(x,y),x,0);

define(g(y),limit(f(x,y),x,0));

limit(g(y),y,0);

O bien primero por y y despues por el variable x.

limit(f(x,y),y,0);

define(h(x),limit(f(x,y),y,0));

limit(h(x),x,0);

Limites direccionales.

Primero, el límite a lo largo del eje X:

limit(f(x,0),x,0);

Límite a lo largo del eje Y:

limit(f(0,y),y,0);

Límite direccional, a lo  largo de la recta y=x

limit(f(x,x),x,0);

Límite direccional, a lo largo de la parábola y=x²

limit(f(x,x^2),x,0);

Al no coincidir el valor de los límites direccionales, podemos concluir que NO existe el límite de f(x,y) en (0,0)

También podemos verlo utilizando la familia de rectas del tipo y=m.x:

limit(f(x,m*x),x,0);

Al observar que el valor del límite depende del parámetro "m"

## Derivadas parciales 

f(x,y):=x^5+3*x^3*y^2+3*x*y^4;

plot3d(f(x,y),[x,-2,2],[y,-2,2]);

Las primeras derivadas parciales se obtiene fácilmente aplicando la función diff, y derivando respecto de la variable de interés:

∂f/∂x

diff(f(x,y),x);

∂f/∂y

diff(f(x,y),y);

Para las derivadas parciales de segundo orden, se indica el orden de la derivada en el segundo argumento de "diff" (que por defecto es igual a 1):

∂²f/∂x²

diff(f(x,y),x,2);

∂²f/∂y²

diff(f(x,y),y,2);

Si se deriva respecto de dos o más variables, es necesario indicar los índices de derivación en cada variable. Por tanto, las derivadas cruzadas vienen dadas por:

∂²f/∂y∂x

diff(f(x,y),x,1,y,1);

Que quiere decir que de se deriva la expresión "en x 1 vez y en y 1 una vez", por ese orden. Del mismo modo:

∂²f/∂x∂y

diff(f(x,y),y,1,x,1);

Nótese que en este caso, ambas derivadas cruzadas dan el mismo resultado en virtud del Teorema de Schwarz.

De forma similar, se define a continuación ∂³f/∂y²∂x:

diff(f(x,y),x,1,y,2);

∂³f/∂y∂x∂y:

diff(f(x,y),y,1,x,1,y,1);

## Derivada direccional

kill(all);

f(x,y):=x^2+2*y^3;

Para el cálculo de la derivada direccional aplicaremos la fórmula Du=grad f · u = (∂f/∂x,∂f/∂y)·u, siendo u un vector unitario que marca la dirección deseada.

Definir un vector de dirección. 

v:[1,2];

Hacer un vector unitario. Calcular la longitud:

modV:sqrt(v[1]^2+v[2]^2);

Por lo tanto, el vector unitario que buscamos:

u:v/modV;

Definimos las parciales de la función f.

define(fx(x,y), diff(f(x,y),x) );

define(fy(x,y), diff(f(x,y),y) );

La derivada direccional:

[fx(2,3),fy(2,3)].u;