Академический Документы
Профессиональный Документы
Культура Документы
Conceptos bsicos II
OBJETIVOS:
1. Aprender tcnicas de programacin bsicas.
35
36 UNIDAD 2. CONCEPTOS BSICOS II
Matlab tiene una lgica interna definida. As, cos es una funcin cuyo argumento habit-
ual es un escalar; pero si A es una matriz, cos(A) aplica la funcin a cada uno de los elementos
de A por separado y devuelve el resultado en un objeto de la mismas dimensiones que A. Lo
mismo ocurre con las funciones con dos argumentos (mod, rem, max(x,y), ...). Por ejemplo,
si A y B son dos matrices con igual dimensin , mod(A,B) proprociona una matriz
cuyo elemento es mod( ). A su vez, si A es una matriz y b un nmero, min(b,A)
devuelve una matriz con las dimensiones de A tal que su elemento es min( ).
2.1. FUNCIONES EN MATLAB 37
Puesto que la sintaxis de algunas funciones puede ser complicada, no debe invocarse una
funcin de manera extica sin saber las consecuencias. As, es mejor dominar pocas
instrucciones bsicas que conocer superficialmente muchas instrucciones. De hecho,
bastantes funciones son atajos de un conjunto de instrucciones fcilmente programables.
EJERCICIO 2.1.a
Trabajando en el script ejer21a.m:
1. Sea C = rand(1,5). Indique la clase y dimensin de las variables DC, SC, IC definidas
mediante las rdenes DC = diff(C); [SC,IC] = sort(C);
2. Sea ahora A = rand(5). Indique la clase y dimensin de las variables bot, top , inx
definidas mediante las rdenes bot = min(A) ; [top , inx] = max(A)
3. Muestre qu diferencia hay entre max(max(A)) y max(A(:)).
38 UNIDAD 2. CONCEPTOS BSICOS II
debemos escribir
lor =@(x,a) (a./pi)./(x.^2 + a.^2) ;
(el ; es opcional, claro). A partir de este momento, la funcin queda guardada en el espacio
de trabajo para su uso posterior, utilizndose como cualquier otra funcin intrnseca (en este
caso, con dos argumentos o inputs). De hecho, el escribir ./ y .^ nos permite en este ejemplo
que los argumentos de lor puedan ser matrices y/o escalares, siendo el resultado una matriz si
la operacin as resulta.
No hay que preocuparse por los smbolos que escojamos para definir las variables de una
funcin annima. Por ejemplo, aunque a sea ya una variable con un cierto valor, en la lnea
en la que se define la funcin annima a representa el segundo argumento de la funcin. As,
si tenemos
a = 3 ;
lor = @(x,a) (a./pi)./(x.^2 + a.^2) ;
hlo = @(x) (a./pi)./(x.^2 + a.^2) ;
la funcin lor es la que hemos definido anteriormente, pero hlo() = (3)(2 + 9).
Adems, como las funciones annimas se guardan en el espacio de trabajo como si fueran
variables, aunque luego borremos la variable a no pasar nada con la funcin hlo. As, para
borrar la funcin annima nomfun basta con la orden clear nomfun. Obviamente, si sobre-
scribimos nomfun, la funcin original desaparece.
EJERCICIO 2.1.b
Trabajando en el script ejer21b.m, defina una funcin annima, fano21b, con dos argumentos,
x e y, tal que el resultado sea la matriz
!
x y x y
x + y xy
Investigue cul es el resultado de la funcin si los argumentos son dos matrices 2 3.
2.1. FUNCIONES EN MATLAB 39
Una ventaja de las funciones annimas es que nos permiten representar grficamente fun-
ciones matemticas sin necesidad de crear explcitamente un array para los valores de la
funcin. Por ejemplo, si queremos representar en la misma figura las funciones gaussianas
3 exp(32 2 ) y exp(2 ) en el intervalo [3 3] podramos escribir este script:
close all
X = -3:0.01:3 ;
spi = sqrt(pi) ;
fungau = @(x,a) (a.*exp(-(a.*x).^2)./spi) ;
figure(1)
hold on
title(Funciones gaussianas) ;
plot(X,fungau(X,3),X,fungau(X,1))
legend(alpha = 3,alpha = 1) ;
que es completamente equivalente a
close all
X = -3:0.01:3 ;
spi = sqrt(pi) ;
a = 3 ;
F3 = (a.*exp(-(a.*X).^2)./spi) ;
a = 1 ;
F1 = (a.*exp(-(a.*X).^2)./spi) ;
figure(1)
hold on
title(Funciones gaussianas) ;
plot(X,F3,X,F1)
legend(alpha = 3,alpha = 1) ;
La diferencia conceptual radica en que fungau es una funcin, cuyos argumentos son nmeros
reales arbitrarios mientras que F1 y F3 son vectores fila, cuyo argumento es un nmero
natural: el valor del ndice.
Que Matlab trate las funciones annimas como si fueran variables puede parecer absurdo,
pero permite que una funcin annima pueda ser el input de otra funcin. Por ejemplo, la
funcin annima cuadfun con dos argumentos definida como
cuadfun =@(fun,x) fun(x).^2 ;
proporciona el valor de fun2 (), siempre y cuando fun sea una funcin con un argumento. As,
cuadfun(hlo,2) y hlo(2).^2 son rdenes equivalentes. En este sentido, para que una funcin
intrnseca sea el input de otra funcin debemos anteponer @ al nombre de la funcin intrnseca.
As, cuadfun(@sin,pi/6) da como resultado sin2 (6) = 0.25.
40 UNIDAD 2. CONCEPTOS BSICOS II
EJERCICIO 2.1.c
Trabajando en el script ejer21c.m:
1. Construya la funcin annima de sintaxis trapecdx(G,dx), donde G es un array de
elementos y dx un escalar, tal que
!
X 1 +
trapecdx(G dx) =
=1
2
siendo el -simo elemento del array G. Esta funcin de script proporcionar entonces la
integral numrica por el mtodo de trapecios de una funcin () sobre un intervalo [ ],
siendo G el array que contiene los valores de () correspondientes a una discretizacin
de puntos equiespaciados del intervalo [ ] con equiespaciado .
2. Muestre en pantalla el valor de la integral
Z +5
1
exp(2 )
5
suponiendo = 11, = 101, = 1001, y = 10001.
A () = det (A I)
donde I es la matriz unidad . No es difcil ver que tal funcin es un polinomio de grado
, de ah el nombre. Trabajando en el script ejer21d.m:
1. Construya la funcin annima de sintaxis polcar(A,x) que proporcione el valor del poli-
nomio caracterstico A () en funcin del valor de x. Sugerencia: la matriz unidad
se puede construir mediante la orden diag(ones(1,N)).
2. Sea la matriz B = magic(3). Represente su polinomio caracterstico en el intervalo
[10 20]. Compruebe que B () tiene tres ceros, que se denominan valores propios o
autovalores de la matriz.
Las funciones annimas tienen una utilidad muy concreta: nos sirven simplemente para
redefinir el nombre de una instruccin ms compleja pero, al quedar almacenada en el es-
pacio de trabajo (workspace), la funcin annima desaparece bien al borrar los contenidos
del workspace (clear all) o bien al salir de Matlab (exit). Mucho ms potentes son las
funciones de usuario externas, que tienen las mismas funcionalidades y propiedades que una
funcin intrnseca de Matlab.
2.1. FUNCIONES EN MATLAB 41
[out1,out2,....,outN] = myfunc(inp1,inp2,...,inpM) ;
donde myfunc es el nombre de la funcin; out1,...,outN son las variables en las que se
almacenarn los outputs de la funcin; mientras que inp1,...,impM son los valores de las
variables que sirven de input de la funcin. Vemos as que las funciones externas funcionan
exactamente igual que la funciones intrnsecas, a diferencia de las funciones annimas que
nicamente proporcionan un output resultado de una nica operacin.
Las instrucciones que se realizan al ejecutar la funcin myfunc se encontarn en un fichero
myfunc.m cuya estructura es obligatoriamente la siguiente
% Comentarios generales (tantas lineas como se desee)
% Estos comentarios generales aparecen al teclar: help myfunc
function [out1,out2,...,outN] = myfunc(inp1,inp2,...,inpM)
end
Al igual que ocurra en la definicin de una funcin annima, las etiquetas que usemos en el
fichero myfunc.m son irrelevantes. Adems, las operaciones que realiza la funcin de script
no se ven reflejadas en el espacio de trabajo. Esto es, si dentro del conjunto de instrucciones
creamos nuevas variables estas quedarn ocultas y no interferirn con las ya existentes.
Consideremos la integracin numrica de cos() entre 0 y 2 mediante los mtodos del trapecio
y de Simpson con una discretizacin de puntos, siendo = 3 5 7 1001. Represente en
escala logartmica (de base 10) los valores absolutos del error cometido en cada mtodo frente
a y discuta el resultado. Sugerencia: use la orden loglog.
2.1. FUNCIONES EN MATLAB 43
Pensemos ahora en una funcin () definida en el intervalo [ ] pero con una discretizacin
de [ ] no equiespaciada. Sea X el array que contiene los valores discretizados de [ ] (nat-
uralmente, X(1) = a, X(end) = b) y G el array que contiene los valores correspondientes de
la funcin . Una manera sencilla (aunque mejorable) de evaluar numricamente la derivada
de es calcular 0 () por la derecha, 0 () por la izquierda, y promediar las derivadas por la
izquierda y la derecha para el resto de los valores de la variable independiente. La siguiente
funcin de script, derivada.m, cumple esta labor:1
% ==========================================================================
% function derivada()
% Derivada numerica de una funcion previamente discretizada
% Uso: DG = derivada(G,X)
% Inputs:
% X: Array fila con los valores de la variable independiente
% G: Matriz con los valores de la funcion
% Output:
% DG: Matriz con los valores de la derivada
% ==========================================================================
function DG = derivada(G,X)
N = numel(X) ; % Numero de puntos
DG = 0.*G ; % Prealocacion
DG(:,1) = (G(:,2)-G(:,1))./(X(2)-X(1)) ; % Derivada en X(1) por la der.
DG(:,N) = (G(:,N)-G(:,N-1))./(X(N)-X(N-1)) ; % Derivada en X(N) por la izq.
for k=2:(N-1)
dizq = (G(:,k)-G(:,k-1))./(X(k)-X(k-1)) ; % Derivada por la izquierda
dder = (G(:,k+1)-G(:,k))./(X(k+1)-X(k)) ; % Derivada por la derecha
DG(:,k) = (dizq+dder)./2 ; % Promedio de las derivadas
end
end
Ntese que si G es un array fila, G(:,k) y G(k) es exactamente lo mismo. Ahora bien, por
qu cree que hemos escrito G(:,k)?
1
Tambin servira (ntense los usos de diff y de ./, nada triviales):
function DG = derivada(G,X)
N = numel(X) ;
DG = 0.*G ; % Prealocacion
CCF = diff(G,[],2)./diff(X) ;
DG(:,1) = CCF(:,1) ;
DG(:,N) = CCF(:,N-1) ;
DG(:,2:N-1) = (CCF(:,1:N-2)+CCF(:,2:N-1))./2 ;
end
44 UNIDAD 2. CONCEPTOS BSICOS II
EJERCICIO 2.1.f
Consideremos el intervalo [0 10] discretizado en el array de 101 elementos
X = [0,logspace(-4,1,100)] ; % Notese la construccin
y la funcin gaussiana () = 12 exp(2 ). Trabajando en el script ejer21f.m y usando
las funciones externas derivada.m y primitiva.m, obtenga la derivada, 0 (), y la primitiva,
G(), de la funcin () en el intervalo [0 10]. Represente grficamente las funciones (),
0 (), y G() en una misma figura.
% ===================================================================
% function derivasdx()
% 1a y 2a derivadas de una funcion previamente discretizada
% Se presupone una discretizacion equiespaciada de la variable indep.
% Uso : [D1F,D2F] = derivasdx(F,dx)
% Inputs:
% F : Matriz que contiene los valores de la funcion.
% dx : espaciado entre los valores de la variable independiente
% Outputs:
% D1F : Matriz con los valores de la primera derivada
% D2F : Matriz con los valores de la segunda derivada
% ===================================================================
function [D1F,D2F] = derivasdx(F,dx)
[D,N] = size(F) ; % N: numero de puntos, D: componentes de F
tdx = 2*dx ; % Doble del espaciado
sdx = dx*dx ; % Cuadrado del espaciado
D1F = 0.*F ; D2F = 0.*F ; % Prealocaciones
for k = 2:N-1
D1F(:,k) = (F(:,k+1)-F(:,k-1))./tdx ; % 1a derivada
D2F(:,k) = (F(:,k+1)+F(:,k-1)-2*F(:,k))./sdx ; % 2a derivada
end
D1F(:,1) = (4.*F(:,2)-F(:,3)-3.*F(:,1))./tdx ; % 1a der. en X(1)
D2F(:,1) = D2F(:,2) ; % 2a der. en X(1)
D1F(:,N) = (3.*F(:,N)+F(:,N-2)-4.*F(:,N-1))./tdx ; % 1a der. en X(N)
D2F(:,N) = D2F(:,N-1) ; % 2a der. en X(N)
end
y el clculo de las funciones primitivas se puede hacer usando, por ejemplo, una integracin por
trapecios.
Si la discretizacin temporal es equiespaciada, el parmetro crtico de convergencia es
el paso de tiempo . Evidentemente, cuanto menor sea menor el error en los clculos. Ahora
bien, hay que tener cuidado ya que mientras un valor grande de nos puede dar un resultado
mal convergido, un valor excesivamente pequeo de puede resultan en un desperdicio de
tiempo de clculo. El siguiente ejercicio ilustra el procedimiento.
donde , , son constantes con las dimensiones fsicas adecuadas. En el instante inicial
(in = 0) la partcula se encuentra en el origen de coordenadas y su velocidad en ese instante
es (in ) = in + in .
1. Represente en funcin del tiempo las componentes de la aceleracin en el intervalo [in fin ]
2. Obtenga numricamente y represente en funcin del tiempo las componentes de la veloci-
dad en el mismo intervalo temporal.
3. Obtenga numricamente y represente en funcin del tiempo las componentes de la posicin
en el mismo intervalo temporal. Muestre el valor de la posicin cuando = fin .
4. Represente la trayectoria de la partcula en el intervalo [in fin ]
donde hemos usado que () = () y que 0. Por otro lado, el trabajo efectuado por
la fuerza que acta sobre la partcula entre los instantes in y fin es
Z fin Z fin h i Z fin
=
() () =
() () = [() ()] (2.7)
in in in
P() = () () = () () (2.8)
EJERCICIO 2.2.b
Desde el borde de la azotea de un edificio de altura = 1962 m lanzamos horizontalmente
en el instante = 0 una piedra de masa = 500 g con velocidad in = 5 ms1 . Sea
la direccin horizontal y la vertical (sentido positivo hacia arriba). La aceleracin de la
partcula es, entonces, = , con = 981 ms2 . Nuestro objetivo en este problema es
analizar numricamente el movimiento de la partcula en el intervalo temporal [0 fin ] s, con
fin = 2 s. Trabajando en el script ejer22b.m:
Al integrar mediante el mtodo de trapecios las ecuaciones del movimiento lo que estamos
haciendo es lo siguiente. Supongamos que el intervalo temporal [in fin ] est discretizado en el
array [1 2 ] (obviamente 1 = in y = fin ), y sean , y la posicin, velocidad,
y aceleracin en el instante , respectivamente. Entonces, conocidas la posicin, velocidad, y
aceleracin en el instante y la aceleracin en el instante +1 , la posicin y la velocidad en el
instante +1 estn dadas por
+ +1 + +1
+1 ' + (+1 ) ; +1 ' + (+1 ) (2.9)
2 2
El problema es que muchas veces (de hecho, en la mayora) no conocemos el valor de la acel-
eracin en el instante +1 (por ejemplo, si la fuerza depende de la posicin o si existe una
fuerza de rozamiento dependiente de la velocidad). En otras palabras, el mtodo que acabamos
de ver no sirve si la aceleracin est dada por una funcin ( ).
Una primera manera de solventar el problema es efectuar una integracin de las ecuaciones
del movimiento suponiendo que en el intervalo temporal ( +1 ) el movimiento de la partcula
es uniformemente acelerado con aceleracin = ( ), esto es
1
+1 ' + (+1 ) ; +1 ' + (+1 ) + (+1 )2 (2.10)
2
Podemos anticipar que esta no es una manera ptima de integrar ecuaciones del movimiento y,
de hecho, en la Unidad 5 veremos mtodos ms depurados para abordar este tipo de situaciones.
Sin embargo, lo interesante de la aproximacin (2.10) es que nos permite obtener el estado
dinmico de la partcula en un instante dado a partir de sus propiedades exclusivamente en un
tiempo anterior.
) = c
( ) () = c
3 ( (2.11)
| | | |
X
X
) =
( c (
) (
) = c (2.12)
3
=1
|
| =1
|
|
Por otro lado, la energa electrosttica del conjunto de cargas puntuales est dada por
!
X X 1X
el = c = c (2.13)
=2 =1
|
| 2 6=
|
|
Fsicamente, el es el trabajo necesario para situar las cargas en sus posiciones respectivas
suponiendo que inicialmente estn separadas entre s una distancia infinita.
EJERCICIO 2.2.d
Consideremos un sistema de cargas 1 2 situadas en los puntos 1 2 . Imag-
inemos que los valores de las cargas estn almacenadas en el array fila Q (esto es, Q(n) = ),
mientras que las coordenadas de los puntos estn almacenadas en la matriz 3 RQ (es decir,
RQ(:,n) es el vector columna que contiene las coordenadas del punto ). De acuerdo con este
convenio:
Por defecto, los ficheros *.mat son binarios, esto es, no es trivial editarlos a mano y a
priori estn restringidos a Matlab. Sin embargo, la orden save nos permite tambin guardar
valores de variables en un fichero de texto ascii, esto es, editable. Ello se hace aadiendo la
opcin -ascii al comando save. A su vez, con load se pueden almacenar en una variable
los datos numricos de un fichero ascii pero con una funcionalidad mucho ms limitada que la
correspondiente al modo binario. As:
save -ascii nomfich.dat v1 v2 ... % Guarda secuencialmente los valores de v1,v2,...
% en el fichero ascii nomfich.dat
load -ascii nomfich.dat % Genera la variable nomfich cuyo valor son los contenidos
% del fichero nomfich.dat