Bucles simples
for var = vector
Instrucciones que deben ejecutarse
end
El argumento vector puede ser efectivamente un vector. Se puede de…nir
con el comando:
inicio : incremento : …n
Comando break: interrumpe la ejecución del bucle.
Bucles simples
Pn
Ejemplo. Calcular la serie i =1 i2
function serie=SumaCuadrados(n)
serie=0;
for i=1:n
serie=serie+i*i;
end
Bucles simples
Ejercicio 1. Escribir un programa para calcular n!.
Ejercicio 2. Escribir un programa cuya variable de entrada sea una matriz
y que calcule la suma de todos sus números.
Nota: hay que utilizar un bucle for doble y el comando size para hallar el
número de …las y columnas de la matriz.
Ejercicio 1
function fact=factorial(n)
fact=1;
for i=1:n
fact=fact*i;
end
Ejercicio 2
function S=MatlabPractica3Ej2(A)
m=size(A,1);
n=size(A,2);
S=0;
for i=1:m
for j=1:n
S=S+A(i,j);
end
end
Bucles condicionales
while condición
Instrucciones que deben ejecutarse mientras la condición sea cierta.
end
Ejemplo. Calcular el valor de n 2 N más pequeño tal que 2 n <"
function n=Epsilon(eps)
n=1;
h=2^(-n);
while h>=eps
n=n+1;
h=2^(-n);
end
Ejercicio 3. Usando el comando while escribir un programa para calcular
n!.
Ejercicio 3
function fact=MatlabPractica3Ej3(n)
fact=1;
j=2;
while j<=n
fact=fact*j;
j=j+1;
end
Entradas de usuario
Comando input:
x=input(’Introduzca valores de x entre corchetes:’)
Si terminamos con ; después de introducir el valor de x no lo escribirá en
la pantalla. En otro caso, lo volverá a imprimir en pantalla.
Comando disp: permite escribir texto encerrado entre apóstrofes y el valor
actual de una variable. Por ejemplo:
a=2;
disp(a);
disp(‘unidades’);
Obtenemos en pantalla:
2
unidades
Entradas de usuario
Comando fprintf:
fprintf (formato; matrices)
formato: texto escrito entre apóstrofes. Dentro del texto se utilizan los
especi…cadores %e, %f, %g, %d, %s para indicar dónde se escribirán los
valores de las variables
matrices: variables que se quieren insertar en el texto.
%e: notación exponencial
%f: punto …jo o decimal
%d: variables enteras
%g: formato %e, %d o %f, el que sea más corto
%s: cadenas de caracteres
Entradas de usuario
Ejemplo:
a=2;
fprintf(‘El valor obtenido es nn %g unidades nn’, a)
La salida correspondiente es:
El valor obtenido es
2 unidades
nn nos indica retorno de carro.
Si ponemos %4.1g el valor correspondiente aparecerá usando cuatro
dígitos, uno de los cuales es decimal.
Entradas de usuario
Ejemplo. Calcular el valor de n 2 N más pequeño tal que 2 n < ". El
valor de epsilon se solicitará al usuario. Al …nal del programa se imprimirá
el valor de n con formato de númros enteros con algún comentario
explicativo.
function n=Epsilon
eps=input(’Introduzca el valor de epsilon:’);
n=1;
h=2^(-n);
while h>=eps
n=n+1;
h=2^(-n);
end
fprintf(’El valor de n es %d’,n);
Variables nargin y nargout
nargin: número de argumentos de entrada (al ejecutar la función desde la
línea de comandos)
nargout: número de argumentos de salida (al ejecutar la función desde la
línea de comandos)
Ejemplo: Vamos a modi…car el programa de cálculo del valor de n 2 N
más pequeño tal que 2 n < " :
function n=Epsilon3(eps)
if nargin<1
eps=input(’Introduzca el valor de epsilon:’);
end
n=1;
h=2^(-n);
while h>=eps
n=n+1;
h=2^(-n);
end
Variables nargin y nargout
Ejercicio 4. Modi…car el programa del ejercicio 3 de forma que si el
número de argumentos de entrada es menor que 1 se solicite esta
información mediante el comando input. Además, utilizar el comando
fprintf para imprimir la siguiente frase: ’El factorial de n es f ’. Imprimir n
y f en formato de enteros. Poner al …nal un salto de línea.
Variables nargin y nargout
Ejercicio 4. Modi…car el programa del ejercicio 3 de forma que si el
número de argumentos de entrada es menor que 1 se solicite esta
información mediante el comando input. Además, utilizar el comando
fprintf para imprimir la siguiente frase: ’El factorial de n es f ’. Imprimir n
y f en formato de enteros. Poner al …nal un salto de línea.
function fact=MatlabPractica3Ej4(n)
if nargin <1
n=input(’Introduzca un número no negativo: ’)
end
fact=1;
j=2;
while j<=n
fact=fact*j;
j=j+1;
end
fprintf(’El factorial de %d es %d nn’,n,fact)
Órdenes de ruptura
Puede ocurrir que al ejecutar un programa, si se da una determinada
circunstancia, queramos parar la ejecución del mismo de…nitivamente o
hasta que pase cierto intervalo de tiempo.
Comandos break, return y pause:
1 La orden break para la ejecución de un bucle de tipo for o while.
2 La orden return detiene la ejecución del …chero .m donde se halle
esta instrucción.
3 La instrucción pause(x) realiza una pausa de x segundos antes de
ejecutar la siguiente orden de programa.
Órdenes de ruptura
Ejemplo: Vamos a modi…car el programa de cálculo del valor de n 2 N
más pequeño tal que 2 n < ", de forma que abortemos el programa si no
se introduce el error máximo:
function n=Epsilon4(eps)
if nargin<1
disp(’Es necesario introducir el error maximo permitido’)
return
end
n=1;
h=2^(-n);
while h>=eps
n=n+1;
h=2^(-n);
end
Ecuaciones diferenciales
dy
= f (t; y ) ; t 2 [t0 ; t0 + ]
dt
N intervalos de igual longitud h = N de…nidos por los puntos
t0 < t1 = t0 + h < t2 = t0 + 2h < ::: < tN = t0 + Nh = t0 +
Método de Euler:
yj +1 yj
= f (tj ; yj ) ; (1)
h
yj +1 = yj + hf (tj ; yj ) ;
j = 0; 1; 2; :::; N 1;
donde yj es la aproximación de y (tj ) :
Ecuaciones diferenciales
N es el número de intervalos
g es una función de las variables t e y de…nida con el comando inline
t0 es el momento inicial
T es el momento …nal
y 0 es la condición inicial
%Calculamos el valor del paso h
h=(T-t0)/N;
%Calculamos el vector t = [t0 t0 + h t0 + 2h ::: T h T]
t=t0:h:T;
%Resolvemos la ecuación por el método de Euler
y(1)=y0;
for i=1:N
y(i+1)=y(i)+h*g(t(i),y(i));
end
Programa de Euler
function [t,y]=Euler(f,N,t0,T,y0)
g=inline(f,’t’,’y’);
h=(T-t0)/N;
t=t0:h:T;
y(1)=y0;
for i=1:N
y(i+1)=y(i)+h*g(t(i),y(i));
end
Resultado:
t = [t (1) t (2) ::: t (N) t (N + 1)]
= [t0 t0 + h t0 + 2h ::: T h T]
y = [y (1) y (2) ::: y (N) y (N + 1)]
= [y0 y1 ::: yN ] :
Programa de Euler
Ejercicio 5: Dado el problema
dy
= y + t; y (0) = 2; t 2 [0; 4];
dt
probar que el programa de Euler funciona con N = 1000:
Abrir un script y efectuar los siguientes pasos:
1 Usando el programa con N = 1000 calcular el valor aproximado de la
solución en t = 4: Mostrar el resultado con el comando fprintf ,
indicando en la frase qué N se utiliza. Utilizar el retorno de carro.
2 Resolver el problema con el comando dsolve y calcular el valor exacto
de la solución en t = 4: Mostrar el resultado con el comando fprintf :
3 Calcular el error de la solución y mostrar el resultado con el comando
fprintf :
N1=1000;
[t,y]=Euler(’y+t’,N1,0,4,2);
y1=y(N1+1);
fprintf(’El valor aproximado de la solución con N=%d en t=4 es %f
nn’,N1,y1)
N1=1000;
[t,y]=Euler(’y+t’,N1,0,4,2);
y1=y(N1+1);
fprintf(’El valor aproximado de la solución con N=%d en t=4 es %f
nn’,N1,y1)
syms y(t)
u=dsolve(di¤(y,t)==y+t,y(0)==2)
f=inline(u);
z=f(4);
fprintf(’El valor exacto de la solución en t=4 es %f nn’,z)
N1=1000;
[t,y]=Euler(’y+t’,N1,0,4,2);
y1=y(N1+1);
fprintf(’El valor aproximado de la solución con N=%d en t=4 es %f
nn’,N1,y1)
syms y(t)
u=dsolve(di¤(y,t)==y+t,y(0)==2)
f=inline(u);
z=f(4);
fprintf(’El valor exacto de la solución en t=4 es %f nn’,z)
Error=abs(y1-z);
fprintf(’El error con N=%d en t=4 es %f nn’,N1,Error)
Programa de Euler
Ejercicio 6: Escribir un programa que resuelva una ecuación diferencial
para varias condiciones iniciales. Efectuar los siguientes pasos:
1 Las variables de entrada del programa son: f ; N; t0 ; T ; y0 ; donde
y0 = [y01 ::::y0m ] es un vector de condiciones iniciales.
2 Detectar en el programa el tamaño del vector m con el comando
length;
3 Usando un bucle de tipo for y el progama de Euler resolver el
problema para cada una de las m condiciones iniciales, dibujándolas
todas en una misma grá…ca.
Aplicar el programa al problema
dy
= y + t; y (0) = y0 ; t 2 [0; 4]:
dt
Usar los siguientes datos iniciales: N = 1000, y0 = [ 3; 2; 0; 1; 3]:
Ejercicio 6
function MatlabPractica3Ej6(f,N,t0,T,y0)
m=length(y0);
hold on
axis([t0 T -150 200])
for i=1:m
[t,y]=Euler(f,N,t0,T,y0(i));
plot(t,y,’r’)
end
Programa de Heun
dy
= f (t; y ) ; t 2 [t0 ; t0 + ]
dt
N intervalos de igual longitud h = N de…nidos por los puntos
t0 < t1 = t0 + h < t2 = t0 + 2h < ::: < tN = t0 + Nh = t0 +
Método de Heun
pk +1 = y (tk ) + hf (tk ; yk ) ;
h
yk +1 = yk + (f (tk ; yk ) + f (tk +1 ; pk +1 )) ;
2
k = 0; 1; 2; :::; N 1:
Programa de Heun
N es el número de intervalos
g es una función de las variables t e y de…nida con el comando inline
t0 es el momento inicial
T es el momento …nal
y 0 es la condición inicial
%Calculamos el valor del paso h
h=(T-t0)/N;
%Calculamos el vector t = [t0 t0 + h t0 + 2h ::: T h T ]
t=t0:h:T;
%Resolvemos la ecuación por el método de Heun
y(1)=y0;
for i=1:N
p(i+1)=y(i)+h*g(t(i),y(i));
y(i+1)=y(i)+(h/2)*(g(t(i),y(i))+g(t(i+1),p(i+1)));
end
Programa de Heun
Ejercicio 7. Dado el problema
dy
= y + t; y (0) = 2; t 2 [0; 4];
dt
probar que el programa de Heun funciona con N = 1000: Mostrar la
solución aproximada en t = 4 con el comando fprintf . Resolver el
problema con el comando dsolve y calcular el valor exacto de la solución
en t = 4: Mostrar la solución exacta en t = 4 con el comando fprintf .
Hallar el error y mostrarlo con el comando fprintf .
Programa de Heun
N=1000;
[t,y]=Heun(’y+t’,N,0,4,2);
y1=y(N+1);
fprintf(’La solución aproximada en t=4 es: %f nn’,y1)
syms y(t)
u=dsolve(di¤(y,t)==y+t,y(0)==2);
f=inline(u);
z1=f(4);
fprintf(’La solución exacta en t=4 es: %f nn’,z1)
Error=abs(z1-y1);
fprintf(’El error en t=4 es: %f nn’,Error)