Sentencias iterativas
for
El bucle
for x=xi:dx:xf sentencias end

El primer término
Escribir un programa que imprima los 10 primeros números enteros empezando por el cero.
for k = 0:10
disp(k)
end
Probamos el script en la ventana de comandos
>> prueba 0 1 2... 10
En MATLAB se hace lo mismo creando el vector
>> x=0:10 x = 0 1 2 3 4 5 6 7 8 9 10
Escribir un bucle
for k=4:2:20 disp(k) end
En MATLAB se hace lo mismo creando el vector
>> x=4:2:20 x = 4 6 8 10 12 14 16 18 20
Escribir un bucle
for k=20:-2:0 disp(k) end
Factorial de un número
Escribir un programa que calcule el factorial de un número empleando la sentencia iterativa
Definición: el factorial de un número n, n! es el resultado del producto 1·2·3· .... ·(n-1)·n.
Para calcular el factorial del número 4, escribimos el script
n=4; resultado=1; for k=1:n resultado=k*resultado; end fprintf('El factorial de %i es %i\n',n,resultado)
Convertimos este conjunto de sentencias en una función. MATLAB dispone de una función denominada
>> factorial(4) ans = 24
Creamos la función
function resultado=factorial_(n) resultado=1; for k=1:n resultado=k*resultado; end end
La llamada a la función
>> factorial_(4) ans = 24
MATLAB nos proporciona una forma más rápida de calcular el factorial de un número, utilizando la función producto
>> n=4; >> prod(1:n) ans = 24
El bucle for y los vectores
Mediante un bucle
x = 0:0.02:pi; for k=1:length(x) y(k) = sin(x(k)); end
se puede representar en forma de vectores del siguiente modo
x = 0:0.02:pi y=sin(x)
Esta segunda forma es equivalente a la primera pero es más eficiente para MATLAB. En la primera forma, se va incrementando el tamaño del vector
x = 0:0.02:pi; %reserva memoria y se asigna 0 a todos los elementos del vector y y=zeros(length(x),1); for k=1:length(x) y(k) = sin(x(k)); end
de este modo el vector
La forma en la que tenemos que escribir un bucle
y=zeros(1,n); %reservar espacio en memoria para el vector A for k=1:n %sentencias y(k)=.....; end
El comando
m=3; %filas n=2; %columnas x=zeros(m,n); %reserva espacio en memoria para la matriz x de dimensión m×n for i=1:m for j=1:n x(i,j)=rand; end end disp(x)
Probamos el script en la ventana de comandos
0.2785 0.5469 0.9575 0.9649 0.1576 0.9706
MATLAB dispone de un función denominada
>> rand(3,2) ans = 0.9572 0.1419 0.4854 0.4218 0.8003 0.9157
Otras variantes de la función
rand(n) , genera una matriz cuadrada de dimensiónn, con números aleatorios entre 0 y 1rand(1,n) , genera un vector fila den elementos con números aleatorios entre 0 y 1
Matrices simétricas
Las matrices simétricas son aquellas en las que la matriz A es igual a su traspuesta AT, es decir, los elementos ai,j=aj,i con i≠j. Para crear una matriz simétrica de dimensión n no es necesario inicializar todos los elementos del array, basta con el triángulo superior
n=3; A=zeros(n); for i=1:n for j=i:n A(i,j)=rand; end end
A = 0.8147 0.9058 0.1270 0 0.9134 0.6324 0 0 0.0975
Para crear la matriz simétrica, extraemos la parte triangular superior de la matriz A mediante la función
>> A=A+triu(A,1)' A = 0.8147 0.9058 0.1270 0.9058 0.9134 0.6324 0.1270 0.6324 0.0975 >> A' ans = 0.8147 0.9058 0.1270 0.9058 0.9134 0.6324 0.1270 0.6324 0.0975
Definición de funciones
Como hemos visto al principio de este apartado, a la función
f=@(x) 2*x^2-3*x-2; x=(0:5)'; y=zeros(length(x),1); for i=1:length(x) y(i)=f(x(i)); end disp([x,y])
0 -2 1 -3 2 0 3 7 4 18 5 33
Producimos el mismo resultado si definimos la función
f=@(x) 2*x.^2-3*x-2; x=(0:5)'; y=f(x); disp([x,y])
Ahora bien, si la función
>> f=@(x) 2; >> x=(0:5)'; >> f(x) ans = 2
Vector de funciones
Se puede crear un vector
g1(x)=x
g2(x)=2x2-1
g3(x)=4x3-3x
>> g={@(x)x,@(x)2*x.^2-1,@(x)4*x.^3-3*x}; >> g{2}(3) ans = 17
Se accede a la función de índice 2,
>> a=[1,-1,0.5]; >> f=@(x) a(1)*g{1}(x)+a(2)*g{2}(x)+a(3)*g{3}(x); >> f(2) ans = 8
Representamos las funciones base que guardamos en el vector
g={@(x)x,@(x)2*x.^2-1,@(x)4*x.^3-3*x}; a=[1,-1,0.5]; f=@(x) a(1)*g{1}(x); for i=2:length(g) f=@(x)(f(x)+a(i)*g{i}(x)); end hold on for i=1:length(g) fplot(g{i},[-1,1]) end fplot(f,[-1,1], 'k') grid on xlabel('x') ylabel('y') title('Combinación lineal de funciones base')
while
A la palabra reservada
while condicion sentencias end
Escribir un programa que imprima los primeros 10 primeros números enteros empezando por el cero, empleando la sentencia iterativa
k=0; while k<10 disp(k) k=k+1; end
El valor inicial de
Factorial de un número
Volvemos a escribir la función
function resultado=factorial_(n) resultado=1; while n>0 resultado=n*resultado; n=n-1; end end
Probamos la nueva versión de la función
>> factorial_(4) ans = 24
El número e
Elaboramos un script para calcular el valor aproximado de e, cuando x tiende a cero
format long x=1; while x>1e-8 x=x/10; e=(1+x)^(1/x); disp([x e]); end
Corremos el script en la ventana de comandos
0.100000000000000 2.593742460100002 0.010000000000000 2.704813829421529 0.001000000000000 2.716923932235594 0.000100000000000 2.718145926824926 0.000010000000000 2.718268237192297 0.000001000000000 2.718280469095753 0.000000100000000 2.718281694132081 0.000000010000000 2.718281798347357 0.000000001000000 2.718282052011560 >> e e = 2.718282052011560
break
for k = 0:10 if k == 8 break end disp(k) end
Consideremos de nuevo el ejemplo del bucle
for k = 0:7 disp(k) end
Sin embargo, podemos salir fuera del bucle prematuramente si se cumple alguna condición de finalización.
while 1==1 %...otras sentencias if condicionFinal break end end
Como podemos apreciar en esta porción de código, la expresión en el bucle
Ejemplos
1.-Desarrollo en serie
El desarrollo en serie de sin(x) es
Comparar el valor dado por la función MATLAB
Definir una función denominada
function resultado=serie_sin(n,x) resultado=x; signo=-1; for i=3:2:2*n-1 resultado=resultado+signo*x^i/factorial(i); signo=-signo; end end
Probamos la función
>> format long
>> serie_sin(2, pi/6)
ans = 0.499674179394364
>> serie_sin(5, pi/6)
ans = 0.500000000020280
>> format short
>> sin(pi/6)
ans = 0.5000
Como vemos con muy pocos términos del desarrollo en serie obtenemos el valor 0.5 del seno de 30° o de π/6
Obtenemos el mismo resultado con el siguiente código, que calcula el seno de los ángulos: 30, 60 y 90 con la suma de 10 términos del desarrollo en serie y los compara con el valor que se obtiene a partir de la función
n=0:10; for x=(30:30:90)*pi/180 se=sin(x); s=sum(((-1).^n).*(x.^(2*n+1))./factorial(2*n+1)); [se,s] end
ans = 0.5000 0.5000 ans = 0.8660 0.8660 ans = 1.0000 1.0000
Repetir este ejercicio pero con la función coseno
2.-El número irracional π
Para hallar la longitud de una circunferencia de radio R, primero se calcula el perímetro de un triángulo equilátero (3 lados) inscrito en dicha circunferencia, luego, de un hexágono (6 lados), un dodecágono (12 lados) y así, sucesivamente. El límite de la sucesión de perímetros es precisamente la longitud de la circunferencia 2πR.
Si tomamos una circunferencia de radio unidad, al dividir entre dos los valores de los perímetros iremos obteniendo las sucesivas aproximaciones del número irracional π.

Calculamos la longitud del lado an un polígono regular de n lados inscrito en la circunferencia de radio R, (en color rojo).
Del mismo modo, obtenemos la longitud del lado de un polígono regular inscrito de 2n lados (en color azul)
Teniendo en cuenta que
Establecemos la relación entre an y a2n y por tanto, entre el perímetro Pn del polígono regular de n lados y el perímetro P2n del polígono regular de 2n lados.
Tomando como radio R, la unidad
Para un triángulo, n=3, la longitud del lado es a3=2sin60°, y el perímetro
- Para un hexágono, n=6, la longitud del lado es a6=2sin30°=1, y el perímetro P6=6.
- y así, sucesivamente.
Para obtener las sucesivas aproximaciones del número irracional π mediante la fórmula anterior procedemos del siguiente modo:
- Partimos del valor del perímetro P de un triángulo equilátero inscrito en una circunferencia de radio unidad, el valor de n es 3.
- Calculamos el perímetro P de un polígono de 2n lados a partir del valor del perímetro de un polígono regular de n lados.
- El valor obtenido P será el valor del perímetro de un polígono regular de n=2n lados.
- Se imprime el valor de P dividido entre dos (aproximación de π)
- Se vuelve al paso 2.
Definimos la función
function aprox_pi(iter) perimetro=3*sqrt(3); n=3; for i=1:iter perimetro=2*n*sqrt(2.0-sqrt(4.0-(perimetro/n)*(perimetro/n))); n=2*n; fprintf('%i lados, aproximación de pi: %1.8f\n',n,perimetro/2) end end
Probamos la función
>> aprox_pi(10) 6 lados, aproximación de pi: 3.00000000 12 lados, aproximación de pi: 3.10582854 24 lados, aproximación de pi: 3.13262861 48 lados, aproximación de pi: 3.13935020 96 lados, aproximación de pi: 3.14103195 192 lados, aproximación de pi: 3.14145247 384 lados, aproximación de pi: 3.14155761 768 lados, aproximación de pi: 3.14158389 1536 lados, aproximación de pi: 3.14159046 3072 lados, aproximación de pi: 3.14159211 >> format long >> pi ans = 3.141592653589793 >> format short
3.-Ordenar una lista de números

Para ordenar una lista de números emplearemos el método de la burbuja, un método tan simple como poco eficaz. Se compara el primer elemento, índice 0, con todos los demás elementos de la lista, si el primer elemento es mayor que el elemento j, se intercambian sus valores, siguiendo el procedimiento explicado en la figura. Se continua este procedimiento con todos los elementos del array menos el último. La figura explica de forma gráfica este procedimiento.
Creamos una función denominada
function x=ordenar(x) n=length(x); for i=1:n for j=i+1:n if x(i)>x(j) aux=x(j); x(j)=x(i); x(i)=aux; end end end end
Llamamos a la función
>> ordenar([1.65 1.82 1.72 1.75 1.73 1.85 1.90 1.74 1.76 1.77]) ans = 1.6500 1.7200 1.7300 1.7400 1.7500 1.7600 1.7700 1.8200 1.8500 1.9000
MATLAB dispone de una función denominada
>> sort([1.65 1.82 1.72 1.75 1.73 1.85 1.90 1.74 1.76 1.77])
4.-Números primos
Los números primos tienen la siguiente característica: un número primo es solamente divisible por sí mismo y por la unidad, por tanto, un número primo no puede ser par excepto el 2. Para saber si un número impar es primo, dividimos dicho número por todos los números impares comprendidos entre 3 y la mitad de dicho número. Por ejemplo, para saber si 13 es un número primo basta dividirlo por 3 y 5. Para saber si 25 es número primo se divide entre 3, 5, 7, 9 y 11. Si el resto de la división es cero, el número no es primo.
Creamos una función denominada
function bPrimo=es_primo(n) bPrimo=1; for i=3:2:n/2 if rem(n,i)==0 bPrimo=0; break; end end end
Probamos la función
>> es_primo(13)
ans = 1
>> es_primo(10)
ans = 0
MATLAB dispone de la función que realiza la misma tarea,
>> isprime(13)
ans = 1
>> isprime(10)
ans = 0
>> primes(20)
ans = 2 3 5 7 11 13 17 19
Creamos una función denominada
function primos(n) disp(2); for i=3:2:n; if es_primo(i) disp(i) end end end
Probamos la función
>> primos(20) 2 3 5 7 11 13 17 19
Podemos definir una función
5.-Simplificar una fracción
Para simplificar una fracción primero hay que hallar el máximo común divisor del numerador y del denominador. Para ello se emplea el algoritmo de Euclides, cuyo funcionamiento se muestra en el siguiente ejemplo. Sea u=1260 y v=231,
En la primera iteración, se halla el resto r de dividir el primero u entre el segundo v. Se asigna a u el divisor v, y se asigna a v el resto r.
En la segunda iteracción, se halla el resto r de dividir u entre v. Se asigna a u el divisor v, y se asigna a v el resto r.
Se repite el proceso hasta que el resto r sea cero. El máximo común divisor será el último valor de v.
1260=231×5+105
231=105×2+21
105=21×5+0
el máximo común divisor es 21.
A continuación, definimos la función
function [num,den]=simplificar(numerador, denominador) u=abs(numerador); v=abs(denominador); if v==0 res=u; else while v~=0 r=rem(u,v); u=v; v=r; end res=u; end num=numerador/res; den=denominador/res; end
Si queremos calcular la fracción equivalente a 12/18 más simple, escribimos
>> [num,den]=simplificar(12,18)
num = 2
den = 3
nos da la fracción 2/3
La función MATLAB
>> mcd=gcd(12,18)
>> 12/mcd,18/mcd
Obtenemos la fracción 2/3
En la página titulada Cálculos aritméticos, hemos visto que MATLAB sabe operar con fracciones y devuelve la fracción más simple.