


































Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Base a la programacion, temas, funcionamiento realidad
Tipo: Apuntes
1 / 42
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!



































En este “libro” encontraréis una colección de aproximadamente 80
programas resueltos en MATLAB.
Entre ellos se encuentran todos los programas resueltos en clase por
el profesor en el curso 2015/16, además de los ejercicios de boletín propuestos y otros ejercicios adicionales de examen, organizados por orden alfabético (tal y como los encontré en mi carpeta).
Todos estos programas son los que hice de cara al examen, espero que os sirvan para aprobar.
-Vicky-
function r=busqueda_lineal_todos(v,x) %Devuelve en r un ector con todas las posiciones donde haya coincidencia. %r=1 si no hay ninguna L=length(v); r=[]; %vector vacío inicialmente cont=1; for i=1:L if v(i)==x %r=[r i]; %añadimos una componente más al vector (esta sería una %forma de hacerlo) r(cont)=i; cont=cont+1; %Segunda forma de hacerlo end end end
%Ejercicio 3.5: Identificación de anagramas
function anagrama(cad1,cad2) r=identificaSimbolo(cad1,cad2); if r== disp('Es un anagrama'); else disp('No es un anagrama'); end end
function [r]=identificaSimbolo(cad1,cad2) N=length(cad1); M=length(cad2); i=1; j=1; r=0; %Suponemos inicialmente que no hay coincidencia alguna for i=1:N for j=1:M if cad1(i)==cad2(j) r=1; end end end end
%Cálculo del área círculo
function area_circulo r=input('Radio del círculo: '); a=area(r); fprintf('El área es %f\n',a); end
function A=area(radio)
A=3.1415radioradio; end
%Ejercicio 3.6: Búsqueda de una cadena dentro de otra
function [pos]=busca_cadena(buscada,texto) N=length(texto); M=length(buscada); r=0; cont=0; i=1; pos=[]; while i<=N && r== k=i; for j=1:M if buscada(j)==texto(i) cont=cont+1; pos=[pos,i]; end if cont==M r=1; else pos=[]; end i=k+1; end end
% Búsqueda binaria function busqueda_algoritmo v=[5 -2 0 3 7 9 9]; x=input('x= '); r=busqueda_binaria(v,x); %r=posicion del elemento buscado en el vector v. =0 si no lo encuentra disp(r); end
function r=busqueda_binaria(v,x) %Suponemos vector v ordenado de menor a mayor L=length(v); i=1; j=L; while i<=j %mientras i sea menor que j, el vector puede seguir dividiendose m=fix((i+j)/2); %fix permite truncar if v(m)==x r=m; %La hemos encontrado i=j+1; %Para forzar salida del bucle elseif v(m)>x j=m-1; %Nos quedamos con la mitad izquierda de v elseif v(m)<x
function c=cont_n(i,n) v=zeros; v=transf_vect(i); %Función que nos transforma el número i en un vector N=length(v); c=0; for i=1:N if n==v(i) c=c+1; end end end
function v=transf_vect(i) m=10; cont=1; while fix(i/m)~= cont=cont+1; m=m10; end N=cont; %Dimensión del vector que queremos crear m=(10^(N-1)); v=zeros; j=0; while m>= j=j+1; if j<=N v(j)=fix(i/m); i=i-v(j)m; end m=m/10; end end
%Función que, recibiendo una cadena de caracteres, recorre la cadena %sustituyendo por guiones cada espacio en blanco
function rellenar_guiones s=input('Cadena= ','s'); %se utiliza 's' para que pueda leer los caracteres re=rellena(s); %función que devuelve la cadena con guiones fprintf('Cadena con guiones=%s\n',re); % el "%s" se usa para que devuelva caracteres end
function re=rellena(s) N=length(s); for i=1:N if s(i)== re(i)=95; else re(i)=s(i); end end end
% comparación de tiempo de ejecución de dos algoritmos N=1000;
% Algoritmo A: mostrar por pantalla número de 1 a N for i=1:N %creamos el vector en el que cada componente coincide con su posición v(i)=i end for i=1:N disp(v(i)); end t1=toc; %La complejidad del primero es mayor porque es como mínimo de 2N, pues %hay realizar dos iteraciones
%Algoritmo B: Mostrar por pantalla número 1 a N for i=1:N disp (i); end t2=toc; fprintf('Algoritmo A=%f seg\n', t1) fprintf('Algoritmo B=%f seg\n', t2)
%La complejidad de este problema es mucho menor, tan solo tiene que %realizar una iteración
% Ejercicio 1.3: Determinar si hay valores iguales
a=input('Introduzca primer valor(a): '); b=input('Introduzca segundo valor(b): '); c=input('Introduzca tercer valor(c): '); cont=0; if a==b cont=cont+1; end if a==c cont=cont+1; end if b==c cont=cont+1; end if cont>= disp('los tres son iguales'); elseif cont== disp('hay dos valores iguales'); elseif cont< disp('no hay valores iguales'); end
%Ejercicio 2.8: Identificación del tipo de triángulo
function determina_triangulo a=input('a= '); b=input('b= '); c=input('c= '); %Comprobamos que es un triángulo if (a+b)>c && (a+c)>b && (b+c)>a %Comprobamos si es equilátero if a==b && a==c disp('Es un triángulo equilátero'); elseif a==b || a==c || b==c disp('Es un triángulo isósceles'); else disp('Es un triángulo escaleno'); end else disp('No es un triángulo'); end end
% Determinar si un número es primo n=input('Introduce n: '); d=2; while mod(n,d)~= d=d+1; end if d==n disp('Es primo'); else disp('No es primo'); end
% Ejercicio 1.4: Ecuación de segundo grado
a=input('Introduzca coeficiente a: '); b=input('Introduzca coeficiente b: '); c=input('Introduzca coeficiente c: '); %calculamos el discriminante d=bb-4ac; if d< disp('Soluciones complejas'); d=-d; im=sqrt(d)/(2a); re=-b/(2a); fprintf('x1=%.2f\n+i%.2f\n',re,im); fprintf('x2=%.2f\n-i%.2f\n',re,im); else x1=(-b+sqrt(d))/(2a); x2=(-b-sqrt(d))/(2*a);
if x1==x disp('Solución doble'); fprintf('x=%.2f\n',x1); elseif (x1==0 & x2==-0)|(x1==-0 & x2==0) disp('Solución doble'); disp('x=0'); else fprintf('x1=%.2f\n',x1); fprintf('x2=%.2f\n',x2); end end
% Integración numérica. Aproximación de integrales definidas por el método de Euler
function ej_Euler_I a=input('a= '); b=input('b= '); n=input('n= '); %Pedimos el número de intervalos A=Euler_I(a,b,n); disp(A); end
%----------------------------- function A=Euler_I(a,b,n) a=0; d=(b-a)/n; A=0; for k=0:n- A=A+df(a+dk); end end
%----------------------------------
function y=f(x) y=x^2; end
%%%%Hacerlo también mediante el método de los trapecios
%%%%Hacer la combinación con la interpolación
% Integración numérica. Aproximación de integrales definidas por el método de Euler con trapecios
function ej_Euler_II a=input('a= '); b=input('b= '); n=input('n= '); %Pedimos el número de intervalos A=Euler_I(a,b,n); disp(A);
yast=a*xast+b; end end
%Ejemplo mínimos cuadrados
function ej_minimos_cuadrados %Datos de ejemplo (aproximadamente sobre y=2*x+1) x=[0 1 2 3 4 5]; y=[0.8 3.2 4.7 6.9 9.3 11.6]; %Calculamos coeficientes de regresión [a,b]=min_cuad(x,y); %Representación gráfica plot(x,y,'k.',[x(1) X(N)],[ax(1)+b,ax(N)+b],'b') end
%-----------------------------
function min_cuad(x,y) N=length(x); %Cálculo de sumatorios sxk=0; syk=0; sxkyk=0; sxk2=0; for k=1:N sxk=sxk+x(k); syk=syk+y(k); sxkyk=sxkyk+x(k)y(k); sxk2=sxk2+x(k)x(k); end %Se calculan los coeficientes usando los sumatorios calculados y aplicando las fórmulas correspondientes a=(Nsxkyk-sxksyk)/(Nsxk2-sxksxk); b=(syk-a*sxk)/N; end
%Ejemplo ingtegración de EDOs: %Problema: dx(t)/dt=-2*x(t); x(0)=
function ejemplo_edo tfinal=input('tfinal '); %Instante de tiempo en el que queremos finalizar la simulación h=input('h= '); [t,x]= Euler_II(tfinal,h );%Deberá devolver dos vectores, el del tiempo y el de x plot(t,x); %Gráfica end
%----------------------- function [t,x]=Euler_II(tfinal,h) %Condiciones iniciales
t(1)=0; %Consideramos que el vector de tiempo comienza en 0 x(1)=1; %Condición inical en x(0), en MATLAB no podemos poner x(0) porque no hay componente 0 de un vector k=1; while t(k)<tfinal x(k+1)=x(k)+h(-2x(k)); t(k+1)=t(k)+h; k=k+1; end end
%Ejemplo EDO Euler: proyectil que cae al suelo en vertical
%F=ma %-mg=m(d^2x(t))/dt^ %d^2x(t)/dt^2=-g %x(0)= %dx(t)/dt)=vo=10 m/s en t=
%Este problema no se puede plantear como el de la taza de café, ya que es %de segundo orden, sino que habrá que plantearlo como un sistema de dos %ecuaciones de primer orden
%----> dv(t)/dt=-g && dx(t)/dt=v(t) %----> condiciones iniciales: x(0)=0; v(0)=vo;
%Ejemplo integración : proyectil que cae sin rozamiento
function ejemplo_edo_proyectil tfinal=input('tfinal '); %Instante de tiempo en el que queremos finalizar la simulación h=input('h= '); x=input('T0= '); [t,T]= Euler_II(tfinal,h,T0 );%Deberá devolver dos vectores, el del tiempo y el de x plot(t,T); %Gráfica end
%----------------------- function [t,x]=Euler_II(tfinal,h) %Condiciones iniciales t(1)=0; %Consideramos que el vector de tiempo comienza en 0 x(1)=0; %Condición inical en x(0), en MATLAB no podemos poner x(0) porque no hay componente 0 de un vector v(0)=10; %(m/s) Velocidad inicial k=1; flag=0; while t(k)<tfinal v(k+1)=v(k)+h(-9.81) x(k+1)=x(k)+h(v(k)); t(k+1)=t(k)+h; % Si queremos guardar tiempo hasta que T<40ºC if flag == 1 && x(k)<= fprintf('T=40º en t=%f\n',t(k));
%de segundo orden, sino que habrá que plantearlo como un sistema de dos %ecuaciones de primer orden
%----> dv(t)/dt=-g && dx(t)/dt=v(t) %----> condiciones iniciales: x(0)=0; v(0)=vo;
%Ejemplo integración : proyectil que cae sin rozamiento
function ejemplo_edo_tiro_vertical tfinal=input('tfinal '); %Instante de tiempo en el que queremos finalizar la simulación h=input('h= '); [t,x]= Euler_II(tfinal,h );%Deberá devolver dos vectores, el del tiempo y el de x plot(t,T); %Gráfica end
%----------------------- function [t,x]=Euler_II(tfinal,h) %Condiciones iniciales t(1)=0; %Consideramos que el vector de tiempo comienza en 0 x(1)=0; %Condición inical en x(0), en MATLAB no podemos poner x(0) porque no hay componente 0 de un vector v(0)=10; %(m/s) Velocidad inicial k=1; flag=0; % while t(k)<tfinal while x(k)>=0 %Si tenemos otras condiciones que nos hagan parar antes v(k+1)=v(k)+h(-9.81) x(k+1)=x(k)+h(v(k)); t(k+1)=t(k)+h; k=k+1; end
%Ejemplo EDO Euler: proyectil que cae al suelo en vertical con rozamiento
%F=ma %-mg=m(d^2x(t))/dt^ %d^2x(t)/dt^2=-g %x(0)= %(dx(t)/dt)=vo=10 m/s en t=
%Este problema no se puede plantear como el de la taza de café, ya que es %de segundo orden, sino que habrá que plantearlo como un sistema de dos %ecuaciones de primer orden
%----> dv(t)/dt=-g-kf/mv(t)|v(t)| && dx(t)/dt=v(t) %----> condiciones iniciales: x(0)=0; v(0)=vo;
%Ejemplo integración : proyectil que cae sin rozamiento
function ejemplo_edo_tiro_vertical_rozamiento
tfinal=input('tfinal '); %Instante de tiempo en el que queremos finalizar la simulación h=input('h= '); [t,x]= Euler_II(tfinal,h );%Deberá devolver dos vectores, el del tiempo y el de x plot(t,T); %Gráfica end
%----------------------- function [t,x]=Euler_II(tfinal,h) %Condiciones iniciales t(1)=0; %Consideramos que el vector de tiempo comienza en 0 x(1)=0; %Condición inical en x(0), en MATLAB no podemos poner x(0) porque no hay componente 0 de un vector v(0)=10; %(m/s) Velocidad inicial k=1; flag=0; % while t(k)<tfinal while x(k)>=0 %Si tenemos otras condiciones que nos hagan parar antes v(k+1)=v(k)+h(-9.81-0.5/5v(k)abs(v(k)) x(k+1)=x(k)+h(v(k)); t(k+1)=t(k)+h; end k=k+1; end
%Ordenación burbuja (Bubble sort) %[4,-1,3,2], se comparan dos elementos y se ve si están en orden o no, en %el ultimo caso, se reordena; se repite con todas las parejas posibles. %Tras una primera pasada, el primer elemento coincidirá con el más pequeño.
%Se hacen tantas pasadas -1 como elementos tenga el vector
%PASADA 1: n-1 comparaciones// PASADA 2: n-2 comparaciones// En cada pasada %realizamos una iteración menos
%Ordenación por el método de la burbuja function ejemplo_ordenacion_burbuja v=[4 -1 3 2]; v=ordena_burbuja(v); disp(v); end
function v=ordena_burbuja(v) n=length(v); i=1; while i<=n-1 %Realizamos n-1 pasadas for j-1:-1:i if v(j)>v(j+1) %Si están fuera de orden aux=v(j); %los intercambiamos v(j)=v(j+1);
%v=[2 5 3 6 -1 8 4] %pivote=v((i+j)/2); se comparan los valores del vector con el pivote, %intercambiando si sus valores no están en el orden correcto.
% ATENCIÓN: floor redondea al entero más pequequeño y fix tan solo trunca, % la diferencia se observa en números negativos %Ordenación QuickSort function ejemplo_Quicksort v=[2 5 3 6 -1 8 4]; L=length(v); v=quicksort(v,1,L); disp(v); end
function v=quicksort(v,inicio,fin) %Función recursiva que ordena vector v entre componente inicio y fin i=inicio; j=fin; pos_pivote=fix((i+j)/2); pivote=v(pos_pivote); while i<=j % Buscamos componentes mayores que el pivote a su izquierda while v(i)<pivote i=i+1; end % Buscamos componentes menores que el pivote a su derecha while v(j)>pivote j=j-1; end %Intercambiamos componentes i y j if i<=j aux=v(i); v(i)=v(j); v(j)=aux; i=i+1; j=j-1; end end if inicio<j %Si la mitad inferior mide 2 o más componentes v=quicksort(v,inicio,j); %Ordeno mitad inferior del vector end if i<fin %Si la mitad superior mide 2 o más componentes v=quicksort(v,i,fin); %Ordeno mitad superior del vector end end
%Ejercicio 3.2: Determina si una cadena es palíndromo
function [r]=es_palindromo(cad) cad_esp=sinEspacios(cad); cad_may=mayusculas(cad_esp); N=length(cad_may); i=0; j=N+1;
r=1; while i<=j i=i+1; j=j-1; if cad_may(i)~=cad_may(j); r=0; break end end if r== disp('Es palíndromo'); else disp('No es palíndromo'); end end
function cad_esp=sinEspacios(cad) N=length(cad); k=0; for i=1:N if cad(i)~=' ' k=k+1; cad_esp(k)=cad(i); end end end
function cad_mayusc=mayusculas(cad) N=length(cad); for i=1:N if cad(i)<='z' && cad(i)>='a' cad_mayusc(i)=cad(i)+'A'-'a'; else cad_mayusc(i)=cad(i); end end end
function [r]=esperfecto(n) n=input('Introduzca n: '); sum=0; for i=1:n- if mod(n,i)== sum=sum+i; end end if sum==n r=1; else r=0; end end