Sunteți pe pagina 1din 14

Algunas estructuras bsicas de programacin

para Matlab y Octave


Juancho Sotillo

SENTENCIAS LGICAS (brevsimo paseo)

Si hablamos de las sentencias lgicas en el lenguaje cotidiano, nos estamos refiriendo a cualquier oracin de la cual pueda decirse sin equvocos, sin ambigedades, que es verdadera o es falsa. Por ejemplo, son sentencias lgicas: 1. 2. 3. 4. 5. 6. 7. 8. Pero 9. 10. 11. 12. x>7 2< x < 23 Levntate, flojo! Ojal hoy fuese viernes! Hoy es lunes. La madre de Jess se llama Mara. Ayer hizo calor Aquel perro es verde Todo pirricunflai es un curipindn. Existe un A que es del tipo B. 6>3 -1 < -30

no son sentencias lgicas. Las 9 y la 10 porque ser cierto o falso para ellas depender del valor (desconocido, ya que aparece como incgnita) de x. La 11, porque es una orden, y como tal no tiene valor posible de veracidad o falsedad. Y la ltima, porque es la expresin de un deseo y en tal caso no es posible decir de l que sea verdadero o falso. Regresando a los primeros ocho ejemplos, es claro que de cualquiera de ellos se puede decir que son verdaderos o falsos. Incluso del nmero 5, en el que no sabemos de qu se habla, pero que expresa una realidad posible1, de la cual siempre puede decirse que es verdadera o falsa, sin importar la existencia real o no de aquello que se habla.

Es mucho lo que se puede decir acerca de las implicaciones de esta abstraccin extrema, en la cual slo importa cmo se razone y no acerca de lo que se razona. Esa desvinculacin con la realidad tangible, con la realidad real a veces coloca al pensamiento lgico puro en un estado que lo desvinc ula de cualquier posibilidad tica o moral. En tal sentido, es un arma de doble filo, con la cual hay que ir con mucho tacto si pretendemos usarla para entender la realidad que nos rodea in extenso.
1

Existen, faltaba ms, operaciones que nos permiten construir sentencias lgicas ms complejas a partir de sentencias mnimas2 (atmicas) Estas nuevas proposiciones o sentencias se llaman compuestas o moleculares, trayendo de la qumica esa estructura metafrica. Para construir sentencias o proposiciones de aqu en adelante usar sentencia y proposicin como nombres equivalentes- moleculares a partir de las atmicas se usa el operador unario de negacin y las llamadas conjunciones copulativas (operadores lgicos binarios). El operador unario de negacin (de ahora en adelante diremos slo negacin) consiste en negar lo descrito por la sentencia lgica atmica. Por ejemplo: 1. 2. 3. 4. 5. 6. 7. Hoy NO es lunes La madre de Jess No se llama Mara Ayer NO hizo calor Aquel perro NO es verde Existe al menos un pirricunflai que NO es un curipindn 63 -1 -30

Note la negacin de las ltimas tres sentencias, merece la pena detenerse a meditar en ellas y ver si lo que se escribi all tiene sentido (principalmente en las negaciones de proposiciones escritas en el idioma que hablamos, que suelen dar lugar a posibles malos entendidos; las otras proposiciones, que estn escritas en lenguaje matemtico, suponen menos errores pues dichos smbolos se crean con la intencin de no permitir ambigedades en su lectura) Por cierto, si pensamos en la negacin como un operador unario (es decir, que acta sobre una sola sentencia), la escritura matematizada de esta idea sera (pongamos por ejemplo la 1ra sentencia): 1. NO( Hoy es lunes) Pero la maravilla que es nuestro lenguaje nos permite escribir Hoy NO es lunes, para evitar esa desagradable (aunque a veces til) manera de escribir la negacin antes de la sentencia (y el uso de parntesis u otro smbolo que ac ms que aclarar, oscurece) En cuanto a la negacin de la proposicin 5 inicial, ntese que en sta leamos Todo pirricunflai es un curipindn En ella hicimos uso de lo que en lgica se denomina cuantificador universal (En este caso, la palabra todo es uno de esos cuantificadores universales; el otro es existe). All estamos afirmando que TODO pirricunflai cumple con la condicin de ser un curipindn. Negar esa universalidad (todos los.. son) consiste sencillamente en decir que al menos un pirricunflai NO es curipindn, tal cual he mos escrito
De hecho, las sentencias del tipo 1 8 reciben el nombre de proposiciones atmicas, porque constituyen sentencias de longitud mnima; es decir, oraciones semnticamente y gramticamente vlidas acerca de las cuales se puede enunciar su veracidad o falsedad.
2

en la segunda lista,3 que no es lo mismo que decir que ningn pirricunflai es curipindn [ve por qu, estimado lector?] Las otras maneras de construir sentencias moleculares a partir de sentencias atmicas es mediante las llamadas conjunciones copulativas. Las hay de dos tipos: Y y O. Por ejemplo, a partir de Hoy es martes y El perro es negro, proposiciones atmicas ambas, podemos construir: 1. Hoy es martes y el perro es negro 2. Hoy es martes o el perro es negro Cuando llegamos a encontrar dichas proposiciones moleculares en el mbito de las matemticas o, en nuestro caso, de la programacin, tenemos que tener algunas cosas en cuenta. Por ejemplo, pensemos en las siguientes proposiciones que dependen del valor de la variable x (en sentido estricto no son proposiciones lgicas hasta no conocer el valor de x) a) x > 7 b) x < 15 c) (x>7) y (x<15) [proposicin atmica] [proposicin atmica] [proposicin molecular]

Por ejemplo, si el valor de x es 10, es claro que tanto a) como b) son verdaderas. Note adems que la c) es tambin cierta. Pero si x= 20, la a) es cierta pero la b) no; por lo tanto, la c) tampoco es verdadera. Esto nos permite hablar de cundo son verdaderas o falsas las proposiciones moleculares dado que sean verdaderas o falsas las proposiciones atmicas que la compongan. Estas posibilidades se resumen en lo que se denomina TABLA DE VERDAD, que supone la existencia de dos proposiciones atmicas (digamos P y Q) que forman una proposicin nueva P y Q4. Vamos a dar las tablas de verdad para las conjunciones Y, O y para la negacin NO, de una vez. Convencerse del porqu de las dems tablas de verdad ser un ejercicio para el lector.

Si le incomoda pensar en curripindines y piricunflais, puede remitirse a la clsica sentencia: todos los hombres son mortales. La diferencia entre nuestra nmero 5 y sta clsica sentencia es que en la segunda creemos saber qu es eso de ser hombre y de ser mortal, mientras que nadie ha visto ni sabe qu son los curripindines y los piricunflayes. An as, lgicamente es la misma cosa, la misma estructura. 4 Para dotar de universalidad a las conjunciones Y y O se usan smbolos que pretenden ser independientes del lenguaje escrito particular de quien estudia estos procesos lgicos. En matemticas suelen usarse , y para indicar Y, O y negacin, respectivamente. Aqu, dado que estamos en el mbito de la programacin especficamente de MATLAB y OCTAVE, usaremos los smbolos que en estos lenguajes equivalen a Y y O, que son &&, | y ~, respectivamente.
3

V F

F V

&& V F

V V F

F F F

| V F

V V V

F V F

As, por ejemplo, si x = 7, las siguientes proposiciones moleculares a) ( (x>10) && (x<12) ) | ((x3) && (x<20)) b) ( (x>10) | (x<12) ) && ((x3) | (x<20)) c) ( x ~= 5 ) | ~ (x<6) Tendrn valores de verdad (resultados) siguientes(usaremos aqu 1 para verdadero y 0 para falso, para ir acostumbrndonos. Usted puede reescribir las tablas de verdad con dicho cambio, si lo prefiere) a) 1 b) 1 c) 1 En MATLAB/Octave, la proposicin molecular a) se escribira como a) ( (x>10) && (x<12) ) | ((x>=3) && (x<20)) Escriba usted mismo las dems y compruebe el valor de verdad que dimos como resultado. Dejamos ac una lista de ejercicios para que el lector compruebe los valores de verdad de las proposiciones moleculares dadas: suponga que x=12 y que y=2 (aunque puede ser muy fastidioso escribir tanto smbolo, hgalo, para que vaya acostumbrando la mente y msculos) b) c) d) e) ((x<3)&&(x>6))|((y17)|(y20)) (((x>y)|(2x<y+1))|(x*y>25)) && ~(((x==12)&&(y==2))|(x+7<20)) ~(~(x<y)&&~(yx - 7)) (~(~(x<y)&&~(y7))) | ((x-10=y)&&(x/y > 5))

Hay algunas operaciones que nos permiten ligar las conjunciones Y, O y NO y algunas propiedades que se cumplen cuando en el conjunto de las proposiciones lgicas actuamos haciendo uso de dichas propiedades. Por ejemplo, las propiedades distributivas y asociativas son vlidas ac, adems de otras (las leyes de De Morgan, que dicen que: ~(P && Q)= ~P | ~Q y que ~(P|Q)=~P && ~Q algo bastante interesante de por s, que mencionamo s a manera de informacin ac) De este modo, podemos calcular sobre el conjunto de proposiciones lgicas como lo hacamos en cualquier conjunto numrico. Pero meternos por ese camino nos llevara mucho ms all de las intenciones de esta gua.

Existe otra conjuncin copulativa que no hemos mencionado hasta ahora: el O-exclusivo. Dejamos como tarea al lector investigar su definicin, su tabla de verdad y algunas de sus aplicaciones en el mbito que hemos venido trabajando hasta aqu (Matlab/Octave) Adelantamos que la funcin xor(x,y) lleva a cabo la operacin de O-exclusivo en Matlab/Octave. La lgica simblica (o en extenso, la lgica matemtica) es una rama de las matemticas que se encarga justamente de estudiar estos temas que apenas hemos presentado aqu. Incluso, en ella conseguimos resultados que podra decirse constituyen pilares fundamentales sobre los cual las matemticas construyen sus verdades Pero tal excursin, por supuesto, escapa nuestras pretensiones en esta gua.

LAS INSTRUCCIONES forend, while end y switchcase EN MATLAB Y OCTAVE

En esta breve gua haremos un recorrido por las nociones ms bsicas de tres estructuras de suma utilidad en cualquier lenguaje de programacin. Nos referimos a las instrucciones forend, while end y switchcase tanto en MATLAB como en OCTAVE. Las dos primeras for y while estn emparentadas de alguna manera que veremos ms claramente en los ejemplos. La ltima, switch case, est ms relacionada (y constituye una implementacin un poco ms elaborada de) la instruccin if Valga acotar ac que en OCTAVE y slo en OCTAVE, hasta ahora- podemos usar endfor, endwhile y endswitch (incluso endif) Esto constituye una diferencia bastante agradable con respecto a Matlab, pues cuando las lneas de cdigo son ya numerosas, la cortesa de colocar a quin pertenece el end particular es de cierta ayuda para el programador y para quien lee el cdigo.

INSTRUCCIN forend

La idea bsica de esta instruccin5 es la de asegurar que cierto bloque de instrucciones cualesquiera sea repetida un nmero finito y conocido (predeterminado) de veces. La sintaxis del ciclo forend es la siguiente: for <contador=vector> BLOQUE DE INSTRUCCIONES end En Matlab/Octave tenemos, especficamente, la sintaxis que acabamos de escribir: <contador=vector> Esto significa que los valores q va tomando el contador estn dados, especfica y claramente, por los elementos del vector. Veamos un ejemplo:

En realidad for y end constituyen los delimitadores de un conjunto de instrucciones que puede tener una longitud cualquiera, necesaria para resolver algn proceso programable, como ya veremos. Es lo que llamamos bloque de instrucciones en el esquema.
5

%Ciclo for bsico for c=[1,2,3,4,5] disp(c) end

Resultado: 1 2 3 4 5

Si se cambia el vector [1,2,3,4,5] por cualquier otro, de cualquier longitud, el resultado ser justamente una lista de los elementos de ese nuevo vector. Haga la prueba ahora mismo. En lugar de dicho vector podemos colocar, entonces, cualquier expresin que en MATLAB/Octave genere un vector. Incluso, podemos colocar una matriz en lugar de dicho vector (recordad que un vector es, para MATLAB/Octave, un caso particular de una matriz), en cuyo caso, el contador ir recorriendo dicha matriz por columnas. Aconsejamos hacer una prueba de tal cosa en este mismo instante.

Pruebe lo anterior colocando los siguientes vectores despus c= en el ciclo for anterior (si lo desea, puede generar los vectores antes del escribir el ciclo for, con el nombre de, por ejemplo, v y luego simplemente colocar for c= v al inicio del ciclo
a) b) c) d) e) f) g) h) i) j) [2,4,6,8,10,12] 1:3:50 0:0.5:5 5:-0.1:3 2*pi:0.2:2*pi linspace(2,3,20) magic(4) %OJO: sta es una matriz eye(4) %sta tambin es una matriz ones(2,3) %tambin es una matriz rand(3,4) %debera saber que sta tambin es una matriz k) Calcule usando un ciclo for adecuado.

Por supuesto, y as ser en la generalidad de los casos, el bloque de instrucciones que se llevarn a cabo a medida que el contador del for cuenta van a ser ms complicadas que un disp(). Dems est decir que en dicho bloque de instrucciones podemos colocar cualquier cantidad de instrucciones vlidas en MATLAB/Octave.

Veamos el siguiente ejemplo de cdigo:


x=fix(20+100*rand(1,20)); v=[ ]; for c=1:length(x) if x(c) > mean(x) v= [v x(c)]; end end

Puede ver que dicho cdigo genera un vector v que contiene aquellos elementos del vector aleatorio x que son mayores que la media de x? Dicha media de x se calcula usando la funcin mean(x)

Veamos cmo llenar una matriz A de tamao m x n con elementos que son la multiplicacin de la fila por la columna donde se encuentra ubicado el elemento. Aqu vamos a usar dos for, uno para recorrer las filas y otro para las columnas. Llamaremos f al contador correspondiente al for que recorre filas y c al de las columnas. Note que aqu los for estn anidados:

for f = 1:m for c = 1: n A(f,c) = f*c; end end

Note que no es necesario pre-declarar6 la matriz A, sino que sta se va formando a medida que van siendo creados sus elementos. En el cdigo anterior, se supone que los valores de m y n estn dados de antemano. Por otro lado, note que tenemos ac dos ciclos for anidados; el ciclo para la f contiene al ciclo para la c; entonces, en este caso, todos los valores de c (de 1 hasta n) se recorren completos para cada vez el nuevo valor de f es asumido. Como hay n
Declarar una variable es necesario en lenguajes de programacin como C, C++. Java, Fortran, etc. MATLAB/Octave no lo necesitan. Ello implicar en estos ltimos posibles dificultades de manejo de memoria, pero esos asuntos no nos importan mucho ac.
6

valores de c por cada valor de f, el nmero total de veces que se calcula A(f,c) = f*c ser mn veces.

Ejercicios: (Para estos ejercicios, se sugiere que escriba una function para cada uno
donde los valores de m y n sean los datos que se le pasan a dicha function y la matriz A sea el resultado devuelto al ejecutar la function) Modifique el cdigo anterior para que los elementos de la matriz A sean a) la diferencia (resta) de la posicin-fila y la posicin-columna que ocupa el elemento en la matriz (ejemplo: el elemento ser ) b) ( ) , donde posicin-fila y j posicin-columna. c) [En esta function exija que m=n; o sea, que la matriz sea cuadrada. Dicha exigencia debe verificarse en la function mediante una sentencia ifend] en la diagonal principal, en la zona triangular por encima de la diagonal principal y en la zona triangular por debajo de la diagonal principal [para esta parte, posiblemente va a necesitar usar la instruccin ifend ]

INSTRUCCIN whileend

La sintaxis del ciclo whileend es la siguiente: while < sentencia lgica > BLOQUE DE INSTRUCCIONES end Aqu, <sentencia lgica> se refiere a cualquier instruccin cuyo resultado sea 1 o 0 (en MATLAB/OCTAVE, 1 corresponde a verdadero y 0 corresponde a falso) El BLOQUE DE INSTRUCCIONES se ejecutar si la <sentencia lgica> es verdadera (es decir, el valor resultante al evaluarla es 1) Veamos algunos ejemplos. 1) Hallar el valor mnimo de m tal que
suma = 0; m = 0; while (suma < 10000) m = m + 1 ; suma = suma + m; end [suma, m] %Imprime la suma y el m buscado

2) 2) mi_num=1.2;
while (mi_num <= 1000000) disp(['Ahora el nmero es ',num2str(mi_num)]) mi_num=mi_num^2; end disp(['Al salir del ciclo, el nmero es ',num2str(mi_num)])

3)
format 3) long; n=0; sum=0; sumavieja=100; while (abs(sum-sumavieja) > 0.0000000000000001) sumavieja=sum; sum=sum+1/factorial(n); disp([' Sumando hasta 1/',num2str(n),'! resulta ',num2str(sum,20)]); n=n+1; end

Se sugiere al lector implementar los cdigos anteriores y comentar acerca de los resultados de ejecutar dichos cdigos. En el primer caso, sugerimos cambiar el valor 10000 por otro cualquiera de su eleccin y ver qu sucede. Igualmente, para el segundo caso, puede cambiar tanto los valores de mi_num y el del valor de comparacin (1000000 en la condicin lgica del while) y anotar los cambios que observe. Recuerde: discutir con mtodo entre los miembros del grupo es quiz una de las mejores maneras de aclarar cualquier tipo de duda. En el caso del cuadro 3) reconoce usted el nmero al cual va convergiendo la suma que se est evaluando en ese caso? Investigue concienzudamente dicho valor numrico y concluya. Ese resultado es fundamental en clculo (infinitesimal y numrico)

INSTRUCCIN switchcaseend.

La estructura fundamental de la instruccin switchcaseend es


switch <expresin de seleccin> case <valor de la expresin de seleccin> [conjunto 1 de instrucciones para el valor de la expresin de seleccin] case <valor de la expresin de seleccin> [conjunto 2 de instrucciones para el valor de la expresin de seleccin] : case <valor de la expresin de seleccin> [conjunto n de instrucciones para el valor de la expresin de seleccin] otherwise [conjunto de instrucciones por defecto] end

La <expresin de seleccin> puede ser un escalar (nmero) o una cadena de caracteres (string). Un ejemplo muy sencillo:
mi_num = input('Introduzca un nmero:'); switch mi_num case -1 disp('menos uno'); case 0 disp('cero'); case 1 disp('ms uno'); otherwise disp('Otro valor'); end

Implemnte el cdigo y crralo a ver qu obtiene. La idea es, justamente, que la instruccin switch invoca el case correspondiente justo al valor de la variable mi_num. En este caso, slo se muestran los strings entre comillas simples que aparecen dentro de disp()segn sea el caso. Hay que hacer notar que podramos lograr el mismo resultado del cdigo anterior mediante sentencias ifelseifelseend, pero la sentencia switchcaseend nos ofrece

una manera mucho ms cmoda para lograr lo que con ella se consigue. Trate de escribir el cdigo del recuadro anterior usando las sentencias mencionadas.

Ejercicios variados:
Escriba cdigos que resuelvan los problemas en los siguientes enunciados: 1) Implemente el mtodo de Newton-Raphson en Matlab/Octave y encuentre la raz ms cercana al origen (ya sea positiva o negativa) de las siguientes funciones, usando el punto inicial y la tolerancia indicadas [recomendamos graficar las funciones indicadas para tener una mejor idea de dnde se ubica la raz buscada] a. b. c. ( ) ( ) ( ) ( ) ( ) ( ) ( ; ; ) ; ; (igual que el anterior) ;

2) Halle la suma de la serie

3) Encuentre el nmero ms pequeo tal que 4) Genere un vector con los nmeros primos menores que cierto n dado. Sugerencia: use la instruccin isprime() y ciclos forend o while end 5) Dado un vector cualquiera x de longitud a lo sumo 10, genere una matriz cuyas filas sean el mismo vector x pero con las componentes desplazadas cclicamente. Es decir, si el vector x = [1,3,5], la matriz ser [ ].

6) Dado un vector P=[P1, P2, P3] donde P1>P2>2000>P3>1500 , genere un vector ordenado Pr donde aparezcan P1, P2 y P3, pero en el cual, a partir de P2, se comience a decrecer, de 200 en 200, hasta cero. Es decir: si P =[2500, 2200, 1800] el vector Pr ser Pr =[2500, 2200, 2000, 1800, 1600, 1400, 1200, , 200, 0 ] Note que P3 (que vale 1800) aparece una sola vez en el vector Pr. [Nota: para ordenar el vector puede usar los comandos sort() y fliplr() o algn otro que escriba usted mismo/a o descubra en sus excursiones por Matlab/Octave]

S-ar putea să vă placă și