Ejemplos Matlab
Ejemplos Matlab
Enlaces
Ficheros en Matlab Online: https://drive.matlab.com/
Matlab Online: https://matlab.mathworks.com/
Ejemplos
Programas ejemplo de Matlab/Octave.
Precisión
En Matlab/Octave no se pueden representar infinitos reales entre dos reales. Por eso eps
nos da el salto entre un número real y el siguiente distinto que se puede representar.
eps(e100)
eps(0)
Entrada/salida
Ejemplo de fprintf
clc
clear
res=2*pi;
fprintf('\ndatos\n-----\nPi vale %f y 2 pi vale %f\n',pi,res)
fprintf('\nUn entero con signo y alineado con espacios %+4d y con ceros a la izquierda %+04d\n',6,6)
Ejemplo de un programa con entrada y salida de datos por teclado y pantalla usando input
y fprintf
clc % limpiar salida
clear % borrar variables anteriores
x=input('Dame un número: ');
x2= x*2;
fprintf('El número que me has dado es %f y el doble es %f\n',x, x2);
2
M=1000;
TextoM=['Masa = ',num2str(M),' Kg'];
disp(TextoM);
x = sqrt(-2) +3;
fprintf(' %f %+f j\n', real(x), imag(x))
Calcula π calculando cuántos puntos aleatorios caen en un círculo frente a los totales del
cuadrado.
R=1;
Npuntos=100000000; % columnas
Datos=random('Uniform',-R, R, 2, Npuntos);
PiEstimado=4*Ncirculo/Npuntos % calculamos ?
3
Gráficas
Crear una gráfica:
clc
clear
close all
x=[0:0.5:2*pi];
y=sin(x);
plot(x,y,'r*')
subplot(2,3,[1 3]);
plot(urteak,nactot,'rs-.');
hold on
plot(urteak,c3);
plot(urteak,c4);
title('Nacimientos')
xlabel('Años')
subplot(2,3,6);
plot(urteak,nactot,'go');
Cómo modificar sólo los valores de un vector si los valores que están en la misma posición
de otro vector cumple una condición (valen 3 o 4).
clc
clear
m=readmatrix('studentMarks.csv');
clasper=m(:,5);
f= (clasper==3 | clasper==4);
nota=m(:,3);
nota(f)=nota(f)+44;
disp(nota)
4
Giro de puntos.
clc
clear
m = [1, 1, 2, 2; 1, 2, 1, 2];
plot(m(1,:) , m(2,:), 'b*')
axis([-3 3 -3 3])
a=pi/3;
r=[cos(a) -sin(a); sin(a) cos(a)];
p= r*m;
hold on
f=plot(p(1,:) , p(2,:), 'r*');
pause
for a=[0:pi/16:20*pi]
r=[cos(a) -sin(a); sin(a) cos(a)];
p= r*m;
hold on
f=plot(p(1,:) , p(2,:), 'r*');
pause(0.2)
delete(f)
end
Funciones
Función que devuelve dos valores:
function [rp,rn]=rcs(a)
% devuelve las dos raíces de la raíz cuadrada del número
rp=+sqrt(a);
rn=-sqrt(a);
end
Se puede pedir en un input los valores de un vector, o pedir escalares para pasarlos a una
función.
clc
clear
coef=input('Dame los coeficientes: ');
a=coef(1); % alternativa a esto: a=input('Dame el coef. a: ');
b=coef(2);
c=coef(3);
[h,j]=funcion(a,b,c);
Función conviertecmafin.m
function [ pies,pulgadas ]=conviertecmafin(hcm)
pies=floor(hcm/30.48); % podemos usar fix
pulgadas= (hcm - pies*30.48) / 2.54;
end
Función que eleva al cuadrado, que funciona también con vectores por poner el punto antes
del signo de elevar.
function r=cuadr(x)
% eleva al cuadrado el parámetro
% vector friendly f
r=x.^2;
end
5
Programa que lee las notas del fichero y las faltas, calcula la nota media de dos columnas,
y les suma 2 si una persona no tiene faltas.
Posteriormente elige las columnas 2, 3 y 4, y calcula el mínimo por filas. Si el mínimo por
persona es menor a 3, asigna a esa persona esa nota mínima y al resto se les mantiene la media.
n=readmatrix('studentMarks.csv');
faltas=n(:,5);
m= (faltas==0);
notas= (n(:,2)+n(:,3)) / 2;
notas(m)=notas(m)+2;
t=n(:,[2:4]);
vm=min(t,[],2);
f=(vm <3);
notas(f)=vm(f);
Función escaroelalquiler.m
function clasif=escaroelalquiler(alquiler)
if alquiler < 400
clasif="Es un zulo o estafa";
elseif alquiler<600
clasif="Baratísimo";
elseif alquiler<800
clasif="La clavada habitual";
elseif alquiler < 900
clasif="clavada grande";
elseif alquiler < 1000
clasif="Carísimo";
else
clasif="¿Te has equivocado?";
end % end del if
end % end de la función
Si no existe un fichero se queja, y si existe pide un vector de columnas y muestra una gráfica
con las dos primeras.
clc
clear
close
f=input('Dame el nombre del fichero');
if exist(f,'file')~=2
disp('Ese fichero no existe');
else
c=input("Dime columnas");
m=readmatrix(f,'Range',c);
x=m(:,1);
y=m(:,2);
plot(x,y,'r*');
end
Programa que muestra que si nos dan un vector, el if puede tener problemas y debemos
usar any para filtrar y saber si nos han dado algún negativo.
n=input('Dame un número: ');
v=input('Dame otro número: ');
if any(n<0) || any(v<0)
fprintf('ALGUNO es negativo\n');
else
fprintf('Es positivo todo\n');
end
7
Función que verifica si los vectores tienen la misma longitud antes de calcular e informar si
es determinante es negativo.
function [iguales,im]=correctos(a,b,c)
if length(a) == length(b) && length(b)==length(c)
iguales = true; % son iguales
else
iguales = false; % son distintos
end
if iguales && any((b.^2-4*a.*c) <0)
im = true; % alguna raíz es imaginaria
else
im = false; % raíces reales
end
end
% Es lo mismo poner estas dos expresiones:
% if iguales
% if iguales == true
Función volcil.m
function [v,mensaje,ver,veh]=volcil(r,h)
if any(r<0) || any(h<0)
mensaje='Datos negativos';
ver=find(r<0); % ind radios neg
veh=find(h<0); % ind h neg
r=r(r>=0);
h=h(r>=0);
r=r(h>=0);
h=h(h>=0);
v=pi*r.^2.*h;
else
v=pi*r.^2.*h;
mensaje='todo bien';
ver=[];
veh=[];
end
end
8
Formas de hacer ciclos con vectores de cadenas (sólo usar comillas dobles):
clc
clear
for saludo=["Hola","Kaixo","hello"]
disp(saludo)
end
ciudades= ["Vitoria-Gasteiz","DSS","BI"];
for nf=ciudades
f=sprintf("datos- %s.csv",ciudad);
disp(f);
end
for n=1:length(ciudades)
disp(ciudades(n));
end
for n=1:length(ciudades)
f=sprintf("datos- %s.csv",ciudad(n));
t=readmatrix(f);
plot(t(:,1),t(:,2));
ng=sprintf('graf- %d.png',n);
saveas(gcf,ng);
close
end
9
Hacemos 100 tiradas de dado y contabilizamos cuántas veces sale un 5 en la posición 5 del
vector c:
c=zeros(1,6); % cuenta el número de tiradas de cada valor del dado
for n=1:100
t=randi([1 6],1,1); % tirada de dado del 1 al 6
c(t)=c(t)+1; % sumo 1 en la celda del valor de la tirada
end
tiradas=sum(c);
disp(c)
Pedir números mientras se escriba un negativo. Además cuenta el número de veces que se
introducen negativos.
clc
clear
n=0;
num=input('Dame un número: ');
while num<0
disp('Es negativo')
n=n+1;
num=input('Dame otro: ');
end
disp('Por fin me has dado un positivo');
fprintf('Me has dado el %f después de %d intentos fallidos.\n', num,n);
for hace tomar a la variable los valores del vector de forma consecutiva.
10
clc
clear
for x=[4 2 7 6 5]
fprintf('otro valor es %d\n',x)
end
11
Búsqueda en un vector.
v=[3 4 5 8];
n=4; % quiero buscar este número en el vector
p=1;
while p<=length(v) && v(p)~=n
p=p+1;
end
end
plot(x,y);
nombrefichgraf=sprintf('datos- %d.png',n);
saveas(gcf,nombrefichgraf); % get current figure
close
end % if
end % for
Se puede asignar la figura a una variable por si tenemos varias gráficas activas.
fig=figure; % nombre para gráfica nueva
plot(x,y);
nombrefichgraf=sprintf('grafs/datos- %d.png',n);
saveas(fig,nombrefichgraf)
close fig
Integración
Programa que va integrando el movimiento en el tiempo de un objeto móvil cada medio
segundo, almacena los valores de tiempos y velocidad y lo grafica.
13
clc
clear all
hold on
d=0; % distancia
v=3; % velocidad
s=0; % segundo
maxseg=30; % tiempo max
dt=0.5; % actualizamos cada dt segundos
vd=[d]; % vector con distancias
vt=[0]; % vector con tiempos
while s<=maxseg
plot([s],[d],'r*');
vt=[vt s]; % Adjuntar un valor de s al vector vt por la derecha
vd=[vd d];
d=d+v*dt;
s=s+dt;
v=v*0.9; % rozamiento
end
plot(vt, vd,'r') % tiempo contra distancia
plot([0 30],[0 0],'k'); % eje cero en negro