Prácticas de Matemática Aplicada

Anuncio
atan(x) arco tangente
sinh(x) seno hiperbólico
cosh(x) coseno hiperbólico
tanh(x) tangente hiperbólica
asinh(x) arco seno hiperbólico
acosh(x) arco coseno hiperbólico
atanh(x) arco tangente hiperbólica
log(x) logaritmo natural
log10(x) logaritmo decimal
exp(x) función exponencial
sqrt(x) raíz cuadrada
sign(x) devuelve -1 si <0, 0 si =0 y 1 si >0
rem(x,y) resto de la división (2 argumentos que no tienen que ser enteros)
round(x) redondeo hacia el entero más próximo
floor(x) valor entero más próximo hacia parte entera)
abs(x) valor absoluto.
Prácticas de Matemática Aplicada
En la práctica de hoy estudiaremos (algunas de ) las posibilidades de cálculo
numérico y representación gráfica con MATLAB. Para transformar y evaluar
numéricamente un conjunto de datos los organizaremos cómo vectores. El cálculo
matricial es uno de los puntos fuertes de este programa.
OPERACIONES BÁSICAS CON MATRICES Y VECTORES
Los operadores matriciales de MATLAB son los siguientes:
+ adición o suma
– sustracción o resta
.* producto elemento a elemento
y ./división elemento a elemento
.^ elevar a una potencia elemento a elemento
Con el fin de familiarizarse con este tipo de notación, se puede probar la siguiente
secuencia de instrucciones en MATLAB observando detenidamente los
resultados:
>> v= [1 2 3]
>> w= [-1 0 3]
>> a=v.*w
>> v.^2
>> w./v
>> v./w
En MATLAB los números reales son almacenados en 8 bytes. Es importante saber
cómo trabaja MATLAB con estos números y los casos especiales que presentan.
MATLAB mantiene una forma especial para los números muy grandes (más
grandes que los que es capaz de representar), que son considerados como infinito.
Por ejemplo, obsérvese cómo responde el programa al ejecutar el siguiente
comando:
» 1.0/0.0
Warning: Divide by zero
ans =
Inf
Así pues, para MATLAB el infinito se representa como inf ó Inf. MATLAB tiene
también una representación especial para los resultados que no están definidos
como números. Por ejemplo, ejecútense los siguientes comandos y obsérvense las
respuestas obtenidas:
» 0/0
Warning: Divide by zero
ans =
NaN
» inf/inf
ans =
NaN
Notar que hemos intentado dividir por cero y por eso MATLAB nos da un error.
FUNCIONES MATEMÁTICAS ELEMENTALES QUE OPERAN DE
MODO ESCALAR (componente a componente)
Estas funciones, que comprenden las funciones matemáticas trascendentales y
otras funciones básicas, actúan sobre cada elemento de la matriz como si se tratase
de un escalar. Se aplican de la misma forma a escalares, vectores y matrices.
Algunas de las funciones de este grupo son las siguientes:
sin(x) seno
cos(x) coseno
tan(x) tangente
asin(x) arco seno
acos(x) arco coseno
1
En ambos casos la respuesta es NaN, que es la abreviatura de Not a Number. Este
tipo de respuesta, así como la de Inf, son enormemente importantes en MATLAB,
pues permiten controlar la fiabilidad de los resultados de los cálculos matriciales.
Los NaN se propagan al realizar con ellos cualquier operación aritmética, en el
sentido de que, por ejemplo, cualquier número sumado a un NaN da otro NaN.
MATLAB tiene esto en cuenta. Algo parecido sucede con los Inf.
GRÁFICAS
GRÁFICOS BIDIMENSIONALES
Los gráficos 2-D de MATLAB están fundamentalmente orientados a la
representación gráfica de vectores (y matrices). En el caso más sencillo los
argumentos básicos de la función plot van a ser vectores.
Cuando una matriz aparezca como argumento, se considerará como un conjunto de
vectores columna (en algunos casos también de vectores fila).
FORMATOS NUMÉRICOS
Matlab trabaja com más digitos de los que vemos normalmente en pantalla.
La constante se obtiene en MATLAB con
>> pi
probamos ahora a cambiar el formato
>>format long
>> pi
Funciones gráficas 2D elementales
MATLAB dispone de cuatro funciones básicas para crear gráficos 2-D. Estas
funciones se diferencian principalmente por el tipo de escala que utilizan en los
ejes de abscisas y de ordenadas. Estas cuatro funciones son las siguientes:
plot() crea un gráfico a partir de vectores y/o columnas de matrices, con escalas
lineales sobre ambos ejes.
loglog() ídem con escala logarítmica en ambos ejes
semilogx() ídem con escala lineal en el eje de ordenadas y logarítmica en el eje de
abscisas
semilogy() ídem con escala lineal en el eje de abscisas y logarítmica en el eje de
ordenadas
Podemos volver al formato original con
>>format
EL OPERADOR DOS PUNTOS (:)
El operador dos puntos (:) realiza en MATLAB dos funciones distintas:
Por una parte permite definir secuencias de números igualmente espaciados
(progresión aritmética). Por otra permite hacer referencia a todos los elementos de
una fila o una columna de una matriz, pero no estudiaremos esta última.
Funciónes PLOT y FPLOT
Plot es la función clave de todos los gráficos 2-D en MATLAB. Ya se ha dicho
que el elemento básico de los gráficos bidimensionales es el vector. La función
plot(), en sus diversas variantes, no hace otra cosa que dibujar vectores.
Generación de secuencias de números.
Es posible generar mediante MATLAB una progresión aritmética de una forma
sencilla (sin utilizar la función linspace()). Por ejemplo, para generar la secuencia
[1 3 5 7 9 11 13 15 1
basta con escribir en MATLAB
>> 1:2:17
que tiene el siguiente significado general: límite inferior:espaciado:límite
superior. En el caso en que el espaciado sea 1 se puede omitir. Así para generar la
secuencia [-1 0 1 2 3 4 5 6 7 8 puede hacerse
>> -1:1:9
o bien
>> -1:9
Una forma de utilizar la función plot() es con dos vectores como argumentos. En
este caso los elementos del segundo vector se representan en ordenadas frente a
los valores del primero, que se representan en abscisas. Véase por ejemplo cómo
se puede dibujar un cuadrilátero de esta forma (obsérvese que para dibujar un
polígono cerrado el último punto debe coincidir con el primero):
>> x=[1 6 5 2 1]; y=[1 0 4 3 1];
>> plot(x,y)
En realidad, el conjunto básico de argumentos de la función plot es una tripleta
formada por dos vectores y una cadena de de caracteres que indica el color y el
tipo de marcadores para los puntos y el tipo de línea.
Por ejemplo:
2
>> x=[1 6 5 2 1]; y=[1 0 4 3 1];
>> plot(x,y,’r-o’) dará como resultado el cuadrilátero en color rojo y los
vértices señalados con círculos. En las siguientes columnas se pueden observar
distintas posibilidades.
y
yellow
. point
- solid
m
magenta
o circle
: dotted
c
cyan
x x-mark
-. dashdot
r
red
+ plus
-- dashed
g
green
* star
b blue
s
square
w white
d diamond
k
black
v triangle(down) ^ triangle(up)
<
triangle(left) > triangle (right)
p
pentagram
h hexagram
Ver el resultado de
>> fplot('sin(x)',[0 2*pi -1 1])
>> fplot('sin(x)',[0 2*pi -2 2])
Dibujo de curvas en paramétricas
Para dibujar la elipse c(t)=(2cost, 3sint), o<t<2pi, escribimos
» t=0:.1:2*pi;
x=2*cos(t);
y=3*sin(t);
plot(x,y)
Dibujo de curvas en polares
Para dibujar una gráfica en coordenadas polares se usa el comando
polar(theta, rho). Theta es el ángulo en radianes y rho la distancia al origen.
Ejemplo: mediante
>> t=linspace(0, 2*pi, 40)
>> r=linspace(2, 2, 40)
>> polar(t, r)
se obtiene una circunferencia de radio 2.
La función plot() permite también dibujar múltiples curvas introduciendo varias
parejas de vectores como argumentos. En este caso, cada uno de los segundos
vectores se dibujan en ordenadas como función de los valores del primer vector de
la pareja, que se representan en abscisas. Si el usuario no decide otra cosa, para
las sucesivas líneas se utilizan colores que son permutaciones cíclicas del azul,
verde, rojo, cyan, magenta, amarillo y negro. Obsérvese bien cómo se dibujan el
seno y el coseno en el siguiente ejemplo:
>> x=0:pi/25:6*pi;
>> y=sin(x); z=cos(x);
>> plot(x,y,x,z) y como podemos variar el aspecto con
>> plot(x,y,’co’,x,z,’m:’)
El comando fplot( ‘fun’, [min,max]) proporciona un modo directo de dibujar la
gáfica de una función. El primer argumento hace referencia a la función y el
segundo al control de los ejes. Así se obtiene la gráfica de la función fun que se
introduce como primer argumento, en el intervalo del eje x que se indica como
segundo argumento.
Ejemplo:
Mediante
>> fplot('sin(x)’,[0 2*pi])
Se obtiene la gráfica de la función seno en el intervalo [0 2*pi]
Ejemplo:
Ver el resultado de
>> t=linspace(0, 2*pi, 100)
>> r=2+3*sin(t);
>> polar(t,r)
Control de los ejes
También en este punto MATLAB tiene sus opciones por defecto, que en algunas
ocasiones puede interesar cambiar. El comando básico es el comando axis. Por
defecto, MATLAB ajusta la escala de cada uno de los ejes de modo que varíe
entre el mínimo y el máximo valor de los vectores a representar. Este es el
llamado modo "auto", o modo automático. Para definir de modo explícito los
valores máximo y mínimo según cada eje, se utiliza el comando: axis([xmin,
xmax, ymin, ymax]) mientras que : axis(’auto’) devuelve el escalado de los ejes
al valor por defecto o automático.
Si se desea el control de ambos ejes el segundo argumento será de la forma [xmin,
xmax, ymin, ymax].
Ejemplo:
3
Existen además otras funciones orientadas a añadir títulos al gráfico, a cada uno de
los ejes, a dibujar una cuadrícula auxiliar, a introducir texto, etc. Estas funciones
son las siguientes:
title('título') añade un título al dibujo xlabel('tal') añade una etiqueta al eje de
abscisas. Con xlabel off desaparece ylabel('cual') añade una etiqueta al eje de
ordenadas. Con ylabel off desaparece text(x,y,'texto') introduce 'texto' en el lugar
especificado por las coordenadas x e y. Si x e y son vectores, el texto se repite por
cada par de elementos. gtext('texto') introduce texto con ayuda del ratón: el cursor
cambia de forma y se espera un clic para introducir el texto en esa posición. Con
grid se activa la inclusión de una cuadrícula en el dibujo. Con grid off desaparece
la cuadrícula Para ver el funcionamiento de la función grid, se comenzará creando
un par de vectores x e y con los que trabajar:
>> x=[-10:0.2:10]; y=sin(x); Ahora se deben ejecutar los comandos
siguientes (se comienza cerrando la ventana activa, para que al crear la nueva
ventana aparezca en primer plano):
>> title('Función seno(x) -en rojo- y función coseno(x)
-en verde-')
>> xlabel('ángulo en radianes'), figure(gcf)
>> ylabel('valor de la función trigonométrica'),
figure(gcf)
>> axis([-12,12,-1.5,1.5]), figure(gcf)
>> close
>> grid
>> plot(x,y)
Se puede observar la diferencia con la secuencia que sigue:
>> close
>> plot(x,y)
>> grid
fzero('fun',x0) encuentra un cero de fun próximo al valor x introducido. El
argumento fun es una función de las que dispone MATLAB u otra definida
previamente por el usuario. El argumento x0 puede ser un número o un vector con
dos coordenadas. Si x0 es un vector con dos coordenadas, fzero('fun', x0) supone
que las coordenadas de x0 son los extremos de un intervalo donde la función
cambia de signo (recordar que si la función es copntínua por el teorema de
Bolzano existe al menos una raíz). Si x0 es un número, fzero('fun', x0) usa dicho
número como una primera estimación del cero y busca un intervalo que lo
contenga donde la función cambie de signo. En cualquier caso x0, se puede
encontrar, por ejemplo, dibujando la función.
RESOLUCIÓN DE ECUACIONES ALGEBRÁICAS
Para calcular las raíces de ecuaciones MATLAB dispone de la función fzero
Se trata de una función de función. Su objetivo es obtener un valor donde una
determinada función no simplemente se anula sino que corta el eje x. ( un cero) Se
trata siempre de una función de una variable. La sintaxis es la siguiente:
En el primer caso MATLAB ha creado la cuadrícula en una ventana nueva y luego
la ha borrado al ejecutar la función plot. En el segundo caso, primero ha dibujado
la función y luego ha añadido la cuadrícula. Esto es así porque hay funciones
como plot que por defecto crean una nueva figura, y otras funciones como grid
que se aplican a la ventana activa modificándola, y sólo crean una ventana nueva
cuando no existe ninguna ya creada.
fzero('fun',x,tol). Los dos primeros argumentos son los mismos que en el caso
anterior. El tercer argumento sirve para fijar el máximo error permitido en la
estimación. Si no se introduce este último argumento, automáticamente
fzero('fun',x) interpreta que es eps.
Para practicar un poco con todo lo que se acaba de explicar, ejecútense las
siguientes instrucciones de MATLAB, observando con cuidado los efectos de cada
una de ellas en la ventana activa. El comando figure(gcf) (get current figure) hace
visible la ventana de gráficos desde la ventana de comandos.
Observación. La sentencia fzero('abs(x)+1', 1) no emite respuesta ya
que no es posible encontrar un intervalo que contenga al 1, donde la función
cambia de signo.
El comando fzero es un fichero .m. El algoritmo fue diseñado por T. Dekker y
usa una combinación del método de bisección, del método de la secante y métodos
de interpolación cuadrática inversa.
>> x=[-4*pi:pi/20:4*pi];
>> plot(x,sin(x),'r',x,cos(x),'g')
4
Limitaciones de fzero. No sirve para encontrar posibles valores donde la función
se anula sin cambiar de signo.
function y=f(x)
y=1./(x.^3-2*x-5);
y despues lo guardaremos en nuestra partición de disco en la carpeta
matapl con el nombre ejint.m
Y ejecutamos:
Veamos algún ejemplo. Queremos encontrar una aproximación a un cero del
polinomio x5-2x2-6x+2. Para ello en primer lugar dibujaremos la gráfica
usando
>>fplot('x.^5-2*x.^2-6*x+2',[-5,5])
y como observamos que 0.5 está cerca del cero podemos usar ahora:
>>fzero('x.^5-2*x.^2-6*x+2',0.5)
o también podríamos usar
>>fzero('x.^5-2*x.^2-6*x+2',[0,1])
ya que la función cambia de signo en ese intervalo.
>>Q = quad('ejint',0,2)
para obrener el resultado de la cuadratura
ans=
-0.4605
RESOLUCIÓN NUMÉRICA DE ECUACIONES DIFERENCIALES
INTEGRACIÓN NUMÉRICA
Veamos cómo utilizar MATLAB para resolver numéricamente ecuaciones
diferenciales. Esto nos será útil especialmente para aquellas ecuaciones que no
podamos tratar con pplane o dfield.
En inglés, al cálculo numérico de integrales definidas se le llama quadrature.
Sabiendo eso, no resulta extraño que la función de MATLAB para evaluar
numéricamente una integral definida se llame quad. La función quad evalúa
numéricamente la integral usando el método adaptativo de integración de
Simpson. La sintaxis de la función quad admite algunas variantes:
>>[T,Y] = ode45(odefun,tspan,y0)
Donde odefun es un mfile que contiene la ecuación diferencial, tspan son los
valores de tiempo entre los que dibujaremos las soluciones e y0 son las
condiciones iniciales. Tambien podemos cambiar la tolerancia pero no lo veremos
ahora. Resolver un ejemplo de sistema de ecuaciones
quad('fun',a,b)
y1 '  y 2 y3
y1 (0)  0
y 2 '   y1 y3
y 2 (0)  1
y3 '  0.51y1 y 2 y3 (0)  1
Obtiene el valor de la integral de la función con nombre ‘fun’ (ha de existir un
fichero fun.m) entre a y b (la tolerancia o máximo error permitido es 10 –6 )
quad('fun',a,b,tol)
Lo mismo que en el caso anterior pero fijando la tolerancia
Para resolver este sistema primero creamos un fichero con las ecuaciones:
>> edit
function dy = sistema(t,y)
dy = zeros(3,1);
% un vector columna
dy(1) = y(2) * y(3);
dy(2) = -y(1) * y(3);
dy(3) = -0.51 * y(1) * y(2);
Ejemplo. Para obtener una aproximanción de la integral de
2
x
0
3
dx
 2x  5
en primer lugar construiremos un m-file
con el comando:
y lo guardamos como ejeqdif.m
>> edit
invocamos al editor. En el m-file escribiremos:
resolvemos ahora el sistema con:
5
>>[T,Y] = ode45('ejeqdif',[0 12],[0 1 1 ] );
>>plot(T,Y(:,1),'-r',T,Y(:,2),'-.b',T,Y(:,3),'.m')
Ejercicios. 
1.
a)
b)
c)
2.
3.
Dibujar las siguientes funciones usando fplot:
1/(1+x2) en el intervalo [-5, 5],
sin(x)/x en el intervalo (-pi, pi).
Representar en una misma gráfica los polinomios x2, x3+x2+x+1 y x5-5x3+4x
utilizando plot. Delimitar adecuadamente los ejes para mejorar la gráfica si es
necesario.
Encontrar una aproximación para la raíz de 2cos(x)=x. Para ello en primer
lugar dibujaremos la gráfica de 2cos(x)-x y nos servirá para encontrar un
punto de partida, o un intervalo donde la función cambia de signo.
Aproximar numéricamente las siguientes integrales indefinidas. Notar que no
se pueden resolver con métodos elementales.
1
4.
a)
e
2
 x2
dx
b)
1
5.
 cos( x
2
) dx
0
Resolver las ode’s para una poblacion con crecimiento exponencial y logístico
y si inicialmente contamos con 100 unidades. (estudiar con dfield y con ode45
para distintos valores de los parámetros k, r y b)
y'  kx
y'  r (1  y / b) y
6
Descargar