Documentos de Académico
Documentos de Profesional
Documentos de Cultura
14
Curso 2013-
comandos,
tipos
de
variables,
funciones
Las siguientes rdenes pueden serte tiles para el desarrollo de esta prctica:
help: Te ofrece ayuda sobre una funcin, incluyendo algn ejemplo sobre su uso
y otras funciones relacionadas. Por ejemplo, teclea >>help clc
lookfor: Lista todas las funciones en cuya ayuda aparece una palabra clave. Por
ejemplo, si quisiramos saber qu funciones tiene Matlab para manipular
directorios podramos teclear >>lookfor directory y a continuacin teclear
>>help pwd, >>help dir, etc. para saber cmo funciona cualquier funcin que
nos interese.
1. Haciendo uso del comando HELP puedes saber las funciones de los comandos
diary, who, clear, hold, format y edit. Qu diferencia existe entre los comando
edit y type?.
Las siguientes rdenes son interesantes para poder conocer los operadores definidos
en Matlab. Algunos de ellos los vas a utilizar frecuentemente, sera til que grabaras la
informacin que tienes como respuesta.
(a)help \
>> help \
Operadores y carcteres especiales
Operadores aritmticos
plus
- Plus
+
uplus
- Unary plus
+
minus
- Minus
uminus - Unary minus
mtimes - Matrix multiply
*
times
- Array multiply
.*
mpower - Matrix power
^
power
- Array power
.^
mldivide - barra invertida o dividir matriz de la izquierda \
mrdivide - (Raya vertical o dividir la matriz derecha ) Slash or right matrix divide
ldivide - Left array divide
.\
rdivide - Right array divide
./
kron
- Kronecker tensor product
kron
Operadores relaciones
eq
- Igual
ne
- No igual
lt
- menor que
gt
- mayor que
le
- menor que o igual
ge
- mayor que o igual
==
~=
<
>
<=
>=
(b)help arith.
>> help arith
Los operadores aritmticos.(Arithmetic operators)
+ Plus.
X + Y aade matrices X e Y. X e Y deben tener el mismo
dimensiones que el que no un escalar (una matriz de 1 por 1).
Un escalar se puede aadir a cualquier cosa.
+ Plus.
X + Y adds matrices X and Y. X and Y must have the same
dimensions unless one is a scalar (a 1-by-1 matrix).
A scalar can be added to anything.
- Menos.
X - Y resta matriz X de Y. X e Y debe tener el mismo
dimensiones que el que no un escalar. A escalar se puede restar
de nada.
- Minus.
X - Y subtracts matrix X from Y. X and Y must have the same
dimensions unless one is a scalar. A scalar can be subtracted
from anything.
* La multiplicacin de matrices.
X * Y es el producto de la matriz de X e Y. Un escalar (una matriz de 1 por 1)
puede multiplicar cualquier cosa. De lo contrario, el nmero de columnas de X debe
ser igual al nmero de filas de Y.
* Matrix multiplication.
X*Y is the matrix product of X and Y. Any scalar (a 1-by-1 matrix)
may multiply anything. Otherwise, the number of columns of X must
equal the number of rows of Y.
. * Matriz de multiplicacin
X. * Y denota multiplicacin elemento a elemento. X e Y
debe tener las mismas dimensiones a menos que uno sea un escalar.
A escalar se puede multiplicar por todo.
* Array multiplication
X.*Y denotes element-by-element multiplication. X and Y
must have the same dimensions unless one is a scalar.
A scalar can be multiplied into anything.
^ Poder Matrix.
Z = X ^ y X es elevado a y, si y es un escalar y X es cuadrada. Si y es un
nmero entero mayor que uno, la potencia se calcula mediante la repetida
multiplicacin. Para otros valores de y el clculo
implica valores y vectores propios.
Z = x ^ Y es x a la potencia Y, si Y es una matriz cuadrada y x es un escalar,
se calcula usando valores propios y vectores propios.
Z = X ^ Y, donde X e Y son matrices, es un error.
^ Matrix power.
Z = X^y is X to the y power if y is a scalar and X is square. If y is an
integer greater than one, the power is computed by repeated
multiplication. For other values of y the calculation
involves eigenvalues and eigenvectors.
Z = x^Y is x to the Y power, if Y is a square matrix and x is a scalar,
computed using eigenvalues and eigenvectors.
Z = X^Y, where both X and Y are matrices, is an error.
. ^ Potencia matriz.
Z = X ^ Y denota la operacin elemento por elemento. X e Y
deben tener las mismas dimensiones a menos que uno sea un escalar.
Un escalar puede operar cualquier cosa.
.
^ Array power.
Z = X.^Y denotes element-by-element powers. X and Y
must have the same dimensions unless one is a scalar.
A scalar can operate into anything.
(d)help relop.
>> help relop
Relational operators.
< > Operadores relacionales.
Los seis operadores relacionales son <, < = ,>, > =, == y ~ = .
A <B hace comparaciones elemento por elemento entre A y B
y devuelve una matriz del mismo tamao con los elementos establecidos en lgica
1 (verdad ) si la relacin es verdadera y los elementos establece en 0 lgico
(mentira) donde no lo es. A y B deben tener las mismas dimensiones
(o uno puede ser un escalar ) .
< > Relational operators.
The six relational operators are <, <=, >, >=, ==, and ~=.
A < B does element by element comparisons between A and B
and returns a matrix of the same size with elements set to logical
1 (TRUE) where the relation is true and elements set to logical 0
(FALSE) where it is not. A and B must have the same dimensions
Ejemplo:
>> A=[1,2;0,0];B=[1,0;9,0];
>> A<B
ans =
0
1
0
0
Ejemplo:
>> A=[1,2;0,0];B=[1,0;9,0];
>> A&B
ans =
1
0
0
0
Ejemplo:
>> A=[1,2;0,0];B=[1,0;9,0];
>> A|B
ans =
1
1
1
0
Ejemplo:
>> A=[1,2;0,0];
>> ~A
ans =
0
1
0
1
xor OR exclusivo .
XOR ( A, B ) es 1 lgico ( VERDADERO ) donde A o B , pero no ambos , es
distinto de cero . Ver XOR .
xor Exclusive OR.
xor(A,B) is logical 1 (TRUE) where either A or B, but not both, is
non-zero. See XOR.
Ejemplo:
>> A=[1,2;0,0];B=[1,0;9,0];
>> xor(A,B)
ans =
0
1
1
0
2. Haz lo siguiente usando las lneas de comando de Matlab (indicadas por >>)
Operacin
Ejemplo
Indica los resultados de las
operaciones
Suma +
>>format short
Resultados de a, b y suma:
>>a=7
>> format short
>>b=2;
%variable
escalar >> a=7;b=2;suma=a+b;
(puedes combertirlo en un >> suma
comentario, y lo que hay antes, suma =
a la derecha, no se ejecuta)
>>suma=a+b; %El ; hace que
9
no se vea el resultado pero si se
ejecuta la orden o sentencia.
>>suma
Resta >>resta=a-b;
Resultado resta:
>>resta
>> resta=a-b;
>> resta
resta =
Multiplicaci
n *
>>multiplicar=a*b
5
Resultado multiplicar:
>> multiplicar=a*b
multiplicar =
Divisin /
>>div1=a/b
14
Resultado div1:
>> div1=a/b
div1 =
Divisin \
3.5000
>>div2=a\b
Resultado div2: (divide b entre a)
>>div3=b\a %Es igual que >> div2=a\b
div1? El resultado es el mismo
porque \ significa que divides lo div2 =
que hay en la derecha entre lo
que hay en la izquierda, en este 0.2857
caso a entre b, al igual que en Resultado div3:
div1
>> div3=b\a
div3 =
Potencia ^ >>a=3;potencia=a^2
(primera
en
ejecucin)
3.5000
% es lo mismo ya que b\a=a/b
Resultado potencia:
>> a=3;potencia=a^2
potencia =
>>a=9;
>>a^3
9
Resultado:
>> a=9;
>> a^3
ans =
729
Cmo se llama la variable a la
que se le asigna el resultado?
ans porque si no le asignamos
algn nombre de una variable
nosotros, Matlab le asigna ans al
resultado de la operacin.
>>ans
>>c=7;d=8;ans=1
>>(c*d)/(ans+7)
>>(c*d)/ans+7
Resultado ejemplo
ans =
SQRT
Sqrt (x) es la raz
cuadrada de los
elementos de X.
Complejo
resultados se
producen si X no
es positivo.
>> sqrt(25)
ans =
>> sqrt(-20)
5
ans =
>> sqrt(-1)
0 + 4.4721i
ans =
>> rand(2)
0 + 1.0000i
ans =
RAND
RAND distribuye
uniformemente
nmeros pseudoaleatorios.
R = RAND (N)
devuelve una
matriz N por N
que contiene
valores pseudoaleatorios
elaborado a partir
de una
distribucin
uniforme en el
intervalo unidad.
RAND (M, N) o
RAND ([m, n])
devuelve una
matriz M-por-N.
RAND sin
argumentos
devuelve un
escalar. RAND
(SIZE (A))
devuelve una
matriz del mismo
120
ans =
1
0.8147
0.9058
>> rand(1,2)
0.1270
0.9134
ans =
0.6324
0.0975
>> rand
ans =
>> A=[1 2;3 4];rand(size(A))
0.2785
ans =
0.5469
0.9575
0.9649
0.1576
tamao como A.
SIN
Sin (x) es el seno
de los elementos
de X.
>> sin(pi)
>> sin(pi/2)
SIND
>> SIND(180)
SIND (X) es el
seno de los
elementos de X, >> SIND(30)
expresada en
grados.
Al ponerlo en
maysculas
Matlab te da un
mensaje de aviso,
pero te devuelve
el resultado, en
este caso.
TAN
TAN tangente del
argumento en
radianes.
Tan (x) es la
tangente de los
elementos de X.
ASIN
ASIN (X) es el
arcoseno de los
elementos de X.
Si el argumento
es mayor de 1 te
devuelve el
nmero complejo.
>> tan(pi)
ans =
1.2246e-016
ans =
1
ans =
0
ans =
0.5000
ans =
-1.2246e-016
>> asin(0)
ans =
>> asin(1)
0
ans =
>> asin(sqrt(3)/2)
1.5708
ans =
1.0472
SINH
>> sinh(pi)
SINH (X) es el
seno hiperblico
de los elementos
de X.
EXP
>> exp(1)
EXP (X) es la
exponencial de
los elementos de
X, e elevado a X.
Por complejo z =
X + i * Y, EXP (Z)
= exp (X) * (COS
(Y) + i * sen (y)).
LOG
>> log(2)
Log (x) es el
logaritmo natural
ans =
11.5487
ans =
2.7183
ans =
0.6931
10
de los elementos
de X.
Se producen
resultados
complejos
si X no es
positivo.
LOG10
Log10 (X) es el
logaritmo en base
10 de los
elementos de X.
Resultados
complejos se
producen si X no
es positivo.
Se puede utilizar
en maysculas
REM
REM (x, y) es x -.
N * Y donde n = f
(x / y) si y ~ = 0.
El resto que
resulta al dividir x
entre y
ROUND
Round(X)
redondea los
elementos de X
hacia el entero
ms cercano
EPS
EPS(X) separacin
de los nmeros de
punto flotante. X
puede ser de
doble precisin o
precisin simple.
Para todoX, EPS
(X) es igual a EPS
(ABS (X)).
PI
Es el nmero pi
>> log(-2)
ans =
0.6931 + 3.1416i
>> log10(20)
ans =
>> log10(10)
1.3010
ans =
1
>> rem(7,-2)
ans =
>> rem(2,2)
1
ans =
0
>> round(9/3.5)
ans =
>> round(1.2456)
3
ans =
>> eps(3.5)
1
ans =
>> eps(3)
4.4409e-016
ans =
4.4409e-016
PI
3.1415926535897....
11
Ejemplo de script
% Script ejemplo_script.m
disp(Cunto vale A_script y B_vc en
ejemplo_script)
A_script=37.5
disp([B_vc])
disp(Abandono el script)
12
sup =
150.7964
vol =
141.3717
8. Introduccin a vectores. Como en todos los lenguajes de alto nivel las variables
numricas se clasifican bsicamente en variables escalares (un nmero), variables
vectoriales (vector) o variables matriciales. En ejemplos anteriores se ha visto la
asignacin numrica escalar, ahora vamos a ver una de las formas para asignar
valores/elementos a un vector. Busca el significado de las rdenes LINSPACE usando
el comando help, y ejecuta
>> x=linspace(0,2*pi,3)
%Linspace (X1, X2,n) crea un vector fila de n puntos entre X1 y X2, si n<2 te
devuelve X2.
Nota. Esta lnea de comandos permite asignar valores numricos a la variable llamada
x. A diferencia de las asignaciones anteriores la variable x es un vector. Sin embargo,
hay que aclarar que realmente Matlab trabaja con variables con estructura matricial,
13
1.5
x 10
1
0.5
0
-0.5
-1
-1.5
-2
-2.5
3.1416
6.2832
y=
1.0e-015 *
0
0.1225 -0.2449
>> length(x),length(y)
ans =
3
14
ans =
3
(e)La siguiente ejecucin es incorrecta: >> z=x^2. Modifcala para que tengamos el
cuadrado de cada uno de los elementos de vector x. Recuerda el ejercicio 1. Se le
debe aadir un punto delante de ^ para que haga la operacin elemento a
elemento.
>> z=x.^2
z=
0
9.8696 39.4784
(f) [opcional]Otra forma de asignar valores numricos al vector con nombre x es por
ejemplo: x=[10:-1:1]
Ejecuta la siguiente funcin interna que permite construir una base de datos,
s=struct('a', x, 'b', 'Nombre', 'c', int16([x;x])). Visualiza su contenido en el
workspace y responde a las siguientes preguntas: Que tipos de datos son x y s?.
Cambia el contenido del campo b de s.
>> x=[10:-1:1]
x=
10
9
8
7
6
5
4
3
2
1
>> s=struct('a', x, 'b', 'Nombre', 'c', int16([x;x]))
s=
a: [10 9 8 7 6 5 4 3 2 1]
b: 'Nombre'
c: [2x10 int16]
%s es una variable en la que se guardan las variables a cuyo valor es la variable
que ya tenamos guardada x, un vector fila, a b se le asigna una palabra, y a c una
matriz formada por dos vectores x. Se crea una matriz de estructura con los campos y
los valores especificados
>> s=struct('a', x, 'b', x, 'c', int16([x;x]))
s=
a: [10 9 8 7 6 5 4 3 2 1]
b: [10 9 8 7 6 5 4 3 2 1]
c: [2x10 int16]
>> s=struct('a',int16([y;y]),'b', y, 'c', int16([x;x]))
s=
a: [2x1 int16]
b: 9
c: [2x10 int16]
9. Indica los resultados tras ejecutar las siguientes rdenes. Si hubiera errores
corrgelos. Fjate en las rdenes que han dado lugar a matrices o variables
matriciales.
>> X=[ 1 2 9 4 5]
X=
15
ans =
1
2
9
4
>> X=[1,2,9,4,5]
X=
1
5
1
2
5
>>X=20:-2:1
x=20:-2:1
x=
1
2
9
4
5
>>X(3) %le
trmino 3
ans =
4
est
5
pidiendo
el
18
2
16
14
12
7
6
8
7
Columns 17 through 32
8
9
10
11
12
3
5
6
7
8
9
10
12 13
4
11
2
>>longitud=length(X)
Longitud=
10
>>tamano =size(X)
tamano =
1
10
>>[fil,col]=size(X)
fil =
>>X(0)
Matlab te dice que necesita un
nmero entero y lgico, el cero para
l no lo es. Probamos con X(1), ya
que no existe el trmino cero del
vector.
>> X(1)
ans =
1
col =
10
>>a=[1:10,2:12,3:13]
a=
1
>>X([1,3,5])
%debe tener un =
X=([1,3,5])
X=
1
20
4
>>X(end)
ans =
>>X'
ans =
1
10
>>X(1:4)
da error dado que el vector X solo
tiene 3 elementos. X(1:4) significa
que te de los elementos del vector
del 1 al 4 con un salto (por defecto)
de 1. Para que nos de una
respuesta ponemos X(1:2):
>> X(1:2)
Columns 1 through 16
1
9
2
10
3
2
4
3
5
4
6
5
>> a=[1 2 7
568
3 2 6]
a=
1
7
16
5
3
6
2
8
6
d=
1
4
6
>> b=[1 2 3]
b=
1
2
6
2
2
3
0
1
>> c=[a;b]
c=
1
5
3
1
2
3
8
1
4
6
7
8
6
3
2
3
8
3
0
1
>>f=e, g=b;
f=
1
2
3
>>d=[1,2,3;4,3,0;6,8,1]
4
3
0
6
8
1
SECCIN 2. Variables
1.
Crear un vector x de 4 componentes equi-espaciado entre los valores 6 y 7.
>> x=linspace(6,7,4)
x=
2.
4.
Crea un vector v que contenga la tabla de multiplicar del 3, cuyo primer
elemento sea cero y el ltimo sea 30.
>> v=(0:3:30)
v=
0
5.
12
15
18
21
24
27
30
17
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
6.
Sumar 5 a los elementos del vector v con ndice par
5.+[v(1),v(3),v(5),v(7),v(9),v(11)]
ans =
5
11
17
23
29
35
7.
Crear los vectores a=[0 6 8 3] y b=[-1 7 8*2 4]. (a) Crear una matriz A de
tamao 2x4 cuyas filas sean los vectores a y b y (b) Crear una matriz 4x2 cuyas
columnas sean a y b.
>> A=[a;b]
A=
0
-1
6
7
8
16
3
4
>> B=A'
B=
0
6
8
3
-1
7
16
4
8.
Escribe un vector z que vaya del 0 al 1 con un espaciado de 0.1. Calcular un
vector con los valores de la funcin interna sin aplicada a los elementos de z. Hazlo
tambin para la funcin interna exp.
>> z=(0:0.1:1)
z=
Columns 1 through 7
0
0.1000
0.2000
0.3000
0.4000
0.5000
0.6000
0.4794
0.5646
Columns 8 through 11
0.7000
0.8000
0.9000
1.0000
>> g=sin(z)
g=
Columns 1 through 7
0
0.0998
0.1987
0.2955
0.3894
Columns 8 through 11
0.6442
0.7174
0.7833
0.8415
>> h=exp(z)
18
h=
Columns 1 through 7
1.0000
1.1052
1.2214
1.3499
1.4918
1.6487
1.8221
Columns 8 through 11
2.0138
2.2255
2.4596
2.7183
9.
Crear un vector x con las fracciones 1, 1/2 , 1/3, 1/4, 1/10.
v=1./[1:1:10]
v=
Columns 1 through 8
1.0000
0.5000
0.3333
0.2500
0.2000
0.1667
0.1429
0.1250
Columns 9 through 10
0.1111 0.1000
function
n=[1:1:10]
V=1./n
10. Generar los primeros 10 nmeros de la serie: 0, 1/2, 2/3, 3/4,
w=[0:1:9]./[1:1:10]
w=
Columns 1 through 8
0
0.5000
0.6667
0.7500
0.8000
0.8333
0.8571
0.8750
Columns 9 through 10
0.8889
11.
0.9000
n=(0:1:10),(-1).^n
n=
0
10
-1
-1
-1
-1
-1
ans =
1
19
( 1) n
desde n = 0, , 10 . Usa la
2n 1
funcin interna sum para sumar todos los elementos del vector.
>> n=(0:1:10);w=((-1).^n)./(2.*n+1),s=sum(w)
12.
w=
Columns 1 through 7
1.0000 -0.3333
0.2000 -0.1429
0.1111 -0.0909
0.0769
Columns 8 through 11
-0.0667
0.0588 -0.0526
0.0476
s=
0.8081
Veamos cmo calcular un valor aproximado de . Suma los primeros 100
(1) n 1 1 1 1 1
s=
0.7879
>> n=(0:1:10000);w=((-1).^n)./(2.*n+1);s=sum(w)
s=
0.7854
14. Crear una matriz B cuya primera fila corresponda al vector a, cuya segunda fila
sea un vector de ceros, la tercera un vector de unos y la cuarta el contenido de b. Ver
ones y zeros.
>>length(a),length(b)
ans =
4
ans =
4
>> B=[a;zeros(1,4);ones(1,4);b]
B=
0
20
0
1
-1
0
1
7
0
1
16
0
1
4
15. Definir un vector k cuyos elementos sean iguales a los dos primeros elementos
de la diagonal de la matriz B. Utiliza la funcin interna diag.
k=[diag(B(1)),diag(B(2))]
k=
0
16. Crea una submatriz C de tamao 3x3 que sea el contenido de las tres primeras
filas y columnas de la matriz B.
>> C=[B(1:3,1:3)]
C=
0
0
1
17.
6
0
1
8
0
1
C=
5
-2
0
2
D=
-3
4
10 -4
(b) Calcula los determinantes de ambas matrices y sus inversas.
>>det(A),det(B)
ans =
-9
ans =
0
>>inv(A)
ans =
0.1111 0.2222
0.4444 -0.1111
inv(B)
21
que
22
0.0110
0.1648
0
2
4 -5
3
1
4
7
0 -5 -5
Poner a 3 los elementos de x mayores de 1 y menores de 5:
>> x((x>1)&(x<5))=3
(b)
x=
-1
-2
-3
-1
(c)
Crear un vector y con los elementos de x menores o iguales a 3:
>> y=x((x<=3))
y=
-1
(d)
-2
-3
-1
ans =
9
(e)
Crear un nuevo vector y que tenga 1's en las posiciones de los elementos
de x que sean mayores que la media (usar la funcin interna mean) y 0's en las
de los menores que la media. NOTA: primero haz >>y=x %para evitar
modificaciones del vector x y, por tanto, tambin de su media.
>> x(x<mean(x))=0,x(x>mean(x))=1
23
x=
0
x=
0
(f) Asignar a cero los elementos pares (usar funcin interna rem)
>> x(rem(x,2)==0)=0
x=
-1
0
0
0
0
3
1
0
7
0 -3 -1
(g)
Cambiar el signo de los valores de x verificando: 2<=x(i) < 5:
>> x=(-1)*(x(2<=x<5))
x=
1
0
0
0
0 -3 -1
SECCIN 3. Funciones y scripts.
-7
1.
Crear la funcin suma_vectores que tome como parmetros de entrada los
vectores a y b, devolviendo un vector c que realice su suma. Hazlo tambin con un
script, llmalo suma_vectores_s.. Que diferencia aprecias entre suma_vectores y
suma_vectores_s? Las variables tienen el mismo mbito? La forma de invocarlos es
la misma?.
Funcin:
function [c]=suma_vectores(a,b)
c=a+b;
%suma_vectores_s
c=a+b
24
Las variables en los scrips son de mbito global, mientras que las de las funciones son
de mbito local.
No se invocan de la misma manera, para invocar un scrip asignamos las variables y
llamamos al scrip (>>suma_vectores_s), pero en la funcin debes escribir el nombre
del fichero y las variables de entrada.
2.
f (x )
1
1 x
muestre cmo vara f(x) si x=3 y n vara entre -40 y 40. Pon etiquetas a los ejes usando
los comando xlabel e ylabel.
%abs(x)es el valor absoluto de x elevado a n
%recibe como argumento un valor x y un entero n, y devuelve el valor de fx
Edit:
function [fx]=argumento(x,n)
fx=1./(1+((abs(x)).^n))
Lnea de comandos:
>> n=[-40:40];
>> x=3;
>> fx=argumento(x,n);
fx =
Columns 1 through 9
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
0.9999
0.9998
0.9995
0.9986
0.9959
0.7500
0.5000
0.2500
0.1000
0.0357
0.0122
0.0002
0.0001
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
Columns 10 through 18
1.0000
1.0000
1.0000
Columns 19 through 27
1.0000
1.0000
1.0000
Columns 28 through 36
1.0000
1.0000
1.0000
Columns 37 through 45
0.9878
0.9643
0.9000
Columns 46 through 54
0.0041
0.0014
0.0005
Columns 55 through 63
0.0000
0.0000
0.0000
Columns 64 through 72
25
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
Columns 73 through 81
0.0000
0.0000
0.0000
>> plot(fx,n)
>> xlabel('f(x) en x=3')
>> ylabel('n entre -40 y 40')
40
30
20
n entre -40 y 40
10
-10
-20
-30
-40
-1
-0.5
0.5
f(x) en x=3
1.5
3.
Crear una funcin llamada alcance.m que determine el alcance mximo
horizontal (xmax), de un objeto lanzado con una velocidad inicial vo en el plano xy.
Considera como variables de entrada el ngulo y la velocidad de origen vo del
lanzamiento del objeto, ambas sern variables escalares. La variable de salida ser el
alcance mximo.
Edit:
function [xmax]=alcance(z,vo)
%z es el ngulo
%vo es la velocidad de origen del lanzamiento
g=9.8;
%alcance.m
xmax=(vo^2*sin(2*z))/g;
disp([xmax,z,vo])
%disp('determina el alcance mximo horizontal, de un objeto lanzado con una
%velocidad inicial vo en xy')
%disp('variable entrada z, ngulo en radianes, velocidad origen vo')
>>z=0.7854; vo=40;
>> [xmax]=alcance(z,vo)
163.2653 0.7854 40.0000
26
xmax =
163.2653
Modificamos la funcin alcance:
>> vo=linspace(40,90,3);
>> alcance(z,vo)
??? Error using ==> mpower
Matrix must be square.
Error in ==> alcance at 5
xmax=(vo^2*sin(2*z))/g;
%Lo que hacemos para que nos deje de dar error es ponerle delante de los signos de multiplicacin, potencia y divisin
%un punto para que la operacin se haga elemento a elemento
>> alcance(z,vo)
163.2653 431.1224 826.5306
ans =
163.2653 431.1224 826.5306
Longitud:
>> length(vo)
ans =
3
>> length(z)
ans =
1
4.
Haz lo mismo que en el ejercicio 3 con un script, llmale alcance_s.m
Edit:
%alcance_s
g=9.8;
%alcance.m
xmax=(vo.^2.*sin(2.*z))./g;
disp('xmax');disp([xmax])
%disp('determina el alcance mximo horizontal, de un objeto lanzado con una
%velocidad inicial vo en xy')
%disp('variable entrada z, ngulo en radianes, velocidad origen vo')
Lnea de comandos:
>> z=0.7854; vo=40;
>> alcance_s
xmax
163.2653 431.1224 826.5306
5.
Crea una funcin tiempo.m que determine el tiempo mximo del lanzamiento.
Variables de entrada: ngulo y velocidad inicial. Variable de salida: tiempo mximo.
Edit:
function [tm]=tiempo(z,vo)
27
g=9.8;
tm=(2.*vo.*sin(z))./g;
%z es el ngulo en radianes
%vo es la velocidad inicial
%tm es la variable de salida (tiempo mximo), de entrada el ngulo en radianes (a) y
la velocidad inicial en m/s(vo)
>> z=pi/4;vo=40;
>> [tm]=tiempo(z,vo)
tm =
5.7723
6.
Crear una funcin llamada alcance_tiempo.m que llame a las funciones
alcance.m y tiempo.m. Las variables de salida sern el alcance y el tiempo mximo.
function xtmax(z,vo)
%disp('hemos creado una funcin, llamando a otras dos funciones, posible porque se
encuentran en el mismo directorio');
[xmax]=alcance(z,vo)
[tm]=tiempo(z,vo)
xmax2=vo*cos(z)*tm
%xmax2 fue aadido en clase, un ejercicio aadido.
Lnea de comandos:
>>z=pi/4;vo=40;
>> xtmax(z,vo)
163.2653 0.7854 40.0000
xmax =
163.2653
tm =
5.7723
xmax2 =
163.2653
7.
Crear una funcin llamada alcance_vect.m con variable de salida una matriz que
contenga todos los ngulos, velocidades iniciales, tiempos en alcanzar de nuevo el
suelo y los alcances mximos de todas las trayectorias generadas. Las variables de
entrada sern el ngulo y la velocidad.(a) Aplcalo a un ngulo de 45 y una velocidad
de entre 40 y 60 m/s con un salto de 10 m/s. (b) Aplcalo a ngulos entre 10 y 90 con
un salto de 5. (c) Aplcalo a una velocidad entre 20 y 40 m/s con un salto de 10 m/s y
ngulos entre 10 y 30 con un salto de 10. (d) Aplcalo a los ngulos de 10 a 90
saltando de 5 en 5 y una velocidad inicial del lanzamiento de 40 m/s a 60 m/s con un
salto de 10 m/s. Como vers no es posible. Este ltimo apartado lo tendrs que hacer
con bucles en el ejercicio 11 de la Seccin 4, a este programa llmale
alcance_bucle.m.
a)
Edit:
function [A]=alcance_vect(z,vo)
disp('xmax,tm,vo,z')
28
g=9.8;
[xmax]=alcance(z,vo);
[tm]=tiempo(z,vo);
A=[xmax,tm,vo,z];
%llamamos a otras funciones
Lnea de comandos
>> z=45;
>> [A]=alcance_vect(z,vo)
xmax,tm,vo,z
145.9586 228.0604 328.4069 45.0000 40.0000 50.0000 60.0000
A=
Columns 1 through 9
145.9586 228.0604 328.4069
6.9462
Column 10
45.0000
b)
Le falta la velocidad de inicio, ya que si usamos la del apartado anterior estaramos realizando
el apartado (d), por lo que supondremos que la velocidad de inicio es 40m/s.
Edit:
function [A]=alcance_vect(z,vo)
%disp('xmax,tm,vo,z')
g=9.8;
[tm]=tiempo(z,vo);
[xmax]=alcance(z,vo);
A=[xmax tm vo z];
Lnea de comandos:
>> [A]=alcance_vect(z,vo)
Columns 1 through 9
149.0523 -161.3113 121.6511 -42.8367 -49.7650 126.3495 -162.2675 145.9586 -82.6719
Columns 10 through 18
-7.2233 94.7937 -151.8540 160.0391 -116.7145 35.8245 56.5958 -130.8004 10.0000
Columns 19 through 27
15.0000 20.0000 25.0000 30.0000 35.0000 40.0000 45.0000 50.0000 55.0000
Columns 28 through 35
60.0000 65.0000 70.0000 75.0000 80.0000 85.0000 90.0000 40.0000
A=
Columns 1 through 9
149.0523 -161.3113 121.6511 -42.8367 -49.7650 126.3495 -162.2675 145.9586 -82.6719
Columns 10 through 18
29
6.0826
Columns 28 through 36
-2.4882
6.7496
Columns 37 through 45
15.0000 20.0000 25.0000 30.0000 35.0000 40.0000 45.0000 50.0000 55.0000
Columns 46 through 52
60.0000 65.0000 70.0000 75.0000 80.0000 85.0000 90.0000
c) Para este apartado tuve que buscar un comando que crease una matriz por bloques
de dimensiones, repmat(A,[m,n]) con copias de la matriz A.
Edit:
function[A]=alcance_vect1(vo,z)
g=9.8;
r=z.*pi./180;
vo1=repmat(vo,1,length(r));
z1=repmat(r,1,length(vo));
xmax=((vo1.^2).*(sin(2.*z1)))./g;
tm=(2.*vo1.*sin(z1))./g;
A=[xmax; vo1; z1];
Lnea de comandos:
>> [A]=alcance_vect1(z,vo)
A=
Columns 1 through 9
6.5591 19.8832 40.1962 40.9941 79.5329 123.1010 104.9449 178.9491 251.2265
10.0000 15.0000 20.0000 25.0000 30.0000 35.0000 40.0000 45.0000 50.0000
0.3491 0.5236 0.6981 0.3491 0.5236 0.6981 0.3491 0.5236 0.6981
Columns 10 through 18
198.4115 318.1318 424.5727 321.3938 497.0809 643.1398 473.8919 715.7965
10.0491
55.0000 60.0000 65.0000 70.0000 75.0000 80.0000 85.0000 90.0000 10.0000
0.3491 0.5236 0.6981 0.3491 0.5236 0.6981 0.3491 0.5236 0.6981
Columns 19 through 27
14.7579 35.3480 62.8066 59.0315 108.2532 160.7849 132.8209 220.9248 303.9840
15.0000 20.0000 25.0000 30.0000 35.0000 40.0000 45.0000 50.0000 55.0000
0.3491 0.5236 0.6981 0.3491 0.5236 0.6981 0.3491 0.5236 0.6981
Columns 28 through 36
236.1261 373.3630 492.4039 368.9470 565.5676 726.0445 531.2836 8.8370 22.6104
60.0000 65.0000 70.0000 75.0000 80.0000 85.0000 90.0000 10.0000 15.0000
0.3491 0.5236 0.6981 0.3491 0.5236 0.6981 0.3491 0.5236 0.6981
Columns 37 through 45
30
Lneas de commando:
>> potencia(3)
n=
2
nesima =
9
ans =
9
2. Crea una funcin que determine la suma de los inversos de los impares menores de
1000. Usa las funciones tic y toc para determinar el tiempo que se tarda. Usa la
estructura for.
1 1 1
1
Serie 1 ...
3 5 7
999
function [serie]=inversos(N)
serie=0;
tic
for i=1:2:N;
serie=serie+(1/i);
end
toc
>> inversos(1000)
Elapsed time is 0.000005 seconds.
ans =
4.0891
3.
Los nmeros de Fibonacci, F(n) son una serie de nmeros enteros, inicializados
con F(1)=1 y F(2)=2. Los dems trminos se tienen como la suma de los dos
31
anteriores: F(n) = F(n-1) + F(n-2). Escribe un script que genere los primeros 100
nmeros de la serie de Fibonacci, almacenndolos en un vector F. Usa la estructura
while.
%script=fibonacci_s
f(1)=1;
f(2)=2;
n=3;
N=100;
%clear f
while (n<N)
f(n)=f(n-1)+f(n-2);
n=n+1;
end
f
>> fibonacci_s
N=
100
f=
1.0e+020 *
Columns 1 through 9
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
0.0001
0.0001
0.0001
0.0002
0.0004
0.0006
Columns 10 through 18
0.0000
0.0000
0.0000
Columns 19 through 27
0.0000
0.0000
0.0000
Columns 28 through 36
0.0000
0.0000
0.0000
Columns 37 through 45
0.0000
0.0000
0.0000
Columns 46 through 54
0.0000
0.0000
0.0000
Columns 55 through 63
0.0000
0.0000
0.0000
Columns 64 through 72
0.0000
0.0000
0.0000
Columns 73 through 81
0.0000
0.0000
0.0000
Columns 82 through 90
32
0.0010
0.0016
0.0026
0.0042
0.0068
0.0110
0.0178
0.0288
0.0466
0.3194
0.5168
0.8362
1.3530
2.1892
3.5422
Columns 91 through 99
0.0754
0.1220
0.1974
4.
Escribir las lneas de cdigo para que dado un vector x, genere otro vector con
el orden de los elementos invertido.
Edit:
%vector_s
for i=0:1:length(x);
if i~=length(x);
n=x(length(x)-i);
%n=x(end)-(x-i);
y=n;
disp(y)
end
end
Lnea de comandos:
>> x=[1 2 -4 6 7]
x=
1
-4
>> vector_s
7
6
-4
2
1
5.
Implementar una funcin que tome como entrada un vector x y que devuelva la
posicin y el contenido del primer elemento negativo. Sintaxis de llamada: [elem, pos]
= buscaelem(x). (a) Aadir una condicin de parada si no hubiese ningn elemento
negativo, que muestre por pantalla el mensaje: No hay ningn elemento negativo
Edit:
function [elem,pos]=bucaelem(x)
%x es un vector
for i=1:1:length(x)
if x(i)>=0
disp('no hay ningun elemento negativo')
else
elem=x(i)
pos=i
break
end
end
Lnea de comandos:
>> x=[1 -3 5 -3];buscaelem(x)
no hay ningun elemento negativo
elem =
33
-3
pos =
2
ans =
-3
6.
Implementar una funcin que dado un vector devuelva el menor valor del vector
y la posicin donde se encuentra sin usar la funcin min o max. Por ejemplo v=[ 1 2 3
4 5 6 -1 -3 -2] devolvera el valor de -3 y la posicin 8.
function maximoyminimo(v)
for i=1:length(v);
if v(i)<=v;
disp(v(i))
disp(i)
end
if v(i)>=v;
disp(v(i))
disp(i)
end
end
>> maximoyminimo(v)
6
6
-3
8
7.
Crear una funcin que dados los valores escalares de n, a 1,
vector de n componentes tal que a n = an-1 - 3an-2.
function [x]=vector(n,a1,a2)
x(1)=a1;
x(2)=a2;
N=10;
n=3;
length(x)=n;
%clear f
while n<N
x(n)=x(n-1)-3*x(n-2);
n=n+1;
end
disp(x)
>> vector(3,1,4)
1
4
1 -11 -14 19 61
a2 devuelva un
4 -179
8.
Crear un script que obtenga el valor medio y desviacin media del vector x
descrito como:
Compara los resultados con las funciones internas mean y std. Compara ahora el
resultado de std con tu variable desv si la divides entre (n-1) en vez de n.
34
%mediaydesviacion_s
n=length(x);
suma1=0;
for i=1:1:n
suma1=suma1+x(i);
end
media=suma1/n
desviacion = sqrt(sum((x-media).^2)/n)
>> x=[1 2 3 9 8 7];
>> mediaydesviacion_s
>> n,media,desviacion
n=
6
media =
5
desviacion =
3.1091
%Lo comparamos
>> mean(x),std(x)
ans =
5
ans =
3.4059 (no da exactamente la desviacin igual, ya que Matlab no usa la misma frmula que
nosotros hemos utilizado)
9.
Implementar una funcin que tome como entrada una matriz A y que devuelva
la suma de todos los elementos de las 2 diagonales de dicha matriz. No utilizar la
funcin diag().
Edit:
function [z]=matriz(A)
[nf,nc]=size(A);
n=0;
p=0;
%solo matrices cuadradas
for i=1:1:nf
n=n+A(i,(nc-i+1));
for j=1:1:nc
if i==j
p=p+A(i,j);
end
end
end
z=n+p
Lneas de comando:
>> A=[1 2 3;4 5 6;7 8 9]; diagon(A)
z=
30
10. Implementar una funcin que dadas dos matrices A y B definidas como (a ij)mxn y
(bij)nxp, implemente la multiplicacin de matrices C=AB mediante bucles, definida
como (cij)mxp donde
function [C]=matriz2(A,B)
[nf1,nc1]=size(A);
[nf2,nc2]=size(B);
if nc1==nf2
for i=1:1:nf1
for j=1:1:nc2
C(i,j)=sum(A(i,:).*B(:,j)');
35
end
end
end
C=A*B
>> A=[2 3;4 6];
>> B=[1 4;2 7];
>> matriz2(A,B)
8
29
16
58
11. Crear una funcin llamada alcance_bucle.m que determine el alcance mximo
horizontal y el tiempo mximo de un objeto lanzado con una velocidad inicial vo y un
ngulo segn lo indicado en el apartado d del ejercicio 7 de la seccin anterior.
Edit:
function[xmax,tm]=alcance_bucle(vo,z1)
g=9.8;
r=z1.*pi./180;
for i=1:length(vo)
for j=1:length(r)
xmax(i,j)=((vo(i)^2)*(sin(2*r(j))))/g;
tm(i,j)=2*(vo(i))*(sin((r(j))))/g;
end
end
Lnea de commandos:
>> z1=[10:5:90];vo=[40:10:60];
>> [xmax,tm]=alcance_bucle(vo,z1)
xmax =
Columns 1 through 9
2.1128
2.6410
3.1692
2.7920
3.4900
4.1880
3.4499
4.3124
5.1749
4.0816
5.1020
6.1224
4.6823
5.8528
7.0234
5.2472
6.5591
7.8709
5.7723
7.2154
8.6585
7.6710
9.5887
6.2534
7.8168
9.3801
Columns 10 through 17
6.6870
8.3587
7.0696
8.8370
7.3984
9.2480
36
%matriz3
[nf,nc]=size(A);
%deben ser cuadradas y de las mismas dimensiones, porque si no va a dar error
if size(A)==size(B)
for i=1:nf
for j=1:nc
G(i,j)=(A(i,j))-(B(i,j))*(A(i,j))^(2/3);
end
end
end
disp(G)
lnea de comandos:
>> matriz3
-3.0000
5.1748
19.1191
0.5000 - 2.5981i
>> G=A-B.*A.^(2/3)
G=
-3.0000
19.1191
5.1748
0.5000 - 2.5981i
(a) Aade el nombre de cada eje con xlabel, ylabel y el ttulo de la figura con
title
(b) Emplea los comandos de la ventana que contiene el grfico para cambiar el
grosor y el color de las lneas de tres trayectorias. (no hacer, poner para que
37
350
300
altura
250
200
150
100
50
0
2.
50
100
150
Longitud
200
250
300
350
Usa nicamente sola figura para representar en diferentes panales (usa subplot)
38
plot(x,y,'y*')
y=exp(-x.^2)
subplot(3,2,2)
stem(x,y,'k')
y=exp(-(x./2).^2)
subplot(3,2,3)
plot(x,y,'g.')
y=exp(-(x./2).^2)
subplot(3,2,4)
hist(y,x)
y=exp(-(2.*x).^2)
subplot(3,2,5)
plot(x,y,'bp')
grid on
y=exp(-(2.*x).^2)
subplot(3,2,6)
semilogx(x,y,'cd')
Lnea de comandos:
>>x=linspace(-2,2,100);figure(x)
1
0.8
0.8
0.6
0.6
0.4
0.4
0.2
0.2
0
-2
-1.5
-1
-0.5
0.5
1.5
0
-2
20
0.8
15
0.6
10
0.4
0.2
-2
-1.5
-1
-0.5
0.5
1.5
0
-3
0.8
0.8
0.6
0.6
0.4
0.4
0.2
0.2
0
-2
-1.5
-1
-0.5
0.5
1.5
0 -2
10
-1.5
-2
-1
-0.5
-1
-1
10
0.5
1.5
10
10
%la ltima barra del histograma no tiene mucho sentido dado que no le estamos pidiendo eso
3.
Crear una funcin dibujatriangulo que tenga como argumento de entrada los 3
vrtices.
Editor:
function figuratriangulo(a,b,c)
x=[a(1),b(1),c(1),a(1)];
y=[a(2),b(2),c(2),a(2)];
plot(x,y)
area(x,y,'facecolor','c')
39
2
1.8
1.6
1.4
1.2
1
0.8
0.6
0.4
0.2
0
1.2
1.4
1.6
1.8
2.2
2.4
2.6
2.8
4.
Crear una funcin dibujaMUC que dibuje la trayectoria circular de una partcula
conociendo su velocidad angular y el radio de giro r. Recuerda el significado del
periodo de un movimiento circular.
Las ecuaciones cartesianas son:
Editor:
function dibujomcu(r,w)
t1=(2*pi)/w;
for t=linspace(0,t1,100)
x=r*cos(w*t);
y=r*sin(w*t);
plot(x,y,'ko')
hold on
pause(t/100)
end
Lnea de comandos:
>> dibujomcu(5,62.8)
Figure:
10
8
6
4
2
0
-2
-4
-6
-8
-10
-10
-8
-6
-4
-2
10
Editor:
function dibujomcu(r,w)
n=15;
t1=(2*pi)/w;
for t=linspace(0,t1,n)
x=r.*cos(w.*t);
y=r*sin(w*t);
vx=-r.*w.*sin(w.*t);
40
vy=r.*w.*cos(w.*t);
plot(x,y,'o')
hold on
quiver(x,y,vx,vy)
end
Lnea de comandos:
>> dibujomcu(5,5)
Figure:
25
20
15
10
5
0
-5
-10
-15
-20
-25
-25
-20
-15
-10
-5
10
15
20
25
5.
Crear una funcin dibujatrayectoria3D que tenga como parmetros de entrada
el radio r y la velocidad angular sabiendo que la partcula se mueve en el eje z con
una velocidad constate vz..
function dibujotrayectoria3d(r,w)
%n puntos
%N vueltas
%v es la velocidad en z
n=100;
N=4;
v=8;
tm=(2*pi*N)/w;
t=linspace(0,tm,n);
z=v.*t;
y=r.*sin(w.*t);
x=r.*cos(w.*t);
plot3(x,y,z,'g')
hold on
12
10
8
6
4
2
0
20
10
0
-10
-20
-20
-10
10
20
6.
Crear una funcin dibujatipoparabolico que represente el tiro parablico en 3D
sabiendo que la funcin tiene como entrada los ngulos y de acuerdo a las
41
siguiente expresiones:
0
40
20
0
20
40
60
80
100
7.
Usando el Comando meshgrid, crea una retcula cuadrada en el intervalo x=[-1
1] y=[-2 2] emplea para ello un paso de malla de valor 0.1. Crea una matriz de ceros
del tamao de las matrices que definen la retcula. Representa, empleando el
comando mesh, la matriz de ceros creada sobre la retcula. Representa grficamente
la superficie
42
Lnea de comandos:
>> y=[-2:0.1:2];x=[-1:0.1:1];
>> B=meshgrid(x,y);
>> A=zeros(size(B));
>> mesh(A)
1
0.5
0
-0.5
-1
60
40
20
0
15
10
20
25
>> [A,B]=meshgrid(x,y);
>> Z=exp(-((A.^2)+(B.^2)));
>> mesh(A,B,Z)
1
0.8
0.6
0.4
0.2
0
2
1
0
-1
-2
>>contour(A,B,Z)
-0.5
-1
0.5
2
1.5
1
0.5
0
-0.5
-1
-1.5
-2
-1
-0.8
-0.6
-0.4
-0.2
0.2
0.4
0.6
0.8
CONTOUR+MESH
>> y=[-2:0.1:2];x=[-1:0.1:1];
>>B=meshgrid(x,y);
>>A=zeros(size(B));
>> [A,B]=meshgrid(x,y);
43
>>Z=exp(-((A.^2)+(B.^2)));
>> figure
>> mesh(A)
>> meshc(Z)
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
25
20
0.1
0
45
15
40
35
10
30
25
20
15
5
10
SURF+CONTOUR
>> y=[-2:0.1:2];x=[-1:0.1:1];
>> B=meshgrid(x,y);
>> A=zeros(size(B));
>> mesh(A)
>> [A,B]=meshgrid(x,y);
>> Z=exp(-((A.^2)+(B.^2)));
>> surfc(Z)
44
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
20
0.1
15
10
40
30
5
20
10
2.
Usando fprintf escribe el nmero e con 2 decimales en una lnea y con 8
decimales en la siguiente.
>> fprintf('%3.2f\n%9.8f\n',exp(1),exp(1))
2.72
2.71828183
3.
Sea la variable x = 174, usa fprintf para ver en una sola lnea en pantalla el
valor de x como:
un entero (%d),
>> fprintf('%d\n',x)
174
>> fprintf('%4d\n',x)
174
>> fprintf('%04d\n',x)
0174
>> fprintf('%+d\n',x)
+174
>> fprintf('%.2f\n',x)
174.00
45
1.740000e+002
4.
Usa el comando input para asignar el valor 222 a una variable. Pregunta a
continuacin por el valor de dicha variable en la lnea de comando de matlab.
%input le asocia a la variable 'a' aquel nmero que le das cuando te
%devuelve lo que le has puesto en (' ')
>> a=input('dame un nmero:');
dame un nmero:222
>> a
a=
222
5.
Crear un programa que dado un nmero introducido por el usuario, devuelva
por pantalla la tabla de multiplicar del nmero introducido.
Edit:
%tablademultiplicar
a=input('Cul es el nmero cuya tabla de multiplicar desea saber?');
for x=1:1:10
fprintf('%3i %1s %1i %1s %1i\n' ,a,'x',x,'=',(a*x))
end
Lnea de comandos:
>> tablademultiplicar
Cul es el nmero cuya tabla de multiplicar desea saber?4
4
4
4
4
4
4
4
4
4
4
x
x
x
x
x
x
x
x
x
x
1=4
2=8
3 = 12
4 = 16
5 = 20
6 = 24
7 = 28
8 = 32
9 = 36
10 = 40
6.
Crear 5 vectores aleatorios denominados v1, v2, v3, v4 y v5 de tamaos
diferentes y guardar su contenido en un fichero usando el comando save. Recuperar la
informacin usando load verificando que la informacin guardada y leda es la misma.
(a) Los vectores v deben tener la misma dimensin, ejecuta >> save ale1.txt v*
ascii, donde el nombre del fichero es ale1.txt en este fichero se almacenar la
informacin contenida en todas las variables que empiezan por v y su formato ser
legible por eso se usa la opcin -ascii. Usa type para visualizar el contenido de este
fichero. Recupera la informacin usando load, es decir ejecuta >> load ale1.txt y
asigna, por ejemplo, a una variable vectorial a el contenido de la segunda fila de las
columnas de las 2 a la 4 ejecutando >>a=ale1(2,[2:4]). Borra el fichero usando
>>delete ale1.txt
>> v1=rand(1,3);v2=rand(1,3);v3=rand(1,3);v4=rand(1,3);v5=rand(1,3);
>> save aleatorios1.txt v* -ascii
>> type aleatorios1.txt
1.4188634e-001
7.9220733e-001
3.5711679e-002
6.7873515e-001
3.9222702e-001
4.2176128e-001
9.5949243e-001
8.4912931e-001
7.5774013e-001
6.5547789e-001
9.1573553e-001
6.5574070e-001
9.3399325e-001
7.4313247e-001
1.7118669e-001
>> a=aleatorios1(1,:)
46
v5
v4
>> a=aleatorios1(1,:)
a=
0.1419 0.4218 0.9157
>> delete aleatorios1.txt
(b) Los vectores v deben tener diferente longitud. Al usar load vers que no es posible
utilizarlo. Ejecuta las siguientes rdenes >>save ale2 v* %no lo graba en formato
legible ya que no usas la opcin ascii, el fichero sin extensin se llamar ale2 y v*
indica, como sabes,que se grabaran en este fichero las variables que comienzan con
v, >>clear v* % para borrar todas las variables que empiezan por v del workspace,
>> who %para ver si existen variables que comienzan con v, >> dir ale* % para ver
los ficheros que comienzan con ale, qu ves?, >>load ale %recupera informacin
junto con asignacin, >>v1 %vers que recupera la informacin asignada a v1.
>> v1=rand(1,2);v2=rand(1,3);v3=rand(1,4);v4=rand(1,5);v5=rand(1,6);
>> save aleatorios2.txt v* -ascii
>> load aleatorios2.txt
??? Error using ==> load
Number of columns on line 1 of ASCII file C:\Documents and Settings\CLS\Mis
documentos\MATLAB\aleatorios2.txt
must be the same as previous lines.
%Nos da error debido a que los vectores v* no tienen las mismas dimensiones y no es posible
la matriz.
>>
>>
>>
>>
delete aleatorios2.txt
save aleatorios2 v*
clear c*
who
aleatorios1
v3
v4
v5
47
%Si no lo guardamos como .txt y sin -ASCII se guarda como .mat., y es un fichero sin
extensin, esto nos permite cargar el documento con load %sin tener que hacer previamente
import data.
0.9649
v2 =
0.9572
0.485
v3 =
0.8003
0.1419
0.4218
v4 =
0.9157
0.7922
0.9595
v5 =
0.8491
0.9340
0.6787
0.1576
0.9706
0.6557
0.0357
9.6488854e-001
4.8537565e-001
1.4188634e-001
7.9220733e-001
9.3399325e-001
1.5761308e-001 9.7059278e-001
4.2176128e-001
9.5949243e-001 6.5574070e-001 3.5711679e-002
6.7873515e-001
>> a=aleatorios(1,:)
??? Undefined variable aleatorios.
>> load aleatorios.txt
??? Error using ==> load
Number of columns on line 1 of ASCII file C:\Documents and Settings\CLS\Mis
documentos\MATLAB\aleatorios.txt
must be the same as previous lines.
>> who
Your variables are:
v1
v2
v3
v4
v5
%Nos da error debido a que los vectores v* no tienen las mismas dimensiones y no es posible
la matriz. %Cuando esto ocurre en Matlab le damos a file/import data seleccionamos el
documento, en nuestro %caso aleatorios.txt, y nos aparece una ventana donde se
encuentran nuestros vectores todos con la %misma dimensin, en los huecos aparece NAN,
y le damos a next y finish.
%Despus de realizar esto ya podemos llevar a cabo, dado que se convierte en una variable:
>> a=aleatorios(1,:)
a=
0.9575 0.9649
>> aleatorios
aleatorios =
0.1576
0.9706
48
0.9575
0.9572
0.8003
0.9157
0.0357
0.8491
0.9649
0.4854
0.1419
0.7922
NaN
0.9340
0.1576
NaN
0.4218
0.9595
NaN
0.6787
0.9706
NaN
NaN
0.6557
NaN
NaN
>> who
Your variables are:
a
v1
aleatorios v2
v3
v4
v5
7.
Ayuda en el uso de fopen, fprintf y fclose en ficheros de texto.
fid=fopen(nombrefichero,modo)
fid es el identificador del fichero que se
utilizar en el resto de las operaciones. Es
un nmero natural que asigna matlab al
nombre del fichero que le hayamos dado
en nombrefichero. Es decir, fid es un
nombre de variable a la que se le va a
asignar el anterior valor numrico, de tal
forma que internamente matlab sabe que
el nmero asignado a fid se refiere al
nombrefichero.
modo. son las opciones identificativas
del fichero
r se refiere a un fichero existente del
que se va a leer la informacin que
contiene.
w fichero que queremos crear. Si nos
equivocamos y existiera se borrara toda
su informacin.
rt para leer el fichero en modo texto, es
decir, legible
wt para escribir un fichero en modo textofclose(fid)
Cierra el fichero identificado con fid
Ejemplo:
fprintf(fid,
'El
valor
es: Escribe en el fichero identificado con fid
%8.2f\n', y)
una cadena de caracteres, el valor de la
variable y segn el formato indicado y
finalmente salta de lnea.
La orden fprintf slo se usara para crear
ficheros con modo w.
Ejemplo:
fscanf sirve para ver la informacin de
[A,contador]=fscanf(fid,formato)
tipo texto, es decir legible, que contiene
el fichero identificado con fid. Esta
informacin se almacena en un vector A y
en contador se almacena el nmero total
de datos que contiene el fichero.
Ejemplo:
La opcin [14 inf] estructura la variable A
[A,contador]=fscanf(fid,formato,[14
como una matriz de 14 filas hasta el final
inf])
de los datos
49
8.
Realizar la misma operacin del ejercicio 6 creando un fichero de texto plano
(pone extensin .dat) haciendo uso de la ayuda del punto 7 y visualzalo con un editor
de textos.
>> v1=rand(1,3);v2=rand(1,3);v3=rand(1,3);v4=rand(1,3);v5=rand(1,3);
>> alea3=fopen('aleatorios3.dat','w')
alea3 =
3
>> fprintf(alea3,'%8.7f %8.7f %8.7f %8.7f %8.7f \n',v1,v2,v3,v4,v5)
ans =
153
>> fclose(alea3)
ans =
0
9.
Leer el fichero de precipitaciones anual precip.txt que contiene los campos
(Ao, Enero, Febrero, .... Noviembre, Diciembre, Total) para ello usa el comando type.
observas algn error en los datos?. Indicalos. A continuacin realiza las siguiente
operaciones:
(a)
Extraer las precipitaciones en cada uno de los meses con la ayuda indicada en
el punto
6. Si se usara la funcin interna load se hara de la siguiente forma: >>
load(precipt.txt). Si adems se quisiera extraer la informacin de la precipitacin
total anual en una variable llamada agno y las precipitaciones en cada uno de los
meses
en
una
variable
llamada
mes
se
hara:
>>agno=precip(:,1);
mes=precip(:,2:14).
Hazlo ahora usando los comandos de la ayuda del punto 7 de esta seccin
>> load precip.txt
>> agno=precip(:,1);
>> mes=precip(:,2:14);
(b)
Dibujar en una grfica de la evolucin de la precipitacin anual del mes de
enero en los diferentes aos.
>> plot(agno,mes(:,1))
50
200
180
160
p re c ip it a c i n e n e ro
140
120
100
80
60
40
20
0
1980
1985
1990
1995
aos
2000
2005
2010
(c)
Dibujar en una nica grfica (usa el comando figure antes de hacerlo) la
evolucin de la precipitacin anual de todos los meses y del total de los diferente
aos.
>>
>>
>>
>>
figure
hold on
plot(agno,mes(:,14),'k')
plot(agno,mes)
Precipitaciones 1983-2010
8000
7000
6000
precipitacin
5000
4000
3000
2000
1000
0
1980
1985
1990
1995
aos
2000
2005
2010
%La funcin de color negro es la de las precipitaciones totales a lo largo de los diferentes aos,
en la grfica tambin podemos observar esos errores que anteriormente hemos visto a simple
vista en el documento.
(d)
Chequear si la columna de precipitacin total corresponde a la suma total de las
precipitaciones de los meses. Si no fuera as construye otro fichero en el que se
escriba el dato de precipitacin correcto para un mes concreto cuando la discrepancia
entre la suma mensual difiere mucho de la precipitacin total, para ello considera que
la precipitacin total es correcta, y si la precipitacin total no difiere mucho de la suma
de las precipitaciones mensuales para un ao sustituye el valor de esta suma en el
dato de precipitacin total. Hazlo en un script precip_bien.m. En este script debes
incorporar la visualizacin por pantalla del ao donde se ha detectado un error, de la
suma total mensual y de la precipitacin total. Si la suma mensual difiere mucho de la
precipitacin total que ndique adems el mes y la precipitacin de ese mes que es
51
errnea. Llama a este fichero de datos con los errores corregidos precip_bien.dat.
EDIT
%precip_bien1
[nf,nc]=size(mes);
for i=1:1:nf
A=mes(i,1:nc-1);
z=sum(mes(i,1:nc-1));
total=mes(i,nc);
for j=1:1:nc-1
if z~=total & A(j)>total
%consideramos que total est bien y el error se encuentra
%en A(j)
disp(['ERROR EN UN MES'])
disp(['ao:'])
disp([agno(i)])
disp(['mes:'])
disp([j])
disp(['precipitacin del mes erronea:'])
disp([A(j)])
disp(['precipitacin total anual erronea:'])
disp([z])
disp(['precipitacin total anual correcta:'])
disp([total])
t=z-total;
mes(i,j)=A(j)-t;
z=total;
end
end
if z~=total
%el error se encuentra en el total
disp(['ERROR EN LA SUMA'])
disp(['ao:'])
disp([agno(i)])
disp(['precipitacin total anual correcta:'])
disp([z])
disp(['precipitacin total anual erronea:'])
disp([total])
mes(i,nc)=z;
end
end
precip_bien=[agno,mes];
%save precip_bien.dat precip_bien ascii
Lnea de comandos:
>> load precip.txt
>> mes=precip(:,2:14);
>> agno=precip(:,1);
>> precip_bien1
ERROR EN UN MES
ao:
1985
mes:
10
precipitacin del mes erronea:
7205
precipitacin total anual erronea:
52
7643
precipitacin total anual correcta:
510.5000
ERROR EN LA SUMA
ao:
1994
precipitacin total anual correcta:
223.5000
precipitacin total anual erronea:
220.5000
ERROR EN LA SUMA
ao:
1997
precipitacin total anual correcta:
318.5000
precipitacin total anual erronea:
336.5000
ERROR EN UN MES
ao:
1998
mes:
10
precipitacin del mes erronea:
765.5000
precipitacin total anual erronea:
1.0485e+003
precipitacin total anual correcta:
358.5000
ERROR EN LA SUMA
ao:
2002
precipitacin total anual correcta:
724
precipitacin total anual erronea:
845.5000
ERROR EN LA SUMA
ao:
2007
precipitacin total anual correcta:
576
precipitacin total anual erronea:
617
53
(e)
Usando las rdenes de fopen, etctera indicadas en la ayuda del punto7, crea
otro fichero con el nombre precip_modificado.dat en el que se aada la fila media que
corresponde a la media aritmtica de la precipitacin mensual y como ltima columna
la media aritmtica mensual de todos esos aos. Crea un script para hacerlo e
incorpora en este script la representacin grfica, en dos figuras, de los valores
medios indicados.
EDIT:
%media_precip
[nf,nc]=size(mes);
for i=1:1:nf
media=mean(mes(i,1:nc-1));
m(i,1)=media';
end
for j=1:1:nc-1
media1=mean(mes(1:nf,j));
m2(1,j)=media1;
end
precip_modificado=([agno,mes,m]);
subplot(2,1,1)
plot(agno,m)
t=[1:12];
subplot(2,1,2)
plot(t,m2)
>> media_precip
80
70
60
50
40
30
20
10
1980
1985
1990
1995
aos 1983-2010
2000
2005
2010
6
meses Enero(1)-Diciembre(12)
10
12
70
60
50
40
30
20
10
0
>> p1=fopen('precip_modificado.dat','w');
>> fprintf(p1,'%6.5f %6.5f \n',precip_modificado,m2);
>> fclose(p1);
54
Si suponemos que x'n son los valores exactos de la sucesin se puede estimar el error
de redondeo de xn. Escribir un programa en MATLAB (.m) que resuelva esta sucesin y
visualice en pantalla, desde n igual a 1 hasta 20 iteraciones, xn, x'n, el error absoluto
y el error relativo
obtienes.
%En la teora en la ltima diapositiva de aritmtica aparece la solucin a este
problema pero en vez de 20 trminos aparecen 23, al hacerlo nosotros nos damos
cuenta de que nos aparecen los 19 primeros trminos iguales a los de la diapositiva y
el 23 de la diapositiva como nuestro trmino 20 pero el 20, 21 y 22 de la diapositiva
(en negro) en nuestro programa no aparecen, esto es debido a que en la diapositiva se
repiten en esos trminos los trminos 17,18 y 19 (en verde).
Edit:
55
%algoritmo
clear
%Pongo el clear ya que si le pides que te haga un vector de 22 y luego uno
%de 20 con este mismo scrip devuelve al pedirle el de 20 el de 22, sin
%embargo al poner el clear limpia lo anterior y te devuelve el vector de
%los elementos que le pides
x(1)=1;
x(2)=1/3;
n=1;
N=20;
while n<=N
if n<(N-1)
x(n+2)=((13/3)*x(n+1))-((4/3)*x(n));
end
x1(n)=(1/3)^(n-1);
errorabsoluto(n)=abs(x(n)-x1(n));
errorrelativo(n)=(errorabsoluto(n))/(abs(x1(n)));
n=n+1;
end
disp('x=');disp(x)
disp('x1=');disp(x1)
disp('error absoluto:');disp(errorabsoluto)
disp('error relativo:');disp(errorrelativo)
Lnea de comandos
>> algoritmo
x=
Columns 1 through 5
1.000000000000000
0.012345679012343
0.333333333333333
0.111111111111111
0.037037037037036
0.001371742112432
0.000457247370625
0.000152415789465
0.000005644977344
0.000001881468722
0.000000626394672
-0.000000029940803
-0.000000204941979
-0.000000848160840
0.333333333333333
0.111111111111111
0.037037037037037
0.001371742112483
0.000457247370828
0.000152415790276
0.000005645029269
0.000001881676423
0.000000627225474
Columns 6 through 10
0.004115226337436
0.000050805260180
Columns 11 through 15
0.000016935074827
0.000000205751947
Columns 16 through 20
0.000000056398875
-0.000003402107668
x1=
Columns 1 through 5
1.000000000000000
0.012345679012346
Columns 6 through 10
0.004115226337449
0.000050805263425
Columns 11 through 15
0.000016935087808
0.000000209075158
56
Columns 16 through 20
0.000000069691719
0.000000000860392
0.000000023230573
0.000000007743524
0.000000002581175
error absoluto:
1.0e-005 *
Columns 1 through 5
0
Columns 6 through 10
0.000000001267389
0.000000324532319
0.000000005070727
0.000000020283233
0.000000081133066
0.000005192517181
0.000020770068726
0.000083080274904
0.005317137593855
0.021268550375422
0.085074201501686
Columns 11 through 15
0.000001298129294
0.000332321099616
Columns 16 through 20
0.001329284398464
0.340296806006744
error relativo:
1.0e+003 *
Columns 1 through 5
0
Columns 6 through 10
0.000000000000003
0.000000000063878
0.000000000000037
0.000000000000444
0.000000000005323
0.000000009198388
0.000000110380661
0.000001324567931
0.002288853385213
0.027466240622556
0.329594887470678
Columns 11 through 15
0.000000000766532
0.000015894815175
Columns 16 through 20
0.000190737782101
3.955138649648134
2.
Matlab/Octave utilizan el formato
representacin de nmeros reales:
a.
IEEE754 en
doble
precisin
para
la
57
computador es eps=2-52
>> eps
ans =
2.2204e-016
>> 2^(-52)
ans =
b.
2.2204e-016
Realiza la siguiente operacin a=1+2-52, b=1-a. Qu valor se obtiene?Por qu?
>> a=1+(2^(-52))
a=
1.0000
>> b=1-a
b=
-2.2204e-016
Este error se debe al error de redondeo, ya que 2^(-55) es un nmero muy
pequeo. El error es del orden del eps del ordenador. La operacin la tiene en
cuenta pero no representa el formato del resultado.
c.
Realiza la siguiente operacin a=1+2-53, b=1-a. Qu valor se obtiene?Por qu?
Qu tipo de error se produce y por qu?
>> a=1+2^(-53)
a=
1
>> b=1-a
b=
d.
0
Matlab considera (2^(-53)) como si fuese cero debido a su reducido tamao, ya
que est por debajo de la precisin. Este error se debe al error de redondeo, se
produce cuando el nmero tiene una representacin binaria infinita. No se
puede representar debido a su largo excesivo.
Ejecuta el siguiente script. Son correctos los resultados? Razona tu respuesta
>> ejercicio
%ejercicio
k=1;
while ((1.0+2^(-k))>1.0)
k=k+1;
end
fprintf(1,'El nmero de bits de la mantisa es %d\n', k-1);
fprintf(1,'El eps calculado es %e\n', 2^-(k-1));
58
>> decimal
nmero decimal?19
p=
1
4.
0
0
1
1
Crea la funcin bin2dec_entero que realice el funcionamiento inverso, dado un
>> dec2bin_entero(19)
ans =
1 0 0 1 1
vector en binario devuelva su valor en decimal.
5.
59
60