Sentencias condicionales
if

La sentencia
Ejemplos
if a < b if a >= 3 if b ~= 0 if (x>=2) & (x<10)
if condicion sentencias end

Dado la abscisa x y la ordenada y de un punto P, se pide calcular su distancia r al origen y el ángulo θ que forma con el eje X. Transformar las coordenadas del punto P de rectangulares a polares
x=input('Abscisa x: '); y=input('Ordenada y: '); r=sqrt(x^2+y^2); if x>=0 theta=atan(y/x); if y<0 theta=theta+2*pi; end else theta=atan(y/x)+pi; end fprintf('La distancia es %1.2f y el ángulo es %3.2f\n',r,theta*180/pi)
Abscisa x: -2 Ordenada y: -3 La distancia es 3.61 y el ángulo es 236.31 >> atan2(-3,-2)*180/pi+360 ans = 236.3099
La función
Es importante la identación para entender el código, tal como se muestra en este script. De este modo, vemos la sentencia o sentencias que se ejecutan en cada bloque
if...else

La sentencia
Si la condición es verdadera se ejecuta las sentencias 1. La palabra clave
if condicion sentencias_1 else sentencias_2 end
Definición de funciones
La función que calcula el signo de un número se define de la siguiente forma:
Creamos una funcion denominada
function sgn = signo(x) if x > 0 sgn = 1; elseif x < 0 sgn = -1; else sgn = 0; end end
Probamos la función
>> signo(-2) ans = -1 >> signo(0) ans = 0 >> signo(4) ans = 1
Definimos la siguiente función
Vamos a trasladar la definición matemática a código, escribiendo en el editor de funciones
function y=f(x) if x>=0 & x<=1 y=x; elseif x>1 & x<=2 y=2-x; else y=0; end end
Probamos la función en la ventana de comandos
>> f(-1) ans = 0 >> f(0.5) ans = 0.5000 >> f(1.8) ans = 0.2000
Representamos gráficamente la función
>> fplot(@f,[-1,3]) >> grid on >> xlabel('x') >> ylabel('y') >> title('Pulso triangular')
Sistemas de ecuaciones lineales
En la página Ecuaciones y sistemas consideraremos un sistema de ecuaciones lineales que podemos escribir Ax=b, donde A es una matriz de dimensión m×n, y x y b son dos vectores columna de longitudes n y m respectivamente. Tenemos un sistema de m ecuaciones con n incógnitas.
- El sistema tiene solución si y solo si el rango de la matriz A es igual al rango de la matriz aumentanda A|b.
- Si el rango es igual al número n de incógnitas el sistema tiene una solución única.
- Si el rango es menor que el número n de incógnitas entonces hay un número infinito de soluciones
Vamos a escribir una función denominada
function x =sistema_ecuaciones(A,b) rango_A=rank(A); rango_Ab=rank([A b]); [m,n]=size(A); fprintf('Sistema de %i ecuaciones con %i incógnitas\n',m,n); if rango_A~=rango_Ab disp('El sistema no tiene solución') elseif rango_A==n disp('Hay una solución única') x=A\b; elseif rango_A<n disp('Hay infinitas soluciones'); end end
En la ventana de comandos probamos la función
>> A=[2 1; 2 -1; 1 -2]; >> b=[3;0;4]; >> sistema_ecuaciones(A,b) Sistema de 3 ecuaciones con 2 incógnitas El sistema no tiene solución >> A=[2 1; 2 -1; 1 -2]; >> b=[3;5;4]; >> sistema_ecuaciones(A,b) Sistema de 3 ecuaciones con 2 incógnitas Hay una solución única ans = 2.0000 -1.0000 >> A=[2 1; 4 2; 6 3]; >> b=[3;6;9]; >> sistema_ecuaciones(A,b) Sistema de 3 ecuaciones con 2 incógnitas Hay infinitas soluciones
switch
Como podemos ver en la figura del apartado anterior, la sentencia
Por ejemplo, considérese las siguientes series de sentencias
if condicion_1 sentencias_1 elseif condicion_2 sentencias_2 elseif condicion_3 sentencias_3 else sentencias_4 end
El código resultante puede ser difícil de seguir y confuso incluso para el programador avanzado. MATLAB proporciona una solución elegante a este problema mediante la sentencia condicional
switch expresion case valor1 sentencias_1 case valor2 sentencias_2 case valor3 sentencias_3 otherwise sentencias_4 end
En la sentencia
Longitud de una circunferencia, área de un círculo
La función
Definimos una función, que toma el radio
function z = calcula_1(r,str) if strcmp(str, 'circunferencia') z=2*pi*r; elseif strcmp(str,'circulo') z=pi*r^2; else z=-1; end end
>> calcula_1(3,'circulo') ans = 28.2743 >> calcula_1(3,'circunferencia') ans = 18.8496 >> calcula_1(3,'circu') ans = -1
Alternativamente, se puede emplear la sentencia condicional
function z = calcula(r,str) switch str case 'circunferencia' z=2*pi*r; case 'circulo' z=pi*r^2; otherwise z=-1; end end
Calendario
En el script
A continuación, se utiliza solamente los tres primeros caracteres que se convierten con la función
nMes=input('Introduce el nombre del mes): ','s'); mes=lower(nMes(1:3)); %utiliza las tres primeras letras del mes if mes=='feb' %utilizar strcmp(mes,'feb') para comparar strings bisiesto=input('¿Es año bisiesto?:','s'); bi=lower(bisiesto(1)); %utiliza la primera letra end switch mes case{'sep','abr','jun','nov'} dias=30 case 'feb' if bi=='s' dias=29 else dias=28 end otherwise dias=31 end
Cuando se comparan cadenas de caracteres (string) es conveniente utilizar la función
>> meses Introduce el nombre del mes: febrero ¿Es año bisiesto? (s/n):No dias = 28 >> meses Introduce el nombre del mes: Julio dias = 31
Meses y días de cada mes
Ahora un ejemplo más complicado, escribir un programa que calcule el número de días de un mes determinado cuando se proporciona el año.
Se anota primero, los meses que tienen 31 días y los que tienen 30 días. El mes de Febrero (2° mes) es el más complicado ya que tiene 28 días excepto en los años que son bisiestos que tiene 29. Son bisiestos los años múltiplos de cuatro, que no sean múltiplos de 100, pero si son bisiestos los múltiplos de 400.
mes=input('introduce un número (1-12): '); anho=input('introduce el año: '); numDias=30; switch mes case {1,3,5,7,8,10,12} numDias = 31; case {4,6,9,11} numDias = 30; case 2 if ( (rem(anho,4) == 0 & ~(rem(anho,100) == 0)) | rem(anho,400) == 0 ) numDias = 29; else numDias = 28; end otherwise disp('Este mes no existe') end fprintf('El mes %i del año %i tiene %i días\n',mes,anho,numDias)
>> rem(23,4) ans = 3
Podemos convertir el código del script en una función denominada
function numDias=calendario(mes, anho) switch mes case {1,3,5,7,8,10,12} numDias = 31; case {4,6,9,11} numDias = 30; case 2 if ( (rem(anho,4) == 0 & ~(rem(anho,100) == 0)) | rem(anho,400) == 0 ) numDias = 29; else numDias = 28; end otherwise disp('Este mes no existe') end end
Probamos la función
>>calendario(2,1900) ans = 28 >>calendario(2,2000) ans = 29 calendario(10,2013) ans = 31
Ejemplos

1.-Cálculo del ángulo del rayo refractado
La ley de Snell de la refracción es n1·sinθ1=n2·sinθ2.
- Si n1<n2, el ángulo θ2 del rayo refractado es menor que el incidente θ1
- Si n1>n2, el ángulo θ2 del rayo refractado es mayor que el incidente θ1. Para el angulo incidente crítico n1·sinθc=n2, el ángulo refractado es θ2=90°. Si el ángulo incidente θ1>θc, no hay rayo refractado, solamente reflejado θ2=θ1.
n1=1.5; %indice de refracción del medio 1 n2=1; %indice de refracción del medio 2 ang1=30; %ángulo incidente if n1<n2 ang2=asind(n1*sind(ang1)/n2); disp(['Angulo refractado: ', num2str(ang2)]) else aCritico=asind(n2/n1); if ang1>aCritico disp(['Angulo reflejado: ', num2str(ang1)]) else ang2=asind(n1*sind(ang1)/n2); disp(['Angulo refractado: ', num2str(ang2)]) end end