Академический Документы
Профессиональный Документы
Культура Документы
\
|
+ +
+ +
=
|
|
.
|
\
|
|
|
.
|
\
|
i . d g . c h . d f . c
i . b g . a h . b f . a
i h
g f
*
d c
b a
-->A=[1,1;2,2];B=[2,2]';C=[3,3;1,1];
-->A*B
ans =
4.
8.
-->A.*C //product elemento por elemento
ans =
3. 3.
2. 2.
22
Debido al uso del doble punto en la notacin al operador se le conoce con el nombre de
generador doble punto y tambin se utiliza en otras circunstancias. Por ejemplo si se dispone
de una matriz c y se escribe d = c(:,2:3), el primer doble punto significa que se est
considerando todas las filas, y luego las columnas de 2 a 3 con saltos de 1, es decir:
Otra forma de generar un vector linealmente espaciado es mediante la sentencia linspace, que
genera un vector fila de n puntos igualmente espaciados entre x1 y x2. v ser un vector fila,
real o complejo de acuerdo al valor de x1 y x2; n es un entero. El valor por defecto es 100.
[v]=linspace(x1,x2 [,n])
-->x=3:0.5:7
x =
3. 3.5 4. 4.5 5. 5.5 6. 6.5 7.
-->c=[-1 0 0;1 1 0;-1 1 0]
c =
- 1. 0. 0.
1. 1. 0.
- 1. 1. 0.
-->d=c(:,2:3)
d =
0. 0.
1. 0.
1. 0.
-->linspace(1,2,5)
ans =
1. 1.25 1.5 1.75 2.
-->linspace(1+%i,2+2*%i,5)
ans =
1. + i 1.25 + 1.25i 1.5 + 1.5i 1.75 + 1.75i 2. + 2.i
23
2.10. TIRA DE CARACTERES
Una cadena de caracteres (string) es bsicamente una variable que contiene un texto que se
coloca entre comillas simples o dobles. Una cadena de caracteres puede ser manipulada a
travs de comandos especficos. En esta seccin veremos algunos que pueden ser de gran
utilidad cuando se trabaja con archivos de texto.
Dos o ms cadenas de caracteres pueden unirse en sucesin mediante la operacin de
concatenacin, que se realiza directamente empleando el smbolo +:
Las matrices de caracteres se construyen como matrices ordinarias, es decir utilizando
corchetes. Un uso muy importante de las matrices de caracteres es la manipulacin y creacin
de funciones. El siguiente ejemplo ilustra la creacin de una matriz de caracteres.
La funcin length calcula la cantidad de caracteres en la tira. Para matrices de tiras de
caracteres retorna la longitud de cada uno de los elementos de la matriz.
-->t1="El resultado es "
t1 =
El resultado es
-->t2="positivo"
t2 =
positivo
-->t3=t1+t2
t3 =
El resultado es positivo
-->A=['x' 'y';'z' 'w+v']
A =
!x y !
! !
!z w+v !
24
La funcin part permite extraer caracteres de una tira, para lo cual debemos indicar la
posicin del los caracteres a extraer. Para extraer una serie de caracteres, la posicin se indica
como una secuencia de valores.
La funcin strindex(str1,str2) proporciona la posicin que la tira str2 tiene en str1. Una vez
que se determina la posicin de str2 se puede utilizar la funcin part para extraerlo de la tira.
La funcin strsubst(str1,str2,str3) reemplaza str2 con str3 en la tira str1.
-->length(123)
ans =
3.
-->M=['a','bb';'ccc','dddd'];
-->length(M)
ans =
1. 2.
3. 4.
-->part("abcd",1)
ans =
a
-->part("abcd",[1,3])
ans =
ac
-->t3=El resultado es positivo;
-->part(t3,[1:12])
ans =
El resultado
-->t3=El resultado es positivo
-->strindex(t3,"es")
ans =
5. 14.
-->strsubst(t3,"positivo","negativo")
ans =
El resultado es negativo
25
La funcin strcat(str1,str2) genera una tira insertando str2 entre los caracteres de str1. Este
ltimo tiene que ser un vector de caracteres.
La funcin string(x) convierte la matriz x en una matriz de caracteres:
Los caracteres nmeros pueden convertirse a datos numricos mediante la funcin evstr
(evaluate string).
-->s=['a' 'b' 'c']
s =
!a b c !
-->strcat(s,'-')
ans =
a-b-c
-->s2=string(7)
s2 =
7
-->s3='la suma es '+s2
s3 =
la suma es 7
-->s4=string(1:5)
s4 =
!1 2 3 4 5 !
-->s5=s4(1)+s4(5)
s5 =
15
-->s5+s4
ans =
!151 152 153 154 155 !
-->n1=evstr(s4)
n1 =
! 1. 2. 3. 4. 5. !
-->n1(1)+n1(5)
ans =
6.
-->evstr('2+2')
ans =
4.
26
Como se observa en el ltimo ejemplo, la funcin puede usarse para evaluar cualquier
operacin expresada como caracteres, incluyendo las que tienen variables que guardan
nmeros. Tambin pueden ejecutarse sentencias expresadas como tiras de caracteres mediante
la funcin execstr (execute string).
El resultado no se muestra pero al llamar las variables de salida se verifica que se ha
realizado. Lo mismo se puede hacer con varias sentencias en un vector, como en el caso del
ltimo ejemplo. El ejemplo siguiente muestra la ejecucin de un programa cuyas lneas se
presentan como tiras de un vector:
-->execstr(['a=1' 'b=sqrt(9)'])
-->a b
-->a
a =
1.
-->b
b =
3.
-->execstr(['a=2' 'x=[]' 'for j = 1:4' 'x = [x a^j]' 'end'])
-->x
x =
2. 4. 8. 16.
27
CAPITULO 3
PROGRAMACIN
3.1. INTRODUCCIN
La forma interactiva de la Scilab resulta cmoda cuando se necesitan realizar clculos que
hagan uso de unos pocos comandos. A medida que el clculo se complica, la lista de
comandos se agranda y por ende se facilitan las equivocaciones. Por otra parte, resulta til que
una sucesin de comandos pueda guardarse para poder usarla posteriormente. A ese conjunto
de sentencias que se puede ejecutar todas las veces que se requiera se le denomina un
programa.
Es posible guardar el programa en un archivo de texto, para luego llamar y ejecutar las lneas
de sentencias. En Scilab, la lista de comandos se organiza en un tipo de estructura a las que se
les da el nombre de guin (script). Esta se guarda en un archivo de texto con extensin sci o
sce. Por lo general se reserva la extensin sci para funciones definidas por el usuario para
aplicaciones especficas. Por ejemplo, un archivo para una funcin que calcula el promedio de
una lista de nmeros puede llamarse promedio.sci. Cuando se escriben programas ms
extensos, donde se involucra el uso de varias sentencias y/o funciones se lo identifica con la
extensin .sce. Esto puede verse cuando se quiere guardar una funcin, por default, aparece
un archivo *.sci o en el caso de un listado de comandos, aparece *.sce. El uso de las
extensiones es solo una convencin y Scilab puede ejecutar programas (funciones y/o scripts)
con cualquier extensin e inclusive sin extensin.
La estructura de un programa puede ser ms rica que una simple sucesin de comandos,
puesto que estos debern ser ejecutados con cierta lgica, dependiendo de las necesidades
propias de la aplicacin. En Scilab existen comandos que permiten tomar decisiones de
acuerdo a los resultados obtenidos, o permiten repetir un clculo con distintos datos iniciales.
28
Estos enriquecen mucho las posibilidades numricas de una funcin y son los llamados
comandos de control que sern detallados ms adelante.
Adems de los comandos de control de flujo, los siguientes comandos son muy tiles para
utilizar en la confeccin y manejos de programas.
- ; (operador punto y coma) colocado al final de una sentencia evita la impresin en
pantalla de la salida del comando.
- // permite introducir comentario, lneas que no se ejecutan.
- Para ver el directorio actual de trabajo: --> pwd
- Para cambiar el directorio de trabajo: --> chdir(nombre de nuevo directorio)
- Para listar archivos existentes en el directorio de trabajo: --> ls
- Para ejecutar un programa que est en un directorio se usa: --> exec(nombre de
archivo)
3.2. DIRECTORIO PRINCIPAL DE TRABAJO
Scilab establece al inicio, un directorio de trabajo por defecto. Este directorio de trabajo
depende del Sistema Operativo que se est utilizando y de la forma que se instal Scilab. Se
puede visualizar el directorio de trabajo actual de Scilab mediante el comando pwd.
La carpeta scilab-5.3.1 aparece aqu como el directorio de trabajo de Scilab. En la versin
de Scilab para Linux el directorio de trabajo por defecto es el home de la cuenta del usuario
que ha iniciado la sesin.
Generalmente, para evitar la mezcla de archivos, los programas no se guardan en el directorio
de trabajo por defecto y puede resultar un poco tedioso indicar el lugar donde est ubicada
cada funcin para ejecutarla. Existe una alternativa. Se puede modificar el directorio de
-->pwd
ans =
C:\Archivos de programa\scilab-5.3.1
29
trabajo utilizando el comando chdir (change directory). En el ejemplo siguiente se cambia al
directorio programa-scilab.
Si el archivo de comandos que se desea utilizar se encuentra en el directorio de trabajo actual,
basta ejecutar el comando exec acompaado del nombre de la funcin para correr el
programa.
En el men de File, de la barra de Scilab, tambin existen opciones que se pueden utilizar
para ejecutar los programas guardados, para cambiar el directorio actual o mostrar el
directorio de trabajo, y que facilitan la bsqueda de carpetas y archivos.
3.3. GUARDANDO LA SESIN DE TRABAJO
Los comandos que se van ingresando y ejecutando quedan almacenados en el historial de
Scilab, ste puede ser recorrido con las teclas hacia arriba | y hacia abajo +. Los
comandos van apareciendo en la lnea de entrada del Scilab y el que nos interesa puede
ejecutarse sin necesidad de volver a escribirlo en su totalidad, eventualmente pueden
introducirse modificaciones en la lnea de rdenes mediante las teclas izquierda y
derecha .
En las versiones ms nuevas de Scilab, cualquiera de ellas puede ser copiada utilizando las
opciones copiar y pegar del men Editar. En particular, esto puede utilizarse para ir
generando informacin sobre los clculos realizados. Esto es como se ha hecho en estos
apuntes, donde los cuadros de ejemplos han sido llenados con informacin recogida de esa
manera.
-->exec caida.sci ;
-->chdir ('C:\programas-scilab')
ans =
T
-->pwd
ans =
C:\programas-scilab
30
Es posible guardar en un archivo todos los comandos y resultados que se van obteniendo en
una sesin de trabajo mediante el comando diary. Si se ejecuta al comienzo de la sesin:
diary(nombre_archivo)
a partir de ese momento, todas las entradas y salidas interactivas van quedando registradas en
el archivo nombre_archivo, que se guardar en el directorio de trabajo.
Para interrumpir el registro basta escribir la orden:
diary(0)
De ah en adelante no se guarda el intercambio. Cabe aclarar que el comando diary guarda las
entradas y las salidas tal como aparecen en la ventana de trabajo de Scilab.
Esto puede tener varios usos. Por ejemplo, si se est probando una funcin ensayando la
entrada de cada uno de sus comandos, ellos quedan guardados con diary. Luego se toma el
archivo con un editor de textos y eliminando los renglones innecesarios queda escrita la
funcin que se estuvo ensayando, lista para ser usada.
En File, de la barra de mens de Scilab, tambin existen opciones para guardar y
posteriormente recuperar (cargar) el entorno, es decir la sesin de trabajo, lo que genera un
archivo de resguardo con extensin .sav. A diferencia del archivo generado por el comando
diary este no se puede editar.
3.4. ENTRADA Y SALIDA SENCILLAS
La funcin input se utiliza para la entrada de datos a travs de la consola. Su forma general es:
[x] = input(mensaje,[string])
x es la variable cuyo valor se requiere ingresar, mensaje es un letrero que aparecer en la
consola identificando la entrada requerida, el argumento string o s slo se coloca si se
solicita el ingreso de una variable tipo tira de caracteres.
31
Esta funcin no se utiliza cuando se trabaja en forma interactiva, ya que en ese caso las
variables se ingresan en forma directa. En cambio si puede ser de mucha utilidad cuando se
necesita entrar datos en un programa.
La funcin disp imprime el contenido de una variable en la salida estndar (monitor). Su
forma general es:
disp(x
1
,[x
2
,....,x
n
])
Donde las x
n
pueden ser nombres de variables, constantes o tiras de caracteres. Esta funcin
requiere al menos un argumento. De haber varios se van mostrando uno por lnea,
comenzando por el ltimo.
-->x=input("Entre un valor de x:")
Entre un valor de x:2.5
x =
2.5
-->m=input("Entre un titulo para el problema:","s")
Entre un titulo para el problema: Problema N 1
m =
Problema N 1
-->x=2.5,y=13.2
x =
2.5
y =
13.2
-->disp(y,"y=",x,"x=")
x=
2.5
y=
13.2
32
3.5. ESTRUCTURA DE UNA FUNCIN
Supongamos que queremos evaluar numricamente el
movimiento de una bola que se arroja verticalmente. Si se
coloca un eje z, ver figura, la posicin queda identificada por la
coordenada z y el movimiento est descripto por la funcin z(t)
donde t es el tiempo. Si el eje es positivo hacia arriba, la bola
parte del origen, su velocidad inicial vale v
o
y la aceleracin de
la gravedad es g. La ecuacin del movimiento es:
z = v
o
*t - 0.5*g*t
2
Se supone que aceleracin y velocidad son positivas cuando se orientan hacia arriba.
Los comandos para calcular esta expresin en forma interactiva se dan en la pantalla de abajo.
En esta, se han dado valores especficos a la velocidad inicial (2 ms
-1
), gravedad (9,8 ms
-2
),
tiempo (10 s). Esto se hace a continuacin del primer prompt y en el segundo se introduce la
ecuacin para calcular la posicin. La respuesta es que la bola ha cado 470 m desde donde se
inici el movimiento.
Si deseamos calcular z varias veces convendr colocar este procedimiento dentro de una
funcin. Para ello se debe utilizar un editor de texto donde escribir la funcin, se puede
utilizar cualquier editor, pero Scilab dispone de SciNotes, que se ejecuta desde el men
Applications.
z
v
o
origen
g
FIG.- Movimiento vertical
de una bola.
-->vo=2 , g= 9.8 , t=10
vo =
2.
g =
9.8
t =
10.
-->z= vo*t - 0.5*g*t^2
z =
- 470.
33
La estructura que debe tener la funcin para que Scilab la reconozca es:
function [res1,res2,] = nombre(par1,par2,....)
endfunction
Las lneas de punto indican dnde deben colocarse los comandos de clculo. El nombre
identifica a la funcin y deber ser llamada desde la ventana de trabajo con ese nombre; par1,
par2, etc. son parmetros que se introducen desde fuera de la funcin para que sean usados
por la misma en el clculo; res1, res2, etc. son las variables en las cuales la funcin devuelve
los resultados del clculo.
Tomando el caso del ejemplo anterior, se crea la funcin caida que almacena el resultado
del clculo en la variable z, y que contiene los siguientes comandos:
Cabe mencionar que en el editor SciNote los distintos tipos de comandos se muestran con
colores caractersticos, lo que facilita la lectura del procedimiento. Tambin ayuda mucho a la
lectura el utilizar sangras (cdigo tabulado) entre bloques de comando que pertenecen a un
mismo nivel de decisin. Los comandos que comienzan con // son comentarios que Scilab no
procesa. Se colocan en un procedimiento para que el que inspecciona la funcin tenga una
explicacin adecuada del clculo.
Para usar la funcin es necesario que est guardada en un archivo, por ejemplo caida.sci, e
indicarle a Scilab donde est para que la encuentre. Si la funcin est en el directorio de
trabajo, esto se realiza mediante el comando exec como sigue:
function z = caida(vo,g,t)
// Calculo de la posicin de una bola en cada libre
// vo = velocidad de la bola
// g = aceleracin
// t = tiempo,
// z = distancia resultado
z = vo*t - 0.5*g*t^2
endfunction
34
-->exec(caida.sci);
Esto basta hacerlo una vez, por ejemplo cuando se pone en marcha Scilab, para que la funcin
est disponible para otros clculos. El camino (path) que se coloc antes de llegar al archivo
caida.sci es uno en particular y debe coincidir con el directorio donde se guarda la funcin
creada. A menos que definamos otro lugar casi siempre ser el directorio de trabajo de cada
usuario. El punto y coma al final del comando evita que todas las lneas del programa
aparezcan en la pantalla de trabajo cuando se carga la funcin, esto mejora la lectura de la
pantalla de trabajo. Se aprecia en el programa caida.sci que la letra z no se ha puesto entre los
corchetes [ ]. Esto se puede hacer si la funcin tiene una sola respuesta. Si hay varias se
colocarn separadas por coma como se indica en la definicin general de la estructura de una
funcin.
A continuacin ejecutaremos la funcin, para lo cual se la carga con la opcin ejecutar desde
el directorio File o con la sentencia exec directamente en el prompt de la ventana de trabajo.
Luego se llama la funcin con su nombre asignando el resultado a la variable x. En el llamado
hay que introducir el valor de los parmetros. En el ejemplo se asignan los siguientes valores
v
o
: 3 m/s, g: 9.8 m/s
2
y t: 2 s. El resultado es 13,6 m. Debe tenerse cuidado de colocar
adecuadamente los signos. Obsrvese que se utiliza la variable x para cargar el resultado de la
funcin, mientras que adentro de la misma se utiliz la variable z. Esto se puede hacer porque
las variables en la funcin son locales y no globales, lo que se explicar mas adelante.
Como se indic anteriormente, bajo el men File aparece la opcin ejecutar. Si se llama
desde all se abre una ventana para el manejo de directorios. Desde all se busca el directorio
donde se encuentra la funcin. Esto es cmodo si no recordamos exactamente la ubicacin de
la misma.
3.6. VARIABLES GLOBALES Y LOCALES
-->exec(caida.sci);
-->x=caida(3,9.8,2)
x =
- 13.6
35
Cuando dentro de un programa se utiliza una funcin, las variables definidas dentro de la
funcin no estn disponibles para el programa principal, se dice que son variables locales a la
funcin. Ambos, funcin y programa principal, se comunican a travs de los parmetros de la
funcin, por ellos se ingresa la informacin externa necesaria, y por medio de las variables de
salida de la funcin, sta entrega los clculos realizados.
Existe la posibilidad de utilizar dentro de una funcin una variable que se declara en el
programa principal, declarndola como variable global. Para ello basta definir una variable
dada, por ejemplo vari1, mediante el comando global como se indica a continuacin:
global vari1 o global(vari1)
Este comando se escribe en el programa principal, generalmente al inicio. Como se aprecia, el
comando puede escribirse en dos formas diferentes. Una vez definida como global, la variable
vari1 puede ser usada dentro de cualquier funcin con el valor que se le asigna sin
necesidad de entrarla como un parmetro de la funcin. Por supuesto, en ese caso cualquier
cambio que se le haga al valor de la variable dentro de la funcin tambin va a cambiar el
valor de la variable en el programa principal.
Como ejemplo, supongamos que se escribe la siguiente funcin, que se guarda con el nombre
pru.sci
En ella se introduce como parmetro la variable b y se usa directamente la variable f, para
lo cual deber estar definida anteriormente como variable global. En el cuadro siguiente, en
primer lugar se carga la funcin pru. Luego se define la variable f como global, y dentro del
programa principal, se asignan los valores de las variables f y b, siendo sta ltima la nica
que se introduce como parmetro de la funcin. Luego se llama la funcin pru que realiza el
producto de b por f. Como se observa, el valor de f es usado directamente por la funcin, sin
que tenga que ser ingresada como un parmetro.
function c=pru(b)
c=b*f
endfunction
36
Es posible definir una variable local de una funcin como global. En ese caso quedar
disponible para ser utilizada en otra funcin, para lo cual la misma debe ser definida tambin
como global en la nueva funcin. Como ejemplo, definamos una funcin pru1 cuyo nico
objetivo es definir la variable z interna a la funcin. Para que ella est disponible para otro
programa se la define como global. Por otro lado, en el otro programa, pru2, tambin se
define z como una variable global y se realiza el producto de esta con el parmetro de entrada
b; el resultado se guarda en la variable c.
A continuacin, luego de cargarlas en Scilab, llamamos sucesivamente pru1 y pru2,
observando como pru2 usa correctamente el valor de z definido por pru1.
-->exec pru.sci;
-->global f
-->f=6; b=2;
-->pru(b)
ans =
12.
-->pru1()
ans =
3.
-->b=2
b =
2.
-->pru2(b)
ans =
6.
function z=pru1()
global z
z=3
endfunction
function c=pru2(b)
global z
c=b*z
endfunction
37
Un caso tpico del uso de variables globales es el de constantes que se utilizan a lo largo del
clculo, que conviene definirlas globales para no repetir definiciones en cada funcin. Fuera
de estos casos y para evitar errores de programacin, en general no se recomienda el uso de
variables globales y en la medida de lo posible solamente utilizar variables locales en las
funciones, haciendo el intercambio de informacin a travs de los parmetros formales.
3.7. OPERADORES RELACIONALES Y LGICOS
Acabamos de ver la forma en que se define una funcin utilizando un ejemplo muy sencillo
con un solo comando. En la prctica, las funciones constarn de ms de un comando, por lo
que con el fin de plantear clculos de utilidad ser necesario disponer de mayor ductilidad en
dos aspectos:
a) En poder tomar decisiones en el clculo teniendo en cuenta los resultados que se estn
obteniendo. Por ejemplo, el clculo a realizar podra ser distinto si el valor de una
cierta variable es positivo o negativo.
b) En muchos casos es necesario realizar clculos repetitivos. Por ejemplo, obtener el
resultado de un cierto clculo varias veces con distintos valores de los datos.
La toma de decisiones se har por comparaciones numricas o lgicas en el programa. Se
necesita disponer de operadores que puedan hacer esas operaciones. Ellos son de dos tipos:
operadores relacionales y operadores lgicos.
a) Los operadores relacionales son aquellos capaces de comparar dos cantidades
numricas y decidir cuanto vale una respecto a otra. Los que estn disponibles,
incluyendo el smbolo que los definen son las siguientes:
< menor
<= menor o igual
> mayor
>= mayor o igual
== igual
~= <> diferente
38
Mediante estos operadores se comparan los valores de las variables. Por ejemplo, si se
dispone de dos variable, e y f, y se quiere saber si e es menor que f se preguntar:
e < f
El resultado de la operacin ser un valor lgico, verdadero (True) o falso (False).
Estas operaciones pueden combinarse mediante operadores lgicos.
b) Los operadores lgicos compararn valores lgicos derivados de comparaciones
relacionales. Los operadores lgicos son:
& y
| o
~ no
Por ejemplo, si se tienen 4 variables p, q, r y s se podra escribir: p < q & r > s. Si p es
menor que q y r mayor que s esta comparacin lgica dar un valor lgico verdadero.
3.8. SENTENCIAS DE CONTROL DE FLUJO
-->e=3;f=5;
-->e>f
ans =
F
-->p=2;q=5;r=7;s=3;
-->p<q & r>s
ans =
T
39
Como todo lenguaje de programacin, en Scilab podemos encontrar bifurcaciones y bucles
que son de suma utilidad a la hora de hacer tomas de decisiones. Las bifurcaciones sirven para
realizar una u otra operacin, mientras que los bucles nos permiten realizar varias iteraciones
de un mismo proceso. A continuacin describimos los comandos de control de flujo
disponibles, as como algunos comandos especiales asociados con ellos.
3.8.1. Comando If
El comando if es una sentencia de bifurcacin con la que se puede inspeccionar una condicin
descripta mediante un operador relacional o combinaciones lgicas de los mismos. Su forma
ms sencilla es:
if condicin then
..........................
end
Si la condicin tiene un resultado lgico verdadero el programa ejecuta las sentencias
indicadas con punteado. De lo contrario, salta directamente a continuacin de end.
La condicin del if puede ser una condicin lgica, del tipo A==B, donde A y B son matrices
del mismo tamao. Para que se considere que la condicin se cumple, es necesario que sean
iguales todos los elementos de las matrices A y B. Basta que haya dos elementos diferentes
para que las matrices no sean iguales, y por tanto las sentencias del if no se ejecuten.
Condicin
Sentencia 1 Sentencia 2
falso
verdadero
falso
Condicin 2
Sentencia 3 Sentencia 2
verdadero
Condicin 1
falso
verdadero
Sentencia 1
40
Otra posibilidad es una bifurcacin entre verdadero y falso haciendo uso de la sentencia else.
Si la condicin es verdadera se ejecutan las sentencias dentro del bloque then, si la condicin
resulta falsa se ejecutan las sentencias correspondientes al bloque else.
if condicin then
..........................
else
..
end
Otra alternativa son las bifurcaciones anidadas, de acuerdo al resultado de la condicin de la
sentencia elseif:
If condicin1
elseif condicin 2
else
end
Habitualmente estas condiciones forman parte de una funcin, pero tambin se pueden usar
expresadas en un solo rengln dentro del entorno interactivo separando las sentencias con
comas. Por ejemplo:
3.8.2. Comando for
-->If x<0 , fx=x^3, else, fx= 3*x^2, end
condicin
Sentencias
falso
verdadero
41
El comando for se utiliza si se quiere realizar una accin en forma repetitiva, teniendo en
cuenta una variable que se incrementa en cada paso y que puede ser utilizada para cambiar
algn aspecto del clculo que se repite:
for var= limite1:incremento:limite2
...........................
...........................
end
La variable se incrementa desde el limite1 hasta el limite2 avanzando en pasos de incremento.
Se suele decir que se est realizando un bucle. La variable var puede ser usada en los
comandos dentro del bucle para variar el clculo en cada paso. Se pueden introducir varios
bucles, uno dentro del otro, anidados. En este caso se requiere que cada for est terminado por
su respectivo end.
Los comandos de flujo pueden ser usados en forma conjunta. Por ejemplo, un comando if
puede estar dentro del grupo de comandos de un bucle for, pero cada uno de ellos deber estar
cerrado por su respectivo end.
En este ejemplo el ciclo for repite las sentencias para los valores de x que van de -3 a +3 con
incrementos de 1 (valor por defecto). Si el valor es negativo o cero se calcula el cubo y
cuando es positivo se calcula el cuadrado.
3.8.3 Comando while
En este caso tambin se ejecuta una accin repetitiva. Se fija la condicin, y siempre que sta
se cumpla, el bucle se repite. Al dejar de cumplirse la condicin impuesta se termina el bucle
y se contina con la instruccin siguiente.
for x= -3:3;
if x=<0 then;
fx=x^3
else;
fx= x^2
end;
end;
42
while condicin
...................
end
Se diferencia del ciclo for en que necesariamente la accin dentro del bucle debe modificar
la(s) variable(s) de la condicin. Esta condicin debe alcanzar el valor lgico false, en algn
momento de la ejecucin, porque de lo contrario se entrara en un bucle sin salida que
repetira infinitamente las instrucciones dentro del bloque, provocando que el programa no
contine. En el siguiente ejemplo se genera la tabla del dos hasta llegar a 10.
3.8.4. El comando select
Este comando es una forma abreviada de sentencias if-elseif sucesivos, donde los valores que
puede tomar la variable de control deben estar claramente definidos, para buscar el
cumplimiento entre varias alternativas:
select variable
case valor1 then
case valor2 then
.
case valor n then
.
else
..
end
e=1; k=1;
while k < 11,
e=2*k
k=k+1;
end
43
Al principio se evala la variable de control cuyo resultado debe ser un escalar o una cadena
de caracteres. La condicin selecciona un resultado entre varios valores de variable, estos son
valor1,valor2, etc. Si variable no toma alguno de los valores dados, entonces se contina por
else ejecutando el ltimo conjunto de comandos.
En la primera lnea del ejemplo se genera un nmero en forma aleatoria y se toma su parte
entera. Si el nmero es cero se muestra el valor, si es uno tambin se muestra, en caso
contrario se muestra un cartel.
3.9. DEFINICIN DE FUNCIONES EN LNEA
Como se vio anteriormente, el usuario puede definir sus propias funciones en un archivo de
texto, los guarda con extensin sci y los carga en Scilab mediante el comando getf o exec
cuando quiere utilizarlos.
Existe una forma de hacer definicin de funciones en lnea (on-line) en la pantalla de trabajo y
en una sola instruccin a travs de la sentencia deff. Estas son muy tiles para programas que
slo se utilizan una vez o para probar partes de funciones en la etapa de diseo del programa.
La funcin no queda almacenada una vez que se termina la sesin de trabajo.
La descripcin del comando deff es la siguiente:
deff('[s1,s2,...]=nom_fun(e1,e2,....)', [inst1, inst2, ])
s1, s2, representan los nombres de las variables de salida, e1, e2,. representan los
nombres de las variables de entrada, nom_fun es el nombre de la funcin creada, inst1,
inst2, es una secuencia de instrucciones que se colocan como cadena de caracteres. Estas
n=round(10*rand(1,1))
select n
case 0 then
disp(0)
case 1 then
disp(1)
else
disp("ni 1 ni 0")
end
44
instrucciones constituyen la definicin de la funcin y deben incluir la asignacin de la
variable de salida.
El comando deff puede ser utilizado dentro de una funcin y la nueva funcin puede ser una
entrada o salida de cualquier otra funcin. A continuacin se dan algunos ejemplos de
definiciones:
-->deff('[y] = f(t)','y = exp(-t)*sin(2*t)')
-->y=f(10)
y =
0.0000414
-->deff('[x,y] = h(r,theta)',['x = r*cos(theta)','y = r*sin(theta)'])
-->r=1; theta=30;
-->[x,y]=h(r,theta)
y =
- 0.9880316
x =
0.1542514
45
CAPTULO 4
GRFICOS EN SCILAB
4.1. INTRODUCCIN
Scilab dispone de salidas grficas muy variadas, que permiten mostrar los resultados que se
obtienen de un programa o los datos que se reciben y es necesario analizar. Con los recursos
grficos de Scilab se pueden:
1) Mostrar funciones en dos y tres dimensiones, con gran variacin en la forma en que se
ingresan los datos y una buena disponibilidad de recursos tcnicos tales como figuras
en color, ampliaciones, rotaciones, etc .
2) Generar representaciones especiales como ser curvas de iso-valores, distribuciones
con tonos de gris, etc.
3) Mostrar animaciones, es decir, figuras que van cambiando con el tiempo.
Dada la gran variedad de recursos, se irn presentando en forma ordenada desde los recursos
ms sencillos y de uso comn hasta llegar a las representaciones ms elaboradas.
4.2. LA VENTANA GRFICA
Scilab abre una ventana distinta de la ventana de trabajo para dibujar los grficos solicitados.
Pueden abrirse varias ventanas grficas a la vez y estn identificadas con un nmero
(0,1,2,3....). En esta ventana grfica estn disponibles los siguientes mens:
- File
- Herramientas
- Editar
- ? (ayuda)
Dentro del men File encontramos las opciones:
New: abre una nueva ventana grfica.
46
Load: permite leer un grfico grabado en formato SCILAB.
Save: permite grabar el grfico en formato SCILAB , con la extensin . scg ( por defecto).
Export: permite grabar el grfico en formatos como Postscript, GIF, BMP, etc.
Copy to clipboard: copia el grfico al portapapeles para que puede pegarse en otros
documentos.
Print: imprime el grfico activo.
Close: cierra la ventana grfica.
El men Herramientas contiene comandos para poner o quitar la barra de herramientas,
agrandar o disminuir zonas de la imagen y rotar los grficos 3D. El men Editar contiene los
comandos propios de un editor grfico para cambiar las propiedades de la figura (forma de
ejes, letras color, etc)
Cuando ejecutamos una instruccin para generar grficos, como plot que se explicar a
continuacin, si ninguna ventana grfica est activada Scilab coloca el dibujo en la ventana
47
nmero 0. Si hacemos otro grfico ste se ubicar encima del primero. Por lo tanto es
necesario borrar el contenido de la ventana grfica, lo que puede hacerse de dos maneras:
- Desde el men Editar ( tem limpiar figura )
- Desde la ventana de trabajo de Scilab con la instruccin clf() o xbasc()
Podemos trabajar muy fcilmente con varias ventanas grficas, con la ayuda de las
instrucciones:
xset("window",num)
Convierte la ventana nmero num en la ventana activa.
Si esta ventana no existe, es creada por Scilab.
xselect()
Pone adelante la ventana activa. Si no existe alguna ventana
grfica, Scilab crea una.
xbasc(num)
Borra el contenido de la ventana grfica nmero num
Si num se omite, Scilab borra el contenido de la ventana
activa.
xdel(num)
Elimina la ventana grfica nmero num
Si num es omitido, Scilab elimina la ventana activa.
4.3. REPRESENTACIN EN 2D
La forma ms simple para trazar la grfica de una funcin de R x R es mediante la instruccin
plot. Para ello creamos previamente un vector x para las abcisas y un vector y para las
ordenadas. El comando plot(x,y) representa los puntos de coordenadas (x(i),y(i) unindolos
por defecto mediante lneas negras o de acuerdo a otro estilo que se haya especificado
previamente. La calidad de la representacin depender del nmero de puntos x(i),y(i) que se
grafiquen .
El llamado general de la funcin es:
plot(x,y,<lasp>,<globprop>)
48
Con plot tambin se puede graficar un conjunto de curvas, es decir hacer grficos mltiples.
plot(x1,y1,<lasp1>,x2,y2,<lasp2>,...xN,yN,<laspN>,<globprop1>,
<globprop2>,..<globpropN>)
x debe ser una matriz o un vector de nmeros reales. Si se omite se asume un vector de 1:n
donde n es el nmero de puntos de la variable y.
y debe ser una matriz o vector de reales, pero tambin puede ser una funcin definida.
<lasp> es un argumento opcional que especifica la manera en que se dibujan las lneas. Debe
ser una tira de caracteres y determina el estilo, las marcas y el color de las lneas dibujadas.
(ver LineSpec en 4.3.1).
<globprop> es un argumento opcional que define las propiedades globales de los objetos
comunes a todas las curvas creadas por plot. Son tiras de caracteres colocadas como pares de
sentencias {NombrePropiedad,ValorPropiedad}. (ver GlobalProperty).
Si y es un vector, plot(y) grafica el vector y versus el vector 1:size(y) .
Si y es una matriz, plot(y) grafica las columnas de y versus el vector 1:size(y,1) .
Si x e y son vectores, plot(x,y) grafica el vector y versus el vector x . Los vectores x e y deben
tener el mismo tamao.
Si x es un vector, e y una matriz, plot(x,y) dibuja cada una de las columnas de y versus el
vector x . En este caso la dimensin de las columnas de y debe ser igual a las de x.
Si x e y son matrices, plot(x,y) dibuja cada columnas de y versus las correspondientes
columnas de x . En este caso las dimensiones de x e y deben ser las mismas.
Si slo x o y es una matriz, el vector se dibuja versus las filas o las columnas de la matriz. La
eleccin depende si el vector, fila o columna, ajusta con las dimensiones de las filas o
columna de la matriz. En el caso de una matriz cuadrada la prioridad la tienen las columnas.
49
y tambin puede ser una funcin, en este caso se debe proporcionar x (como un vector o
matriz) y el clculo y(x) se hace implcitamente.
4.3.1 LineSpec
Se utiliza para cambiar rpidamente la apariencia de las lneas de un dibujo. Debe ser una tira
de caracteres que hace referencias al del estilo de la lnea, el marcador y el color. Estas
referencias deben ser especificadas sin ambigedades, el orden no es importante. Por ejemplo,
para una lnea roja de rayas largas con marcador tipo diamante, se puede escribir: 'r--d' o '--
-->x=linspace(0,3*%pi,50); y=x.*sin(x);
-->plot(x,y)
0 1 2 3 4 5 6 7 8 9 10
-5
-3
-1
1
3
5
7
9
-->x=[0:0.1:2*%pi];
-->plot(x-4,sin(x),x+2,cos(x))
50
dire' o '--reddiam'... o en forma completa 'diamondred--'. A continuacin se proporciona
una lista completa de los tipos que se pueden especificar.
LineStyle: define el estilo de la lnea.
Color: define el color.
Especificador Color
r Rojo
g Verde
b Azul
c Cian
m Magenta
y Amarillo
k Negro
w Blanco
Si no se especifica un color cuando se dibujan lneas mltiples, el color rota automticamente
segn esta tabla.
Especificador Estilo de Lnea
- Lnea Slida (default)
-- Lnea de trazos
: Lnea de puntos
-. Lnea de trazos y puntos
51
Marker type: Define el tipo de marcador. Si se especifica un marcador sin un estilo de lnea,
se dibuja solo el marcador.
Especificador Tipo de Marcador
+ Signo mas
o Circulo
* Asterisco
. Punto
x Cruz
'square' o 's' Cuadrado
'diamond' o 'd' Diamante
^ Triangulo hacia arriba
v Triangulo hacia abajo
> Triangulo hacia la derecha
< Triangulo hacia la izquierda
'pentagram' Estrella de cinco puntas
'none' Sin marcador (default)
Por ejemplo
clf();
R G B
0. 0. 1.
0. 0.5 0.
1. 0. 0.
0. 0.75 0.75
0.75 0. 0.75
0.75 0.75 0.
0.25 0.25 0.25
52
x=1:0.1:10;
plot(x,sin(x),'r-.>')
dibuja la funcin seno con una lnea roja de raya-puntos con un tringulo apuntando a la
derecha centrado sobre cada punto.
4.3.2. GlobalProperty
Es posible modificar la apariencia de todas las curvas en forma global. Se debe especificar el
par {Nombre_Propiedad, Valor_Propiedad}, pudindose colocar en un grfico varios pares al
mismo tiempo. Nombre_Propiedad es una tira de caracteres con la propiedad a modificar.
Valor_Propiedad puede ser un real, entero o tira de caracteres, dependiendo del tipo de
propiedad. Por ejemplo, para especificar una lnea roja (nombre Color), con raya y puntos
(nombre Line Style) con marcador diamante (nombre Marker), la secuencia debe ser:
'Colo','red','LineSt','-.','Marker','diam'. No es necesario colocar el nombre o el valor completo
de la propiedad. Tampoco importa el orden, pero no debe haber ambigedades.
GlobalProperty predomina sobre cualquier LineSpec previamente especificado.
A continuacin se proporciona una lista de Nombres y sus Valores asociados:
Clipping: caracteres con valor "on" o "off" definiendo el modo de cortado ( "on" por
defecto).
Color o Foreground: caracteres especificando un color o un vector RGB de 1 x 3. Este ltimo
es una 3-upla que corresponde a la intensidad de rojo, vede y azul entre 0 y 1.
LineStyle: una tira de caracteres que define el estilo de lnea, en forma idntica que con
LineSpec.
Marker o MarkStyle: Una tira de caracteres que define el tipo de marcador. Idntico que con
LineSpec.
MarkerEdgeColor or MarkForeground: Una tira de caracteres definiendo un color en el
formato RGB. Idntico a Color pero para el borde del marcador.
MarkerFaceColor or MarkBackground: Idntico a Color pero para el fondo del marcador.
MarkerSize or MarkSize: un escalar que define el tamao del marcador en unidades de punto.
Visible: una cadena de caracteres "on" o "off" definiendo la visibilidad ( "on" por defecto).
53
X data: un vector o matriz real redefiniendo los datos para todas las lneas o superficies
dibujadas. Debe ajustase con los X data previamente especificados. Es decir, todas las
matrices de datos deben ser de la misma dimensin.
Y data: Idntico al anterior pero para los datos Y.
Z data: cuando se usa con plot , un vector o matriz real agregando datos Z para todas las
lneas dibujadas; Este debe tener las mismas dimensiones que los X e Y data previamente
especificados.
Por ejemplo
clf();
x=1:10;
plot(x,sin(x),'colo','red','linest','-.','marker','>','markeredg',
'cyan','markerFace','yellow','markersize',5)
dibuja una lnea de color rojo, con estilo raya-puntos, marcador tringulo hacia la derecha, los
bordes del tringulo de color cian, las caras de color amarillo y tamao 5 puntos.
La representacin de una funcin se pueden hacer con el comando plot, pero para ello es
necesario definir previamente la funcin que se va a representar. Por ejemplo, a continuacin
se grafica el cuadrado de un nmero:
deff('[y]=toto(x)','y=x.*x')
plot(1:10,toto)
Se obtiene el mismo resultado mediante fplot2d
Cuando queremos superponer varias curvas en el mismo grfico, se puede usar el comando
plot2d, que permite fijar estilos diferentes para cada curva. La sintaxis general es la siguiente:
-->deff("y=f(x)","y=x.*sin(x)")
-->x=linspace(0,3*%pi,100);
-->fplot2d(x,f)
54
plot2d(abscisas, ordenadas, estilo, <marco, leyendas, lmites, graduacin>)
Los argumentos a partir del tercero son optativos, pero si se fija uno debern fijarse los otros.
El significado de estos argumentos es el siguiente:
abscisas, ordenadas: son matrices de la misma dimensin. Si fueran vectores (para trazar una
sola curva), deben ser fila o columna. Por defecto los puntos sern unidos por segmentos. A
cada curva le corresponde un color ( hay 32 colores).
estilo: es un vector lnea cuya dimensin es el nmero de curvas a trazar (nmero de
columnas de las matrices abscisas y ordenadas). Las coordenadas son positivas o negativas. Si
el estilo es positivo, los puntos se unen por segmentos. Si el estilo es nulo, los puntos se
presentan como pixeles negros. Si el estilo es negativo, se presentan como marcas de formas
particulares.
marco : este parmetro es una tira de caracteres formado por tres cifras, tales que :
- la primera indica la presencia o no de leyendas ( 0 o 1),
- la segunda indica la forma de clculo de las escalas,
- la tercera indica el trazado de ejes o del marco.
Por defecto el argumento marco vale 021 (sin leyendas, escalas calculadas automticamente
y con ejes). Si superponemos dos grficos con esta opcin por defecto, las escalas no sern las
mismas. La solucin consiste en trazar todos los grficos a partir del segundo sobre una
misma ventana con la opcin 000 (sin leyenda, utilizar la escala precedente, sin trazar los
ejes).
leyendas: es una cadena de caracteres que contiene las diferentes leyendas, separadas por @.
lmites: es el rectngulo de la representacin, descrito por las dos coordenadas de la esquina
inferior izquierda, seguidas de las dos coordenadas de la esquina superior derecha:
[xmin,ymin,xmax,ymax].
graduaciones: este vector de cuatro enteros permite precisar las graduaciones y
subgraduaciones en abscisa y ordenada. Por ejemplo, con [2,10,4,5], el intervalo de las
55
abscisas de dividir en 10, siendo cada uno de los subintervalos divididos en dos. Para las
ordenadas habr 5 subintervalos, cada uno dividido en 4.
logflag: Esta opcin puede usarse para fijar las escala ( lineal o logartmica) a lo largo de los
ejes. Los valores asociados son tiras de caracteres con los valores posibles: "nn" , "nl" , "ln"
and "ll" . "l" para escala logartmica y n para escala normal.
Los comandos plot y plot2d producen lneas continuas para las curvas que se grafican. Si
queremos usar otro tipo de curvas debemos considera el uso de otros comandos grficos como
plot2d2(grficos en escaln), plot2d3(barras verticales), y plot2d4(estilo con flechas).
4.4. MANIPULACIN DE LOS PARMETROS DEL GRFICO
Los parmetros globales de un grfico se refieren a las opciones usadas en el grfico como el
tipo y tamao de letra de las etiquetas, el tipo y tamao de marcas para los puntos graficados,
el mapa de colores (una matriz de definiciones de colores para las reas llenas del grfico), el
nmero de ventanas que se crearn, la posicin de la ventana grfica, etc. Estas propiedades
pueden cambiarse mediante el comando xset:
xset(choice-name,x1,x2,x3,x4,x5)
xset( )
-->x=linspace(0,3*%pi,30); X=x'*ones(1,10);
-->y=x.*sin(x); Y=y'*[1:10];
-->colores=matrix([2;5]*ones(1,5),1,10)
-->xbasc()
-->plot2d(X,Y,colores)
-->marcas=-[0:9]
-->xbasc()
-->plot2d(X,Y,marcas)
-->xbasc();
-->plot2d(x,y)
-->plot2d(x,y2,1,"000")
-->x=linspace(0,3*%pi,30);
-->y=x.*sin(x);
-->xbasc()
-->plot2d(x,y,1,"011"," ",[0,-10,10,10],[2,10,4,5])
56
Los parmetros de esta funcin son un string, choice-name (propiedad que se desea cambiar),
y cinco nmeros, , x1,x2,x3,x4,x5, que dependen del valor de choice-name y la definen en
detalle. Algunas de las propiedades que pueden manejarse con xset son:
xset("auto clear","on"|"off"): Cuando est en on los grficos sucesivos no se superponen, se
hace una operacin xbasc() entre cada grfico. El valor por defecto es off.
xset("background",color) : Fija el color del fondo de la ventana grfica.
xset("colormap",cmap): Fija el mapa de colores como una matriz de mx3, donde m es el
nmero de colores. Cada color est dado por tres nmeros que corresponden a las
intensidades entre 0 y 1 de rojo, verde y azul.
xset("default"):Vuelve el entorno grfico a sus valores por defecto.
xset("font",fontid,fontsize): Fija el tipo y tamao de letra.
El fontsize corresponde a los tamaos de font tpicos usados en los textos, mientras que fontid
se refiere a los siguientes estilos de font:
0 Courier
1 Symbol
2 Times
3 Times Italic
4 Times Bold
5 Times Bold Italic
xset("foreground",color):Fija el color del marco del grfico.
xset("thickness",value): Fija el grosor de las lneas en pxeles l (0 y 1 representan 1 pixel de
ancho).
xset("use color",flag)
Si flag=1 se usarn xset("pattern",.) o xset("dashes",.) para cambiar el color por defecto para
dibujar o para los patrones de relleno.
Si flag=0 volvemos al modo gris y con rayas.
xset("window",window-number): Fija como ventana actual la ventana nmero window-
number y crea la ventana si sta no existe. El comando window-number tiene que ser un
entero no negativo. El valor por defecto es SCILABGraphic0, que corresponde a
window_number = 0.
57
El comando xset() o el comando xsetm(), ambos sin argumentos, pueden usarse para cambiar
propiedades del grfico a travs de una ventana interactiva provista por SCILAB.
Otro comando existente para manejar propiedades de grficos es el plotframe, cuya forma
general es:
plotframe(rect,tics [,arg_opt1,arg_opt2,arg_opt3])
Con este comando pueden fijarse lo valores mximos y mnimos de los ejes (rect), los
intervalos y subintervalos que se marcarn (tics) y con los argumentos optativos podemos
agregar una grilla al grfico, ttulos y dividir la ventana para dibujar varios grficos en ella. El
ejemplo siguiente ilustra su uso:
4.5. GRFICOS COMPUESTOS
-->x = (0.1:0.1:20);
-->y = sqrt(1+x^2);
-->for j = 0:5
-->xset('window',j), xset('font',j,4)
-->plot(x,y,"x","y","titulo")
-->end
-->x=[-0.3:0.8:27.3]'; y=rand(x); // generador de numerous aleatorios
-->rect=[min(x),min(y),max(x),max(y)];
-->tics=[4,10,2,5]; //4 x-intervalos and 2 y-intervalos
-->plotframe(rect,tics,[%f,%f],['Mi grafico','x','y'],[0,0,0.5,0.5]);
-->plot2d(x,y,2,'000')
58
Si una misma representacin grfica involucra varias escalas diferentes, es mejor especificar
primero el rectngulo de la representacin y las escalas de los ejes mediante plotframe, para
despus superponer los diferentes grficos.
Es frecuente que un grfico contenga no slo una o ms representaciones de funciones, sino
tambin cadenas de caracteres, rectngulos, elipses u otros agregados al grfico. Las
coordenadas de estos agregados son relativas a la ventana corriente.
xbasc();
xset("font",2,4);
plotframe([-4,-1,4,1],[2,10,5,10],[%f,%f],["Ttulo","Eje x","Eje y"]);
x=linspace(-%pi,%pi,50); y=sin(x);
plot2d(x,y,1,"000"); // traza una curva
x=linspace(-%pi/2,%pi/2,5); y=sin(x);
xset("mark",1,4);
plot2d(x,y,-3,"000"); // 5 marcas
x=linspace(-%pi,%pi,20); y=sin(x)/2;
xset("use color",0);
xset("pattern",13);
xfpoly(x,y); // superficie gris
-4.0 -3.2 -2.4 -1.6 -0.8 0.0 0.8 1.6 2.4 3.2 4.0
-1.0
-0.8
-0.6
-0.4
-0.2
0.0
0.2
0.4
0.6
0.8
1.0
Ttulo
Eje x
Eje y
-
-
-
-
-
59
Agregados sobre el grfico
xarc arco de elipse
xfarc arco de elipse lleno
xarrows flechas
xnumb nmeros
xpoly polgono
xfpoly polgono lleno
xrpoly polgono regular
xrect rectngulo
xfrect rectngulo lleno
xstring cadena de caracteres (a partir de un punto)
xstringb cadena de caracteres (dentro de un rectngulo)
xtitle ttulo del grfico y de los ejes
xbasc()
plotframe([-1,0,2,4],[10,3,5,4],[%f,%f],["Parbola","x","f(x)"])
x=linspace(-1,2,100); y=x.*x;
plot2d(x,y,2,"000") // representa la curva
plot2d([1,1,-1],[0,1,1],3,"000") // traza dos segmentos
help xstring
xstring(1.1,0.1,"abscisa") // cadena de caracteres
xstring(-0.9,1.1,"ordenada") // otra cadena
help xarc
xarc(-0.5,1,1,1,0,360*64) // traza un crculo
-1 0 1 2
0
1
2
3
4
Parbola
x
f(x)
abscisa
ordenada
60
4.6. CURVAS DE NIVEL
Hay funciones predefinidas que permiten efectuar representaciones planas particulares, como
histogramas, proyecciones de superficies por curvas de nivel o niveles de gris, o campos
vectoriales. Los ejemplos que siguen conciernen a la funcin f(x,y)=sin(x*y).
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
-0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.200
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.600
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
0.600
Figura 3-Representacin por curvas de nivel
xbasc()
// Curvas de nivel
x=linspace(-%pi,%pi,50); // vector de abscisas
y=x; // vector de ordenadas
z=sin(x'*y); // matriz de valores de la funcin
help contour2d
xbasc()
contour2d(x,y,z,4) // traza 3 curvas de nivel
// Superficies por niveles de colores
xbasc()
grayplot(x,y,z) // grfico no verdaderamente gris
xbasc()
R=[0:255]/256; G=R; B=R;
RGB=[R;G;B]'; // nueva matriz de colores
xset("colormap",RGB);
grayplot(x,y,z) // niveles de gris
xset("default") // reinicializa los parmetros
grficos
// Campo de vectores tangentes
x=linspace(-%pi,%pi,10); // abscisas
y=x; // ordenadas
fx=cos(x'*y)*diag(y); // matriz de las abscisas de los
vectores
fy=diag(x)*cos(x'*y); // matriz de las ordenadas de los
vectores
champ(x,y,fx,fy) // campo de los vectores
61
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
Figura 4-Representacin en escala de grises
-4 -3 -2 -1 0 1 2 3 4
-4
-3
-2
-1
0
1
2
3
4
Figura 5-Representacin de un campo de vectores
62
4.7. REPRESENTACIN DE GRFICOS EN 3D
El trazado de una curva en 3D se hace mediante la funcin param3d , de acuerdo a los mismos
principios que en dimensin 2.
Para representar una familia de curvas en dimensin 3 es necesario utilizar la funcin
param3d1. Los argumentos son tres matrices de coordenadas para las cuales las diferentes
curvas estn en columnas.
La representacin de superficies se hace con plot3d o plot3d1. Tomaremos como ejemplo la
funcin f(x,y)=sin(x*y).
Representaciones planas particulares
histplot histograma
champ campo de vectores
fchamp idem, definicin para una funcin
grayplot superficie por rectngulos de colores
fgrayplot idem, definicin para una funcin
Contour2d curvas de nivel proyectadas
Fcontour2d idem, definicin para una funcin
xbasc()
t=linspace(0,2*%pi,50);
x=sin(t); y=sin(2*t); z=sin(3*t);
param3d(x,y,z) // curva de Lissajous
xbasc()
t=linspace(-%pi/2,%pi/2,1000);
x=cos(t*50).*cos(t);
y=sin(t*50).*cos(t);
z=sin(t);
param3d(x,y,z) // hlice esfrica
xbasc()
t=linspace(0,2*%pi,100);
a=linspace(-%pi,%pi,10);
X=cos(t')*cos(a); // matriz de las abscisas
Y=sin(t')*cos(a); // matriz de las ordenadas
Z=ones(t')*sin(a); // matriz de las cotas
param3d1(X,Y,Z) // paralelas de una esfera
63
Figura 7-Representacin de una superficie
Para representar una superficie definida por dos parmetros, es necesario definirla como una
funcin para despus utilizar eval3dp, que toma como argumento esta funcin y dos vectores
y devuelve los argumentos necesarios para la representacin mediante plot3d. Veamos por
ejemplo la representacin de una esfera. Para obtener colores variables es necesario cambiar
el sentido de uno de los vectores de parmetros.
x=linspace(-%pi,%pi,50); // vector de abscisas
y=x; // vector de ordenadas
z=sin(x'*y); // matriz de valores de la funcin
help plot3d
xbasc()
plot3d(x,y,z) // representacin monocroma
plot3d1(x,y,z) // representacin coloreada
xbasc()
R=[0:255]/256; G=R; B=0.5*ones(R);
RGB=[R;G;B]'; // nueva matriz de colores
xset("colormap",RGB);
plot3d1(x,y,z) // colores dependientes de z
xset("default") // reinicializa los parmetros
grficos
1
0
-1
Z
-3.1
0.0
3.1
Y
3.1
0.0
-3.1
X
64
El comando surf dibuja una superficie coloreada en forma paramtrica utilizando grillas
rectangulares definida por las coordenadas X e Y, si no se especifican, la grilla se determina
utilizando las dimensiones de la matriz Z (el nico dato obligatorio).
surf(Z,<GlobalProperty>)
surf(Z,color,<GlobalProperty>)
surf(X,Y,Z,<color>,<GlobalProperty>)
Z es una matriz real de m x n. que define la altura de la superficie. No se puede omitir.
X,Y: matrices reales o vectores, siempre se colocan juntas, que definen una nueva grilla
estndar. Las componentes X e Y deben corresponderse con las dimensiones de Z.
color: una matriz real opcional que define un color para cada punto (X(j),Y(i)) de la grilla.
<GlobalProperty>: argumento opcional con una secuencia de pares de sentencias
{Nombre,Valor} que definen las propiedades globales de los objetos de todas las curves
creadas por el dibujo.
Si Z es la nica matriz que se especifica, surf(Z) dibuja la matriz Z versus la grilla definida
por 1:size(Z,2) para el eje x y 1:size(Z,1) para el eje y. Si se especifica el triplete {X,Y,Z}, Z
debe ser una matriz de dimensin [ m x n ], y X o Y pueden ser : a) un vector con,
length(X)= n y length(Y)= m respectivamente; b) una matriz , en este caso size(X) o size(Y)
deben ser igual a size(Z).
La superficie es creada sobre una grilla de rectngulos. Las entradas X, Y, Z pueden ser
consideradas como 3 funciones x(i,j), y(i,j), z(i,j) especificando la superficie deseada. Por
deff("[x,y,z]=sphere(u,v)",.. // definicin de la funcin
["x=cos(u).*cos(v);.. // abscisas
y=sin(u).*cos(v);.. // ordenadas
z=sin(v)"]) // cotas
u = linspace(-%pi,%pi,50);
v = linspace(-%pi/2,%pi/2,25);// parmetros
[x,y,z] = eval3dp(sphere,u,v);// clculo de la superficie
plot3d1(x,y,z); // representacin monocroma
u = linspace(%pi,-%pi,50); // cambio de sentido
[x,y,z] = eval3dp(sphere,u,v);// nuevo clculo
xbasc()
plot3d1(x,y,z) // los colores dependen de z
65
defecto, cuando no se agrega ninguna matriz de color al llamado de la superficie, el parmetro
color depende de la entrada Z. Cuando se proporciona la matriz color, este puede aplicarse al
parche en dos formas distintas : en los vrtices o en el centro de cada parche. Esto es porque,
si Z es una matriz [ m x n ], la dimensin de la matriz de color puede ser [ m x n ] (un color
por vrtice) o [ m-1 x n-1 ] (un color por parche).
Las propiedades globales que pueden cambiarse con sus pares {Nombre,Valores} son:
CData o ColorData: una matriz real que especifica el color de los puntos definidos por la
matriz Z. CDataMapping o ColorDataMapping: cadena de caracteres con valor 'scaled' o
'direct'. Cdata_mapping Determina si los ndices de color son escalado linealmente (
'scaled') o apunta directamente ( 'direct ') a un color definido. Por defecto Plot3d tiene el
modo direct y surf el modo scaled .
EdgeColor o Foreground: Cambia el color de los bordes de los rectngulos de la grilla.
FaceColor: caracteres con valor 'none', 'flat' o 'interp' especificando la forma de los colores
de las caras 'none' dibuja una malla en la superficie; con 'flat' (modo por default) determina
Z= [ 0.0001 0.0013 0.0053 -0.0299 -0.1809 -0.2465 -0.1100 -0.0168 -0.0008 -0.0000
0.0005 0.0089 0.0259 -0.3673 -1.8670 -2.4736 -1.0866 -0.1602 -0.0067 0.0000
0.0004 0.0214 0.1739 -0.3147 -4.0919 -6.4101 -2.7589 -0.2779 0.0131 0.0020
-0.0088 -0.0871 0.0364 1.8559 1.4995 -2.2171 -0.2729 0.8368 0.2016 0.0130
-0.0308 -0.4313 -1.7334 -0.1148 3.0731 0.4444 2.6145 2.4410 0.4877 0.0301
-0.0336 -0.4990 -2.3552 -2.1722 0.8856 -0.0531 2.6416 2.4064 0.4771 0.0294
-0.0137 -0.1967 -0.8083 0.2289 3.3983 3.1955 2.4338 1.2129 0.2108 0.0125
-0.0014 -0.0017 0.3189 2.7414 7.1622 7.1361 3.1242 0.6633 0.0674 0.0030
0.0002 0.0104 0.1733 1.0852 2.6741 2.6725 1.1119 0.1973 0.0152 0.0005
0.0000 0.0012 0.0183 0.1099 0.2684 0.2683 0.1107 0.0190 0.0014 0.0000];
surf(Z); // Note que X e Y se determinan por las dimensiones de Z
//la misma superficie con color de cara roja y bordes azul
surf(Z,'facecol','red','edgecol','blu")
66
un color por cara utilizando el color del primer vrtice de la cara. Con 'interp', se hace un
sombreado interpolado sobre la superficie.
67
CAPITULO 5
OPERACIONES DE VECTORES Y MATRICES
Algunas operaciones ya se vieron en los captulos anteriores. En esta seccin se har un
resumen de las funciones ms importantes mediante ejemplos de aplicacin.
Norma de un vector
El nmero de elementos de un vector
Transpuesta de una matriz:
-->A=[1+%i 2+2*%i; 3+3*%i 4-4*%i] //se introduce la matriz A
A =
1. + i 2. + 2.i
3. + 3.i 4. - 4.i
-->A' // matriz transpuesta conjugada de A
ans =
1. - i 3. - 3.i
2. - 2.i 4. + 4.i
-->A.' // matriz transpuesta sin conjugar (se agrega el punto)
ans =
1. + i 3. + 3.i
2. + 2.i 4. - 4.i
-->x=rand(1,4) //genera un vector aleatorio de 1x4
x =
0.1121355 0.6856896 0.1531217 0.6970851
-->norm(x) //Norma eucldea
ans =
0.9960514
-->x=1:500;
-->n=length(x)
n =
500.
68
Traza de una matriz
Dimensin de una matriz
Determinante de la matriz
Inversa de la matriz
Solamente tienen inversa las matrices cuadradas cuyo determinante es distinto de cero.
-->A=[2 3 1;-3 4 0;1 -1 5]
A =
2. 3. 1.
- 3. 4. 0.
1. - 1. 5.
-->t=trace(A) // devuelve la suma de los elementos de la diagonal
de la matriz A
t =
11.
-->[m,n]=size(A) // Devuelve el nmero de filas m y de columnas n
de una matriz
n =
3.
m =
3.
-->b=inv(A) //equivale a 1/A
b =
0.2380952 - 0.1904762 - 0.0476190
0.1785714 0.1071429 - 0.0357143
- 0.0119048 0.0595238 0.2023810
-->d=det(A) // devuelve el determinante de la matriz A
d =
84.
69
Valores y vectores propios de una matriz
La matriz A es cuadrada, y spec(A) calcula los valores propios (diagonal de D) y vectores
propios (columnas de X). Con frecuencia el resultado es complejo, si A no es simtrica.
Matrices especiales
-->[X,D]=spec(A)
D =
2.8386444 + 2.7791238i 0 0
0 2.8386444 - 2.7791238i 0
0 0 5.3227111
X =
0.6915854 0.6915854 0.0959153
0.2655926 + 0.6355632i 0.2655926 - 0.6355632i - 0.2175426
- 0.2167837 + 0.0153119i - 0.2167837 - 0.0153119i 0.9713267
-->zeros(3,3) // matriz de ceros
ans =
0. 0. 0.
0. 0. 0.
0. 0. 0.
-->eye(3,3) // matriz identidad
ans =
1. 0. 0.
0. 1. 0.
0. 0. 1.
-->ones(3,3) // matriz de unos
ans =
1. 1. 1.
1. 1. 1.
1. 1. 1.
70
Creacin o extraccin de una matriz diagonal
Matriz triangular
-->v=rand(1,4)
v =
0.6283918 0.8497452 0.6857310 0.8782165
-->a=diag(v) // creacin de matriz con los elementos de un vector v en la diagonal.
a =
0.6283918 0. 0. 0.
0. 0.8497452 0. 0.
0. 0. 0.6857310 0.
0. 0. 0. 0.8782165
-->x=diag(a) // extraccin de los elementos diagonales de una matriz
x =
0.6283918
0.8497452
0.6857310
0.8782165
-->v=rand(4,4)
v =
0.0683740 0.1985144 0.2164633 0.9329616
0.5608486 0.5442573 0.8833888 0.2146008
0.6623569 0.2320748 0.6525135 0.312642
0.7263507 0.2312237 0.3076091 0.3616361
-->triu(v) ) // triangular superior
ans =
0.0683740 0.1985144 0.2164633 0.9329616
0. 0.5442573 0.8833888 0.2146008
0. 0. 0.6525135 0.312642
0. 0. 0. 0.3616361
-->tril(v) // triangular inferior de A
ans =
0.0683740 0. 0. 0.
0.5608486 0.5442573 0. 0.
0.6623569 0.2320748 0.6525135 0.
0.7263507 0.2312237 0.3076091 0.3616361
71
Extraccin de bloques de una matriz
Se puede fragmentar una matriz extrayendo bloques de la misma.
Tambin podemos extraer los elementos de una matriz mediante un vector que indique sus
posiciones dentro de la misma. Una matriz puede leerse con dos ndices, ej. A(i,j), o con un
ndice que vara de 1 a mxn .
-->A=rand(4,4)
A =
0.2113249 0.6653811 0.8782165 0.7263507
0.7560439 0.6283918 0.0683740 0.1985144
0.0002211 0.8497452 0.5608486 0.5442573
0.3303271 0.6857310 0.6623569 0.2320748
-->a=A(1:2,3:4)// Interseccin de las filas 1 hasta 2 y las columnas 3 a 4
a =
0.8782165 0.7263507
0.0683740 0.1985144
-->c1=A(:,1) // Extrae de todas la filas ( operador :) la columna 1
c1 =
0.2113249
0.7560439
0.0002211
0.3303271
-->f1=A(2,:) // Extrae de todas las columnas la fila 2
f1 =
0.7560439 0.6283918 0.0683740 0.1985144
-->a2=A(2:4,$) //$ indica la ltima fila o columna de una matriz
a2 =
0.1985144
0.5442573
0.2320748
72
Concatenacin de vectores
Pueden construirse vectores y matrices concatenando bloques de menor tamao.
-->A
A =
0.2113249 0.6653811 0.8782165 0.7263507
0.7560439 0.6283918 0.0683740 0.1985144
0.0002211 0.8497452 0.5608486 0.5442573
0.3303271 0.6857310 0.6623569 0.2320748
->b=[1 3 7 9 14];
-->A(b)
ans =
0.2113249
0.0002211
0.8497452
0.8782165
0.1985144
-->A(1,3) // El elemento A(1,3) es el elemento A(11)
ans =
0.8782165
-->a=[1 2 3 5 3 4 1];
-->b=[5 5];
-->c=[a b] //a y b como elementos de una fila
c =
1. 2. 3. 5. 3. 4. 1. 5. 5.
-->d=[4 4];
-->e=[b;d] //b y d como elementos de una columna
e =
5. 5.
4. 4.
73
Ordenamiento de vectores
Los elementos de vectores y matrices pueden ordenarse empleando la instruccin sort
Mximo y mnimo de un vector
-->c=int(10*rand(1,10))
c =
1. 6. 6. 3. 0. 5. 3. 2. 5. 4.
-->y=sort(c) //ordena los elementos en forma decreciente
y =
6. 6. 5. 5. 4. 3. 3. 2. 1. 0.
-->[y,k]=sort(c) //k vector con los ndices que los elementos ocupan en el vector original.
k =
2. 3. 6. 9. 10. 4. 7. 8. 1. 5.
y =
6. 6. 5. 5. 4. 3. 3. 2. 1. 0.
-->y=[ 6 6 5 5 4 3 3 2 1 0 ]
y =
6. 6. 5. 5. 4. 3. 3. 2. 1. 0.
-->max(y) //calcula el mximo del vector
ans =
6.
-->[m,k]=max(y) //k es un vector que indica la posicin donde est el mximo.
k =
1.
m =
6.
-->min(y) //el elemento de valor mnimo
ans =
0.
74
Funciones suma, producto y promedio
-->y=[ 6 6 5 5 4 3 3 2 1 0 ]
y =
6. 6. 5. 5. 4. 3. 3. 2. 1. 0.
-->sum(y)
ans =
35.
-->prod(y) // producto de los elementos del vector
ans =
0.
-->mean(y) //calcula el promedio entre los elementos
ans =
3.5
75
CAPITULO 6
FUNCIONES MATEMTICAS
6.1. FUNCIONES MATEMTICAS ELEMENTALES
Estas funciones se aplican a escalares y matrices, y actan sobre cada elemento de una matriz
como si se tratase de un escalar. Comprenden funciones matemticas trascendentales y otras
funciones bsicas, como por ejemplo las siguientes:
sin(x) : seno asin(x) : arco seno
cos(x) : coseno acos(x) : arco coseno
tan(x) : tangente atan(x) : arco tangente
sinh(x) : seno hiperblico asinh(x) : arco seno hiperblico
cosh(x) : coseno hiperblico acosh(x) : arco coseno hiperblico
tanh(x) : tangente hiperblica atanh(x) : arco tangente hiperblica
log(x) : logaritmo natural sqrt(x) : raz cuadrada
log10(x) : logaritmo decimal gcd(x) : mximo comn divisor
exp(x) : funcin exponencial lcm(x) : mnimo comn mltiplo
round(x): redondeo a entero ms prximo fix(x): redonde entero ms prximo a 0
floor(x) : valor entero ms prximo hacia - ceil(x) : valor entero ms prximo hacia +
sign(x): signo abs(x) : valor absoluto
En estas funciones, los argumentos de entrada y salidas pueden ser matrices, lo que permite
calcular un conjunto de datos con mayor facilidad, sin necesidad de utilizar bucles o ciclos.
En el siguiente ejemplo se comprueba la relacin pitagrica cos(x)+sin(x)=1.
-->a=1:10
a =
1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
-->cos(a)^2+sin(a)^2
ans =
1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
76
6.2. SISTEMA DE ECUACIONES LINEALES
La funcin linsolve calcula todas las soluciones posibles a la ecuacin A*X+b=0, donde A es
la matriz de los coeficientes del sistema de ecuaciones
X es el vector de las incgnitas a encontrar y b el vector que contiene los trminos
independientes. Por ejemplo, se resolver el sistema
0 b x a x a x a x a
0 b x a x a x a x a
n n nn 3 3 n 2 2 n 1 1 n
1 x n 1 3 13 2 12 1 11
= +
= +
0 4 z y 5 . 0 x
0 z 3 y x 3
0 3 z y 2 x 4
= +
= +
= + + +
-->A=[4 2 1; 3 -1 3; 0.5 -1]
A =
4. 2. 1.
3. -1. 3.
1. 0.5 -1.
-->b=[3; 0; -4] //b tiene que introducirse como vector columna
b =
3.
0.
-4.
-->X=linsolve(A,b)
X =
2.36
- 4.32
- 3.8
-->round(A*X+b) //comprobacin de la solucin
ans =
0.
0.
0.
77
6.3 NMEROS COMPLEJOS
Para el complejo i = -1, Scilab utiliza %i, y las operaciones con nmeros complejos (suma,
resta, multiplicacin, divisin) utilizan los mismos smbolos que para los reales (+, - ,* ,/ ).
Las funciones de Scilab usadas para funciones reales elementales que tienen generalizaciones
en complejos, se pueden usar tambin para los complejos, por ejemplo, sin, cos, log, ...
6.4 POLINOMIOS
Un polinomio se puede definir por sus coeficientes o por sus races. Se define un polinomio
en base a sus coeficientes con la funcin: poly(v,x,coef) donde v es un vector que
contiene los coeficientes en orden creciente y x indica la variable simblica para el
polinomio.
-->z=3+4*%i
z =
3. + 4.i
-->real(z)
ans =
3.
-->imag(z)
ans =
4.
-->conj(z)
ans =
3. - 4.i
-->abs(z)
ans =
5.
-->[r,tita]=polar(z)
tita =
0.9272952 - 8.327D-17i
r =
5.
-->atan(imag(z)/real(z))
ans =
0.9272952
78
Para definir un polinomio en base a sus races se utiliza la orden: poly(r,x,roots), donde r
es un vector que contiene las races del polinomio.
Escribir q = poly([2 3 5], "x") produce exactamente el mismo resultado, o sea, "roots" es el
tipo de definicion por defecto. Se puede reemplazar 'coeff' por 'c' y 'roots' por 'r' .
Se puede utilizar la funcin roots para hallar las races de un polinomio, sean stas reales o
complejas:
Con polinomios se pueden hacer sumas, multiplicaciones, restas, multiplicacin por un
nmero. Deben ser polinomios en la misma variable. Tambin se puede elevar un polinomio a
una potencia. Por ejemplo:
-->p=poly([2 3 5 7],"x","coef")
p =
2 3
2 + 3x + 5x + 7x
-->q=poly([2 3 5],"x")
q =
2 3
- 30 + 31x - 10x + x
-->raices=roots(q)
raices =
2.
3.
5.
-->v=p+q+p*q-3.1*q
v =
2 3 4 5 6
5 - 90.1x - 51x - 78.1x + 170x - 65x + 7x
79
La funcin coeff se utiliza para obtener los coeficientes del polinomio.
Para evaluar un polinomio en un valor dado se utiliza la funcin horner(Polinomio,x)
Si q es un polinomio, es lcito utilizar la funcin horner(p, q) para obtener p(q(x)).
6.5 RESOLUCIN DE ECUACIONES NO LINEALES
Para resolver una ecuacin o un sistema de ecuaciones no lineales, se puede usar el comando
fsolve:
[x [,v [,info]]]=fsolve(x0,fct [,fjac] [,tol])
Donde:
x0 : vector de valores reales conteniendo valores iniciales, aproximados, de la funcin,
fct : nombre de la definicin de la funcin cuya solucin se desea encontrar,
fjac : definicin del jacobiano de la funcin a resolver,
tol : tolerancia del proceso iterativo de bsqueda de la solucin. El proceso iterativo
-->p
p =
2 3
2 + 3x + 5x + 7x
-->k=coeff(p)
k =
2. 3. 5. 7.
-->c=coeff(p,2)
c =
5.
-->p
p =
2 3
2 + 3x + 5x + 7x
-->r=horner(p,1)
r =
17.
80
termina cuando el error relativo de la solucin es menor o igual que tol. (1x10-10 es
el valor por defecto),
Hay tres parmetros de salida, nicamente el primero es obligatorio
x : vector real que contiene el valor final de la solucin aproximada,
v : vector real que contiene el valor de la funcin en x,
info : indicador de culminacin y puede tener 5 valores
0 : nmero inapropiados de parmetros de entrada
1 : se obtuvo solucin con error relativo que satisface condiciones de tolerancia
2 : nmero mximo de iteraciones alcanzado. Muchos llamados a la funcin
3 : la tolerancia (tol) permitida es muy pequea. No se puede mejorar aproximacin a
la solucin
4 : iteracin no se encuentra progresando o avanza muy lentamente.
El ejemplo resuelve el siguiente sistema de ecuaciones
0 11 y 8 x 2
0 10 y 7 x
= + +
= + +
6.6 AJUSTE LINEAL
Scilab tiene una gran variedad de funciones estadsticas, con las que es posible operar sobre
variables escalares y vectoriales.
reglin permite obtener una regresin lineal entre pares de puntos (x,y) del problema y=a*x+b
por el mtodo del cuadrados mnimos:
-->a=[1,7;2,8];b=[10;11];
-->deff('[y]=fsol1(x)','y=a*x+b');
-->[xres]=fsolve([100;100],fsol1)
xres =
0.5
- 1.5
-->a*xres+b //prueba
ans =
0.
0.
81
[a,b,sig]=reglin(x,y)
sig es la desviacin estndar del residuo. x e y son dos vectores con los datos de la muestra. El
estimador a es la pendiente de la recta ajuste y b es la ordenada.
6.7 DERIVADA
La derivada de una funcin se realiza mediante el comando derivative que realiza una
aproximacin numrica de la primera y segunda derivada de una funcin F: R
n
--> R
m
en el
punto x. En la forma ms simple, la secuencia de llamado es la siguiente
derivative(F,x)
[J [,H]] = derivative(F,x [,h ,order ])
Parmetros
F : una funcin Scilab o una lista (F,p1,...,pk), donde F es una funcin de la forma
y=F(x,p1,...,pk) , donde p1, ..., pk son cualquier objeto (matrices, listas,...).
x : vector columna real de dimensin n.
-->x=[1 2 3 4 5]; y=[1.1 1.9 3.1 3.984 5.05];
-->[a,b,sig]=reglin(x,y)
sig =
0.0763403
b =
0.0316
a =
0.9984
-->yy=a*x+b
yy =
1.03 2.0284 3.0268 4.0252 5.0236
82
h : (opcional) real, el tamao del paso utilizado en la aproximacin de diferencias finitas.
order : (opcional) entero, el orden de la formula de diferencia finita utilizada para aproximar
las derivadas (orden = 1,2 o 4, por defecto el orden es =2 ).
La derivada de un polinomio se realiza mediante la funcin derivat que calcula la derivada de
una matriz racional o polinmica de variables muda. Tiene la siguiente secuencia de llamado:
pd=derivat(p)
p : es una matriz de polinomios o racional
6.8.- INTEGRALES
Una integral definida se escribe:
}
b
a
dx x f ) (
El trmino dx, referido como el diferencial x, indica la variable de integracin.
6.8.1. Integracin por mtodo trapezoidal (inttrap)
La funcin inttrap calcula la integral numrica de una relacin de pares de puntos utilizando
interpolacin lineal por el mtodo trapezoidal. Cuando se trabaja con datos experimentales,
comnmente se obtienen serie de puntos que se correlacionan con una coordenada creciente,
-->s=poly(0,'s')
s =
s
-->derivat(1/s) // -1/s^2;
ans =
- 1
-
2
s
83
por ejemplo el tiempo. Con los pares de puntos (x(i),y(i)) se ajusta la funcin y(i)=f(x(i))
donde i =1,2...n es un ndice creciente.
La descripcin del comando es:
[v] = inttrap([x,] y),
x es un vector con las coordenadas x con valores crecientes. Los parntesis rectos indican que
el trmino es opcional, siendo su valor por defecto x = [1, 2, , m], donde m es la medida del
vector y.
y es un vector de coordenadas de la ordenada que debe tener igual dimensin que x,
v es el valor de la integral.
En el siguiente ejemplo se realiza la integral de la funcin g(x) = sin(x) + sin(2x) en el
intervalo [0, t ]. Se genera el vector con incremento t /5, t /20 y t /100, es decir el intervalo
discretizado en forma creciente para mejorar la precisin del calculo. Luego se muestran
distintas formas de utilizar la funcin.
6.8.2. Integracin por cuadratura (integrate)
Proporciona la integral de una funcin externa, calculada con mtodos que determinan
automticamente el intervalo para tener un error mximo dado: abs(f-x)<= max(ea,er*abs(f))
donde f es el valor exacto de la integral. El llamado general es:
[x]=integrate(f,v,a,b [,ea [,er]])
-->deff('[y]=g(x)','y=sin(x)+sin(2*x)')
-->x = [0:%pi/20:%pi];inttrap(x,g(x))
ans =
1.995886
-->x = (1.0:0.1:2.0);
-->y=x^(-1);
-->inttrap(x,y)
ans =
.6937714
84
x es el resultado de la integral
f es la funcin definida externamente como matriz de caracteres
v es la variable de integracin ingresada como una tira de caracteres,
a el lmite inferior (nmero)
b el lmite superior (nmero)
ea es el error absoluto (0 por defecto)
er es el error relativo (1.10
-8
por defecto).
6.8.3.- Integracin mediante spline (intsplin)
Es una integracin por interpolacin, parecido a inttrap, solo que la funcin entre los valores
discretos se interpola utilizando splines, pedazos discretos de curva empleados para ajustar
datos entre puntos consecutivos. Se utiliza la funcin intsplin, que tiene el siguiente llamado
general:
I = intsplin([x,] y),
x es un vector con las coordenadas x (tiene que ser creciente)
y es el vector de las coordenadas y, es decir los valores de la funcin f(x)
-->v=integrate('sin(x)','x',0,%pi/2)
v =
1.
-->integrate(['if x==0 then 1, else sin(x)/x, end'],'x',0,%pi)
ans =
1.8519371
-->deff('[y]=f(x)','y=sin(x)+sin(2*x)')
-->integrate('f(x)','x',0,%pi)
ans =
2.
-->x = 0:0.1:%pi;
-->y = sin(x) + sin(2*x);
-->intsplin(x,y)
ans =
2.0008637
-->x = (-4:0.1:0);
-->y = exp(-x^2/2)/sqrt(2*%pi);
-->intsplin(x,y)
ans =
.4999685
85
6.8.4.- Integrales definidas con la funcin (intg)
La funcin intg calcula la integral definida desde a a b de la funcin f(t)dt que debe ser
continua. La descripcin general es:
[I, err]=intg(a, b, f [,ea [,er])
a,b son los lmites de integracin
f la funcin externa a integrar. Puede ser una funcin, una lista o una cadena de caracteres,
ea es el error absoluto requerido en el resultado ( por defecto 1x10
-14
)
er error relativo requerido (por defecto1x10
-8
)
I valor de la integral ,
err error absoluto estimado del resultado.
Esta funcin es similar a integrate, pero permite mas opciones para definir la funcin externa
f.
- Si f es una funcin su definicin debe ser como sigue y = f(t).
- Si f es una lista sta debe ser como sigue list(f,x1,x2,...), donde f es una funcin con
llamado de secuencia f(t,x1,x2,...).
- Si f es una cadena de caracteres, esta es el nombre para llamar una funcin definida en
Fortran o C.
-->deff('[y]=f(x)','y=cos(x)+0.5*cos(2*x)+1.5*cos(3*x)')
-->[I,err] = intg(0,1,f)
err =
1.668E-14
I =
1.1393553
86
6.8.5.-Integrales dobles
La funcin int2d puede utilizarse para calcular la integral de la funcin z = f(x,y) sobre una
regin R definida por un nmero n de tringulos. Utiliza el mtodo de cuadratura o curvatura.
El llamado ms simple es:
[I ,err] = int2d(X, Y, f),
I es el valor de la integral,
err es el error estimado para el clculo,
X e Y son matrices de 3 filas y n columnas representando las abscisas y las ordenadas,
respectivamente, de los n tringulos en los cuales se ha dividido la regin R.
f es la funcin externa (funcin, lista o caracteres)
Como ejemplo consideremos la integral de la funcin f(x,y) = cos(x+y) en la regin R = {0 <
x <5, 0 < y < 5}. La figura de abajo muestra las formas posibles de triangular la regin.
-->deff('z=f(x,y)','z=cos(x+y)')
-->//Triangulos ABC-ACD:
-->X = [0,0;1,1;1,0]; Y = [0,0;0,1;1,1];
-->[Int,er] =int2d(X,Y,f)
er =
3.569E-11
Int =
.4967514
y
x
A(0,0) B(1,0)
C(1,1) D(0,1)
87
6.9 ECUACIONES DIFERENCIALES ORDINARIAS
La resolucin de un problema de valor inicial requiere resolver una ecuacin diferencial de
primer orden con condicin inicial. Generalmente se escribe en la forma:
o o
y x y
y x f
dx
dy
=
=
) (
) , (
Scilab permite obtener soluciones numricas a problemas de valor inicial. El comando a ser
utilizado es ode (ecuacin diferencial ordinaria):
[y] = ode([type],y0,x0,x,f)
type: es un argumento opcional que indica el mtodo numrico de resolucin que se utilizar
y puede ser adams (Adams), rk (Runge-Kutta), rkf (Runge-Kutta modificado), fix,
discrete, roots, stiff.
y0 : es un vector o matriz real conteniendo las condiciones iniciales de la funcin
x0 : es un escalar real que corresponde al valor inicial de la variable independiente
x : es un vector real. Contiene los valores de la variable independiente para los cuales se
calcula la solucin.
f : definicin de la funcin a ser integrada
y: es la matriz de los vectores solucin. y=[y(x(0)),y(x(1)),...].
Por ejemplo, el programa que se muestra a continuacin, resuelve el siguiente problema:
0 ) 0 ( y
) t cos( ) t sin( y y
dt
dy
2
=
+ =
Antes de utilizar la funcin ode , es necesario crear en Scilab la funcin f y cargarla. La
funcin ode evala aproximaciones del valor de y en valores t1, t2, ..., tp.
88
Se puede resolver un sistema de varias ecuaciones diferenciales ordinarias con un solo
llamado de ode. Para ello se debe utilizar como entrada de la funcin f una matriz. Es decir,
se resuelve dY/dt=F(t,Y) donde Y es una matriz p x q , la condicin inicial, Y0 , debe ser
tambin una matriz p x q y el resultado de ode es la matriz [Y(t_0),Y(t_1),...,Y(t_T)].
-->deff('ydot=f(t,y)','ydot=y^2-y*sin(t)+cos(t)')
-->y0=0;t0=0;t=0:0.1:%pi;
-->y=ode(y0,t0,t,f);
-->plot(t,y)
0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
89
CAPITULO 7
ENTRADAS Y SALIDAS DE DATOS
7.1. INTRODUCCIN
En este captulo se presentan las funciones para la entrada y salida de datos, como as tambin
las empleadas para el manejo de archivos. En SCILAB, las entradas y salidas son parte
importante de los programas, particularmente cuando se maneja una gran cantidad de datos
almacenados en archivos.
Los dispositivos a los que se pueden ingresar datos o desde los cuales pueden extraerse datos
son: el monitor, teclado, impresora y unidades de almacenamiento. Estos equipos son
identificados como unidades lgicas, que se reconocen con un nmero o un string. El vector
%io guarda el nmero con el que se identifica cada dispositivo. La ventana principal
(monitor) es la entrada y salida estndar para Scilab. La entrada al monitor se identifica como
la unidad lgica 5 y la salida al mismo como unidad lgica 6. Estos nmeros estn guardados
en las dos primeras posiciones de %io. Es decir, %io(1)=5 y %io(2)=6.
7.2. ARCHIVOS BINARIOS (SAVE, LOAD)
Un conjunto de datos puede ser archivado en una unidad de almacenamiento en dos formas:
como archivo de texto o archivo binario. Cuando se guarda como texto se la codificacin
estndar (ASCII) y el archivo puede ser ledo o modificado con cualquier editor de texto
simple. Cuando se guardan como binarios, los archivos tienen un formato determinado y no
pueden ser editados ni visualizados con cualquier editor de texto, pero ocupan menos espacio
en disco. Para grabar variables en archivos binarios se utiliza la funcin:
save(filename [,x1,x2,...,xn])
donde filename es una tira de caracteres que contiene el nombre y el camino al archivo. Para
recobrar el archivo se utiliza la funcin:
90
load(filename [,x1,...,xn])
En el ejemplo anterior se guarda el archivo DataAb en formato binario. Si se utiliza SciNotes,
para abrir el archivo, notar que no puede ver los datos del archivo. Luego se borran las
variables de la memoria iterativa de Scilab y se recargan los valores de A y b usando el
comando load. Con lo que se comprueba que fueron guardados en archivos externos.
Scilab posee funciones, con distintos grados de complejidad para la entrada y salida de datos
con formato de texto. En general se pueden clasificar de acuerdo al tipo de programacin que
las inspira:
TIPO LECTURA
(ENTRADA)
ESCRITURA
(SALIDA)
MANEJO DE
ARCHIVOS
Scilab input
disp
print
Fortran read write file
C mscanf
mfscanf
msscanf
fscanfMat
mprintf
mfprintf
msprintf
fprintMat
mopen
mclose
meof
-->A = [1. 2. 3.; -3. 4. 5.; 2. 4. 5.; 1. 3. 2.]; b = 1:10;
-->save('DataAb.dat', A,b)
-->clear
-->load('DataAb.dat')
-->A,b
A =
1. 2. 3.
- 3. 4. 5.
2. 4. 5.
1. 3. 2.
b =
1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
91
7.3. FUNCIONES TIPO SCILAB (SIN FORMATO)
Las funciones input y disp constituyen las ms sencillas de realizar y fueron descritas
anteriormente. Otra funcin de salida que tiene Scilab es print que proporciona una salida sin
formato. Esta funcin es similar a disp, pero tambin permite escribir en archivos. La forma
general de la funcin es:
print (filename, x1, [x2, ,xn])
El argumento filename identifica al equipo donde se imprime y xi son las variables a escribir.
Estas se imprimen en el formato Scilab, es decir colocando el nombre de la variable y el signo
igual. Esto lo hace incluso cuando se guarda en un archivo.
La funcin print como disp imprimen la ultima variable primero. En el ltimo ejemplo la tira
de caracteres 'valor del dato:' se imprime junto con la tira 'x = ', la cual es una salida por
defecto de print. Tambin puede utilizarse la funcin print para guardar variables en un
archivo de texto.
-->x = 2.7 ; y = 5.4;
-->print(6,x,y)
y =
5.4
x =
2.7
-->print(%io(2),x,valor del dato:)
valor del dato:
x =
2.7
--> r = 1:2:25; A = rand(5,3);
-->print(data1.txt,A,r)
92
Si se abre el archivo data1.txt con el Editor, notar que la salida incluye todos los
identificadores.
7.4. FUNCIONES TIPO FORTRAN (read, write)
Scilab tambin maneja las funciones read y write similares a las de Fortran, con la diferencia
que se puede colocar un argumento por vez. Es decir, estn orientadas para la entrada o salida
de matrices, por lo que si se tienen varias variables es mejor juntarlas en una sola matriz antes
de imprimirlas. La secuencia de llamado general es:
[x]=read(file,m,n,[format])
write(file,x,[format])
file es una tira de caracteres que con el nombre del archivo, como alternativa se puede colocar
el nmero lgico asignado al archivo.
x es la matriz a manejar, slo se puede colocar una por vez.
m y n son el nmero de filas y columnas de la matriz. Si no conoce el nmero de filas a leer
con m= -1, se lee el archivo completo.
format es el formato con que se lee o escribe la matriz. Algunos de los items para la salida
formateada se presentan a continuacin:
/ nueva lnea
iw campo entero con w caracteres
fw.d punto flotante con w caracteres incluyendo d dgitos despus del punto decimal. Se
recomienda w>d+3
ew.d punto flotante como potencia de 10, con una longitud de w caracteres incluyendo d
dgitos despus del punto decimal. Se recomienda w>d+7
nx n espacios en blanco
tn mover el cursor a la posicin n
an cadena de caracteres de longitud n
El formato es una tira de caracteres, entre comillas, que se encierra entre parntesis. Si la
matriz tiene varias columnas se puede dar formato a cada una si se separan por comas. Si
93
quiero dar el mismo formato a varias columnas se encierra el formato entre parntesis y se
colocando el nmero de repeticiones adelante. Por ejemplo en el formato
(1x,e10.3,5x,3(f3.0)) luego de un espacio en blaco se dejarn 10 caracteres para mostrar un
numero real con lugar para 3 decimales despues del punto, luego se dejan 5 espacios en
blanco y se colocan 3 columnas con el mismo formato, un nmero real con 3 espacios para la
parte entera y ninguno para la parte decimal.
La lectura desde el teclado se realiza utilizando el comando read y especificando la unidad
lgica %io(1). La salida en pantalla se realiza con el comando write y especificando la unidad
lgica %io(2). Para leer un valor simple se utiliza la dimensin m=1, n=1.
Para mostrar el uso de read y write en un programa, se escribe la siguiente funcin en un
archivo que se guarda como inout.sci:
-->x=read(%io(1),2,2,'(2(f5.1,2x))')
-->444.2 555.6
-->222.1 333.1
x =
444.2 55.6
222.1 33.1
-->write(%io(2),m,'(5x,3(f10.2))')
2.00 0.00 6.00
7.00 3.00 6.00
function inout()
// este programa ilustra el uso de read y write
write(%io(2),' la variable real x:','(a)');
x = read (%io(1),1,1);
write(%io(2),' la variable real y:','(a)');
y = read (%io(1),1,1);
z = x+y;
write(%io(2),'la suma de x e y es:','(a)')
write(%io(2),z,'(10x,e13.7)')
endfunction
94
Luego se carga la funcin en la ventana de trabajo de Scilab mediante el comando getf
Note que la funcin inout no tiene argumento. Entonces, tanto en la definicin de la funcin
como en su ejecucin se tiene que colocaar un par de parntesis vacios ().
7.4.2. El manejo de archivos
El comando file permite abrir o crear un archivo de datos:
[unit [,err]]=file('open', file-name [,status] [,access [,recl]] [,format])
file-name: string, nombre del archivo a ser abierto
status: string, el estado del archivo a ser abierto. El estado puede ser
"new" : el archivo es nuevo, no existe (opcin por defecto)
"old" : el archivo ya existe.
"unknown" : estado desconocido, Sirve para archivos nuevos o viejos.
"scratch" : el archivo ser borrado al final de la seccin.
access: string, tipo de acceso al archivo
"sequential" : acceso secuencial (por defecto)
"direct" : acceso directo
format: string,
"formatted" : para un archivo formateado (por defecto)
"unformatted" : grabacin binaria
recl: entero, es el tamao de los datos en bytes cuando access="direct"
unit: descripcin logica del archivo abierto
err: entero, nmero del mensaje de error si falla la apertura.
-->getf('C:\inout.sci');
-->inout()
Entrar una variable real x:
-->1.2
Entrar una variable real y:
-->2.4
la suma de x e y es:
.3600000E+01
95
El comando file tambin permite cerrar o mover el puntero del archivo, se puede utilizar
cuando un archivo se abre tanto para entrada como para salida.
file(action,unit)
donde action es uno de los siguientes strings:
"close": cierra el archivo
"rewind": pone el puntero al inicio del archivo
"backspace": pone el puntero al inicio del ltimo dato
"last": pone el puntero despus del ltimo dato.
Los siguientes ejemplos son pequeos programas para ejecutar desde SciNotes. Crea la matriz
de 11x2, crea el archivo dataB. Txt en el directorio de trabajo (cuidado! debe haber creado
uno), graba los datos con formato en el archivo y luego cierra el archivo.
Si se conoce el nmero de filas del archivo (n=11, en el caso del archivo dataB.txt), para leer
los valores de la matriz se utiliza:
Si el nmero de filas es desconocido, con n=-1 el archivo completo ser ledo. En el siguiente
ejemplo se incluyen tira de caracteres, estas se escriben separadas de la matriz.
x1 = 0:0.5:10;x2 = x1^2;B = [x1',x2'];
m = file('open','dataB.txt','new') //abre el archivo y le asigna a m
write(m,B,'(2(f6.2,2x))') //graba la matriz en el archivo
file('close',m) //cierra el archivo
u=file('open','dataB.txt','old');
A=read(u,11,2);
file('close',u);
write(%io(2),A); //muestra la matriz A en pantalla
C = rand(2,3)+ rand(2,3); //suma dos matrices creadas aleatoriamente
u = file('open','dataC.txt','new')
write(u,'esta es la matriz C','(a)') //graba la tira de caracteres
write(u,C,'(3(f10.6,2x))')// seguido graba la matriz C
file('close',u)
96
7.4.3. Usos adicionales de la funcin (file)
El comando read dirige el puntero al comienzo del archivo, ejecuta la lectura y coloca el
puntero al final de la lectura pedida, quedando disponible para el prximo llamado de entrada.
Si quiere leer los datos del archivo otra vez, puede usar la funcin file con la opcin rewind:
file('rewind',u)
una segunda accin disponible es la opcin backspace, que mueve el puntero solo una lnea
arriba de la ltima lectura. Una tercera opcin es last, con la que el puntero se mueve al final
del archivo sin necesidad de hacer una lectura. Puede ser utilizada para agregar datos a un
archivo existente. Una cuarta opcin que puede ser utilizada en el argumento de la funcin file
cuando el primer argumento es open. Esta es la opcin scratch, que borra el archivo al
final de la sesin de trabajo.
En el siguiente ejemplo, abrimos el archivo y agregamos datos al final del archivo:
Se pueden observar los cambios introducidos abriendo el archivo con SciNotes.
Cuando creamos un archivo que no existe usamos la opcin new, para abrirlo otra vez
utilizamos la opcin old. Si tratamos de abrir un archivo viejo como nuevo obtenemos un
mensaje de error. Podemos almacenar el codigo del error por utilizar el siguiente llamado:
fil="dataC.txt"
u = file('open',fil,'old') //abre el archivo
file('last',u) //mueve al puntero al fin del archivo
write(u,[10, 20, 30],'(3f5.0)') //graba un vector con nuevos datos
file('close',u) // cierra el archivo
-->[u,errn] = file('open','fil','new')
errn =
240.
u =
[]
97
El nmero del error es almacenado en la variable errn y se le asigna a la variable u un vector
vaco (indicando la falla de la apertura del archivo). Si en el ejemplo anterior utilizamos la
opcin unknown en vez de new evitamos el mensaje de error:
7.5. FUNCIONES TIPO C
Las funciones mprintf y mscanf operan directamente en la ventana principal del SCILAB,
mientras que las funciones mfprintf, mfscanf, fprintMat y fscanfMat operan sobre archivos. La
funcin mfprintf tambin puede operar sobre la ventana principal si la referencia del archivo
es reemplazada por %io(2), mientras que la funcin mfscanf puede operar sobre la ventana
principal si la referencia del archivo es reemplazada por %io(1).
APLICACIN LECTURA
(ENTRADA)
ESCRITURA
(SALIDA)
MANEJO
DE
ARCHIVOS
Ventana mscanf mprintf mopen
mclose
moef
Archivos mfscanf mfprintf
String msscanf msprintf
Matrices fscanfMat fprintMat
Lineas mgetl mputl
Las secuencia de llamada general para las funciones de lectura mscanf, mfscanf y msscanf
son las siguientes:
[n,v1,...vn] = mscanf ([niter,]format);
[n,v1,...vn] = mfscanf ([niter,] fd, format)
[n,v1,...vn] = msscanf ([niter,] str, format)
En estas llamadas, v1,...vn es una lista de variables de salidas. Para la funcin mfscanf, fd es
la unidad lgica del archivo, y format es una tira de caracteres con el formato para escribir las
variables que estn siendo ledas. Esta conversin es similar que la del lenguaje C. niter indica
el nmero de veces que se utilizar el formato. La variable de salida n es un entero que
98
proporciona el nmero de datos leidos o 1 si se encuentra el fin de linea (EOF) antes de leer
un dato. str indica que se trabaja con una o un vector de tira de caracteres.
Si los datos del archivo son homogeneos, pueden ser almacenados en un nico vector.
L= mfscanf ([niter,] file, format)
La llamada general par las funciones de escritura de datos mprintf, mfprintf y msprintf son las
siguientes:
mprintf(format,v1,..,vn)
mfprintf(fd,format,v1,..,vn)
str=msprintf(format, v1,..,vn)
En estas, v1,...vn especifican los datos a ser convertidos e impresos de acuerdo a los
parametros del format, fd es un entero positivo que describe la unidad logica asignada cuando
se utiliza mopen. Si fd es 6 la salida ser a la ventana de trabajo de Scilab.
La tira de caracteres 'El cuadrado de %f es %f' incluye dos argumentos %f, que son
caracteres de conversin porque sern reemplazados por los valores de las variables colocadas
inmediatamente despus del string; en este caso los valores de j, j^2. En este ejemplo, %f
representa campos de puntos flotantes de ancho variable.
Otras funciones de entrada y salida del tipo C son fscanfMat, y fprintfMat que se utilizan para
leer o escribir una matriz en archivos. La secuencia de llamado de estas funciones es:
fprintfMat(file,M [,format,texto])
[M,text] = fscanfMat(file)
-->for j=1:5;mfprintf(6,'El cuadrado de %f es %f \n',j,j^2);end
El cuadrado de 1.000000 es 1.000000
El cuadrado de 2.000000 es 4.000000
El cuadrado de 3.000000 es 9.000000
El cuadrado de 4.000000 es 16.000000
El cuadrado de 5.000000 es 25.000000
99
Donde file es un string con el nombre del archivo, M es una matriz de nmeros reales, format
es un una tira con los caracteres de conversiones, el valor por defecto es %f, text es una
matriz de string con los comentarios no numricos al comienzo del archivo.
Abriendo el archivo Mat1.txt se observa que la matriz A se grab con el siguiente formato:
2.000 0.000 6.000
7.000 3.000 6.000
El formato tiene un caracter de conversion simple '%5.3f'. que indica que cada elemento de la
matriz se escribe como un campo de punto-flotante con 5 caracteres de ancho, de los cuales 3
son para decimales. Si el nmero no se ajusta con el campo especificado, Scilab lo ajusta de
forma tal que ser escrito con el nmero de decimales requerido.
El comando fscanfMat se utiliza para leer los datos desde un archivo como una sola matriz.
Para lo cual los datos en el archivo debern estar en el formato de una matriz, es decir, cada
linea en el archivo debe tener el mismo nmero de columnas.
7.5.1. Control del Formato (Caracteres de Conversin)
En algunos de los ejemplos anteriores se utilizaron en el formato, caracteres tales como %f,
%5.3f, conocidos como caracteres de conversin o control del formato. Siempre que se
encuentra la especificacin de un caracter de conversin se reemplaza, en el caso de
comandos de salidas, con el valor correspondiente de una lista de variables que sigue a la tira
que especifica el formato o, en el caso de comandos de entrada, se lee el valor
correspondiente con el formato especificado.
Cada especificacin de conversion comienza con % y termina con un codigo de conversin.
Entre el % y el cdigo de conversin puede haber un nmero (precisin) que especifica el
-->A = int(10*rand(2,3))
A =
2. 0. 6.
7. 3. 6.
-->fprintfMat('Mat1.txt',A,'%5.3f')
100
mximo nmero de caracteres para la tira, el nmero de dgitos despues del punto decimal de
punto flotante. Se pueden utilizar los siguientes cdigos de conversin:
___________________________________________________________________________
d,i entero decimal
u entero decimal sin signo
c caracter simple
s cadena de caracteres
f nmero de doble precisin (punto flotante); [-]m.dddddd, d es la precision (defecto 6)
e nmero en notacin exponencial; [-]m.ddddddexx o [-]m.ddddddExx
g usa %e si el exponente es < -4, o la presicin 4; de otra manera, usa %f
* vacio
% no convierte ningn argumento; imprime solo un %
___________________________________________________________________________
En el siguiente ejemplo se cargan primero los valores de las variables a, b, c, y s que sern
utilizados en el llamado de la funcin mprintf. Note que a y b son constantes simples y c es un
vector fila.
-->a = -13.54; c = [4.35,3.22];
-->//imprime tres especificaciones para nmero de punto-
flotante: %f, %e, y %g.
-->mprintf(' Coeficiente = %10.5f',a);
Coeficiente = -13.54000
-->mprintf(' Coeficiente = %10.5e',a);
Coeficiente = -1.35400e+001
-->mprintf(' Coeficiente = %10.5g',a);
Coeficiente = -13.54
-->//se especifican dos campos de conversin para c.
-->mprintf('Vector = [%f,%f]',c);
Vector = [4.350000,3.220000]
-->//ejemplos con salto de lnea
-->mprintf('\n Estos son los valores: \n x = %f \n y = %f \n',2.4,5.3)
Estos son los valores:
x = 2.400000
y = 5.300000
101
En el ltimo ejemplo se utiliza el caractere \n. Este produce una nueva lnea, as divide el
string del formato en dos lneas. A continuacin se presentan ejemplos de caracteres de
conversin para funciones de entrada.
En el siguiente ejemplo se leen datos del dispositivo de salida standard (%io(2) = 5) con la
funcin mscanf.
7.5.2 Manejo de archivos
Las funciones mopen, mclose y meof permiten manejar archivos. La funcin mopen se utiliza
para abrir un archivo. La secuencia de llamado general es
[fd, err] = mopen(file, mode)
file es una cadena de caracteres con el nombre y el camino del archivo a ser abierto, fd
representa la variable de la unidad lgica asignada al archivo, err almacena el posible nmero
de error, mode indica el modo en el cual el archivo ser abierto, para escritura, lectura,
agregar, etc. , de acuerdo a las especificaciones: w para escritura, r para lectura, a para
agregar. Cualquiera de estas especificaciones seguidas por el signo mas, es decir, w+, r+, a+,
indica que el archivo est siendo actualizado (sobreescrito).
La funcin mclose es utilizada para cerrar un archivo. La secuencia de llamado es
mclose([fd]) o mclose(all)
Si se omite fd se cierra el ltimo archivo abierto. La opcin all cierra todos los archivos
abiertos.
-->mprintf('Entre tres valores:'); [a,b,c]=mscanf('%f %f %f')
Entre tres valores:
-->2.3 3.5 -1.2
c =
- 1.2
b =
3.5
a =
2.3
102
La funcin meof puede utilizarse para detectar el fin del archivo (eof=end of file), es decir, la
condicin en la cual el archivo ha agotado las salidas. La funcin retorna el valor %t
(verdadero) si el eof ha sido alcanzado, o %f (falso), de otro modo.
Los siguientes programas muestra un ejemplo de aplicacin de las funciones mopen, meof,
mclose, mfprintf, y mfscanf: En el primer ejemplo se abre con mopen el archivo datos.txt para
escritura y se guardan all, con el comando mfprintf, en una sola fila las variables k, x, y, z.
Estas variables cambian de valor y se guardan en las filas subsiguientes del archivo hasta que
se agota el vector k del ciclo for. Finalmente el archivo se cierra con mclose.
Este otro ejemplo abre el archivo creado anteriormente (datos.txt) para lectura y lee cada linea
del archivo mediante el comando mfscanf. Como no se conoce el nmero de filas a leer, se
utiliza un ciclo while con la condicin de qsue no sea el final del archivo.
mode(-1) //no se ven los comando
//Creando el archivo e imprimiendo datos en este
arch = 'datos.txt';
fd = mopen(arch,'w');
for k = 1:5
x = k^2; y = 2*k-2; z = sin(5*k);//graba datos al archivo
mfprintf(fd,'%i %6.2f %6.2f %6.2f \n',k,x,y,z);
end
mclose(fd);//cierra el archivo
mode(-1)
[u,err] = mopen(arch,'r');//abre el archivo para entrada
cont = 0;//inicializa el contador
k = []; x = []; y = []; z = [];//vectores vacios
while ~meof(u)
cont = cont + 1;
r = mfscanf(u,'%f %f %f %f');
k = [k r(1)]; x = [x r(2)]; y = [y r(3)]; z = [z r(4)];
end
close(u);//cierra el archivo
[nr,nc] = size(k);
//pone el formato para imprimir en pantalla
sformat = "";
for j = 1:nc
sformat = sformat + "%5.2f ";
end;
mprintf('\nDatos leidos como vectores\n'); //imprime los vectores leidos
mprintf("k: "+sformat,k);
mprintf("\nx: "+sformat,x);
mprintf("\ny: "+sformat,y);
mprintf("\nz: "+sformat,z);
103
7.6. LEYENDO O GRABADO LNEAS DE ARCHIVOS DE TEXTOS
Scilab cuenta con los comandos mgetl y mputl para leer lneas o grabar lneas de un archivo
de texto. La secuencia de llamado general de estas funciones son:
str = mgetl(fd [,m])
mputl(str [,fd])
Cuando se utiliza en el comando mgetl, str es un vector columna de tiras de caracteres, que
contiene las m lneas leidas del archivo de texto cuya unidad de referencia es fd. Si no se
conoce el nmero de filas se utiliza m = -1. Con el comando mputl, str es un vector (fila o
columna) de tiras de caracteres, cuyos elementos se escriben como lineas en el archivo de
referencia fd. Para operar los comandos mputl y mgetl, los archivos deben abrirse previamente
con el comando mopen.
En el siguiente ejemplo se crea el archivo direccion.txt y se guarda un vector de tiras de
caracteres con la direccin de la universidad, mediante el comando mputl. Luego se abre el
archivo y se lee el contenido mediante el comando mgetl.
mode(-1)
//abre el archivo y guarda la direccin como vector
u = mopen('direccion.txt','w')
direc1 = ['Avda. Bolivia 5150';'Campo Castaares';'Salta, cp: 4408FVY';'Argentina'];
mputl(direc1,u)
mclose(u)
//lee el archivo
r=mopen('direccion.txt','r')
d=mgetl(r,-1) //lee todas las lneas del archivo
mclose(r)
disp(d)
104
CAPITULO 8
PROBLEMAS RESUELOS
8.1. INTRODUCCIN
105
APENDICE A
DILOGOS E INTERFACES GRFICAS
A.1. El USO DE DILOGOS E INTERFACES A USUARIO
Se han incorporado a Scilab algunas funciones que permiten manejar a un nivel simple el
intercambio de informacin a travs de ventanas grficas, que son fundamentalmente mens
para seleccin de alternativas y para el ingreso y salida de datos. Estas prestaciones se llevan a
cabo mediante la integracin de Scilab con el lenguaje Tcl y su librera grafica Tk, puesto que
la interfaz grafica de Scilab est escrita en Tcl/Tk. Si se necesita armar algo ms sofisticado es
posible recurrir al intercambio directo con este lenguaje de programacin para su diseo.
Recientemente, se han incorporado tambin algunas funciones que permiten utilizar objetos
de interfase de usuario que enriquece las presentaciones de los procedimientos para el ingreso
de datos y permite la programacin orientada a objetos. Estas son las llamadas interfaces
grficas de usuario (GIU)
A.2. DILOGOS
A.2.1 Mensajes
La funcin x_message, es una caja de dialogo que muestra un mensaje y espera por una
respuesta. Retorna al programa principal slo despus de un click sobre un botn.
[num]=x_message(mensaje [,botones])
mensaje: vector de tiras que constituye el mensaje que aparece en la caja de dialogo. Si el
mensaje es simple no hacen falta los corchetes rectos, sino cada lnea deber estar separadas
por punto y coma.
botones: Por defecto aparece en la caja un botn Ok para cerrar la caja una vez que se lee el
mensaje. Si quiere utilizar la caja para hacer una decisin, se pueden colocar dos botones. En
ese caso los nombres se colocan en un vector de tiras.
106
num: guarda el nmero correspondiente al botn seleccionado por el usuario. Esta
informacin se utiliza luego para realizar una accin determinada.
A.2.2 Entrada Simple
Para pedir una entrada simple a travs de una ventana de dialogo se usa la funcin x_dialog:
valor = x_dialog(titulo,valor_defecto)
En valor se guarda la entrada ingresada en el dialogo despus que se presiona el botn Ok,
titulo es una tira de caracteres que identifica al dialogo, en valor_defecto se puede dar un
valor por defecto en el caso que no se ingrese uno nuevo. En la ventana aparecen botones de
Ok y Cancel. Si presiona Cancel se carga en la variable valor un vector vaco. Si presiona Ok
sin ingresar un nuevo valor, se toma el valor por defecto.
mode(-1);//modo silencioso
nb = x_message("Elija un Sistema de Unidades:",["S.I.","E.S."]);
if nb == 1 then
x_message("Sistema Internacional - g = 9.806 m/s^2');
else
x_message("Sistema Ingles - g = 32.2 ft/s^2');
end;
107
La entrada que se ingresa a la caja de dialogo entra como texto y deber convertirse con la
funcin eval si quiere usarse como un nmero.
A.2.3 Entrada Mltiple
Para hacer entradas mltiples con una sola caja de dialogo se usa la funcin x_mdialog:
vector= x_mdialog(titulo, letreros, valor_defecto)
donde titulo es el ttulo de la caja de dilogos, letreros es un vector columna con las etiquetas
para las componentes del vector, y que se ponen en cada ventana, valor_defecto son valores
por defecto para el vector de entrada., y vector contiene los valores ingresados.
mode(-1);
h0 = eval(x_dialog("Altura inicial (m)","0.00"));
v0 = eval(x_dialog("Velocidad inicial (m/s)","0.00"));
t0 = eval(x_dialog("Tiempo inicial (s)","0.00"));
tf = eval(x_dialog("Tiempo final (s)","10.00"));
h = h0 + v0*(tf-t0)-4.903*(tf-t0)^2;
x_message("h = " + string(h) + " m");
mode(-1);
titulo = "Calculo de la distancia de un objeto en cada libre";
etiquetas = [ "Altura inicial (m)"; ...
"Velocidad inicial (m/s)"; ...
"Tiempo inicial(s)"; ...
"Tiempo final (s)"]
vector = x_mdialog(titulo, etiquetas,['0';'0';'0';'10']);
h0 = eval(vector(1));
v0 = eval(vector(2));
t0 = eval(vector(3));
tf = eval(vector(4));
h = h0 + v0*(tf-t0)-4.903*(tf-t0)^2;
108
Otra forma de ingresar datos mltiples a travs de una sola forma de entrada es la funcin
getvalue, su llamado general es:
[ok,x1,x2,,x14] = getvalue(descrip,etiq,tipo,val_defect)
donde descrip es un vector columna de tiras con el nombre general del dialogo, etiq es un
vector columna de tiras con las etiquetas de cada uno de los tem de los datos de entrada; tipo
es una lista con el tipo de datos y sus dimensiones; val_defect es un vector de valores por
defecto para las entradas; ok es una variable lgica que toma los valores %t (true) si se
presiona el botn Ok, o %f (false) si se presiona el botn Cancel; x1, x2, , x14 son los
valores retornados si se presiona el botn Ok. La forma general de tipo es
tipo = list(tipo_1, dim_1, tipo_2, dim_2, )
donde tipe_1, tipe_2, , son tiras que definen la variable y que pueden ser: mat matriz
numrica, col vector columna numrico, row vector fila numrico, vec vector
numrico, str string , lis lista
109
Los valores dim_1, dim_2, , pueden ser una constante simple o un vector de dos constantes
indicando las dimensiones del dato correspondiente.
mode(-1);
desc = "Ingrese los parmetros para el movimiento oscilatorio amortiguado"
etiq = ["Amplitud mxima, A0 (m)",... //leyendas
"Parmetro de amortiguamiento, tau(s)",...
"Frecuencia natural, f(Hz)" ,...
"Cambio de fase, phi(rad)" ,...
"Incremento en el tiempo, Dt(s)" ,...
"Tiempo mximo, tmax(s)"];
tipo = list("vec",1,"vec",1,"vec",1,... //lista de tipos
"vec",1,"vec",1,"vec",1);
def = ["10","50","10","0.75","1","50"]; //valores por default
[ok,A0,tau,f,phi,Dt,tmax] = getvalue(desc,etiq,tipo,def);
if ok then
deff('[x] = foo(t)','x=A0*exp(-t/tau).*cos(2*%pi*t/f-phi)');
t = [0:Dt:tmax]; x = foo(t);
xset('window',1);plot(t,x);
xtitle("Movimiento Oscilatorio","t(s)","x(m)");
else
x_message("No hay entradas ingresadas")
end;
110
A.2.4 Ventana de dilogo para entrar una matriz
La funcin x_matrix puede utilizarse para ingresar una matriz numrica a travs de una caja
de dilogo. El llamado general de la funcin es
[matrx] = x_matrix(label,default)
donde label es la leyenda de la caja, default es una matriz real, y matrx es un opcional con el
nombre de la variable a donde se asigna la matriz. La matriz que se ingresa no necesita ser de
las misma dimensin que la matriz por defecto.
Ejemplo; x_matrix('Entre una matriz de 3x3',rand(3,3))
111
A.2.5 Ventana de dilogo para elegir entre varios valores de una entrada
La funcin x_choose permite elegir entre varios valores de entradas posibles. El llamado
general es
[item_num] = x_choose(items, title)
donde items es un vector columna de tiras con las varias elecciones posible, title es una tira
con la descripcin del dialogo, item_num es el ndice, en el vector, de los valores elegidos.
As, el valor de retorno de x_choose no es el valor en el dialogo, sino el ndice de la entrada
elegida.
Ejemplo: k = x_choose(['m';'ft';'yd';'km'],'Elija unidades de distancia')
112
Una extensin de la funcin x_choose es la funcin x_choices que permite elegir entre varios
valores para varias variables de entrada. El llamado general de la funcin es
item_vector = x_choices(titulo, item_lista)
donde titulo es una tira que describe al dialogo, item_lista es una lista cuyos elementos son
tambin listas que contienen la leyenda, la posicin del valor por defecto, y los posibles
valores de cada uno de los tem a ser elegidos, item_vector contiene la posicin de las
elecciones. As la forma de item_lista es
item_lista = list(list_item_1, list_item_2, )
y cada uno de los list_item_i es una lista similar a la siguiente:
list_item_i = list(item tit, default_num, [valor 1, valor2, ])
l1=list('eleccin 1',1,['botn c1','botn c2','botn c3']);
l2=list('eleccin 2',2,['botn d1','botn d2','botn d3']);
l3=list('eleccin 3',3,['botn e1','botn e2']);
rep=x_choices('Menu Botn',list(l1,l2,l3));
113
A.3. INTERFACES GRFICAS DE USUARIO
A.3.1 La funcin uicontrol
La funcin uicontrol permite crear una interfaz grfica para usuarios (GIU). La secuencia de
llamado es:
h = uicontrol('Prop',Val,...)
h = uicontrol(parent,'Prop',Val,...)
h = uicontrol(uich)
h = uicontrol('Prop',Val,...) crea un uicontrol con identificador h y le asigna las propiedades
(Prop) y valores (Val) especificados. El estilo por defecto es un botn. El dominio o lugar de
creacin por defecto es la figura que est en uso.
h = uicontrol(parent,'Prop',Val,...) crea un uicontrol en el objeto especificado por parent.
h=uicontrol(uich) pone el foco en el uicontrol especificado por uich.
Todos los objetos grficos se comunican a travs de sus propiedades. As, para crear controles
adaptados hace falta conocer el uso de las siguientes propiedad.
114
BackgroundColor. Color de fondo del uicontrol. El color puede ser un vector real [R,G,B] o
una tira de letras donde cada valor est separado por un |, es decir "R|G|B"
callback. (string) Tira que es evaluada por el interprete de scilab cuando se activa un uicontrol
(por ejemplo cuando se hace click sobre un botn).
Enable {on}|off Abilita o desabilita el uicontrol. Lallave indica el valor por defecto.
fontangle. (string) Pone la inclinacin de la letra de un texto en el control. Tiene que ser
alguna de estas tiras: {'normal'} | italic | oblique. La llaves indica el valor por defecto.
fontsize. (nmero real) Pone el tamao de las letras de un texto en un control.
fontunits. (string) Selecciona las unidades del tamao de letra especificada por fontsize. Tiene
que ser alguna de estas tira: {points} | pixels | normalized.
fontweight. (string) Pone el grosor de la letra utilizada en el texto de un control. Tiene que ser
alguna de estas tira: light | {normal} | demi |
fontname. (string) Contiene el nombre del tipo de letra elegido para mostrar el texto del
control.
ForegroundColor Color en el frente del control. El color puede ser dado como un vector real
[R,G,B] o una tira de letras "R|G|B" donde cada valor est separado por un |
Horizontalalignment. (string) Elige la alineacin horizontal en el control. Tiene que ser
alguna de estas tiras: left | {center} | right. Esta propiedad solo puede ser utilizada enlos
estilos 'text', 'edit' y 'checkbox'.
ListboxTop (entero) Para un estilo ListBox, elige el tem de la lista que aparece en la primera
lnea.
Max (escalar) Especifica el mayor valor de 'value'. Sin embargo, tiene significado diferente
segn el control:
o Check Boxes : Max es el valor que toma de la propiedad 'value' cuando es chequeado el
control
o Silders : valor mximo del deslizador
o List boxes : si (Max-Min)>1 la lista permite elecciones mltiples, de otra forma no.
Min (escalar) Especifica el menor valor de 'value'. Sin embargo, tiene significado diferente
segn el control:
o Check Boxes : Min es el valor que toma la propiedad 'value' cuando el control no es
chequeado
o Silders : valor mnimo del deslizador
o List boxes : si (Max-Min)>1 la lista permite elecciones mltiples, de otra forma no.
115
Parent (entero) Gestor del control. Cambiando esta propiedad se mueve el control de una
figura a otra.
Path Esta propiedad es de solo lectura. Permite obtener el camino TK del control como una
tira de letras.
Position vector real [1,4] o tira de letras. Pone la configuracin geomtrica del control. Es un
vector x y w h donde x, y corresponden a la posicin de la esquina inferior izquierda, w al
ancho y h a la altura. La unidad la determina la propiedad 'Unit'.
SliderStep vector real de [1,2] o tira de letras. Tiene que ser alguna de estas: [small big]. Un
paso small corresponde al movimiento que se obtiene cuando se presiona sobre las teclas
flechas; El paso big corresponde al movimiento de un Ctrl-keyboard-arrows.
String (string) Generalmente representa al texto que aparece en el control. Su significado
exacto depende del estilo del control:
o List Boxes, men desplegable, el valor puede ser un vector de letras o una tira de letras
donde los tem estn separados por un '|'.
Style Estilo del control. Debe ser alguna de estas tiras: {pushbutton} | radiobutton | checkbox
| edit | text | slider | frame |listbox | popupmenu
o pushbutton Un botn rectangular generalmente utilizado para correr un procedimiento.
o radiobutton Un botn con los estados : on / off.
o checkbox Un control pequeo con los estados : on / off
o edit Un control de letras que se pueden editar
o text un control de textos (generalmente estticos).
o slider Un control barra de desplazamiento utilizada para poner valores en un rango con el
mouse.
o frame Un control representando un zona utilizada para agrupar controles que estn
relacionados.
o listbox Un control para una lista de tem. El tem se elige con el mouse.
o popupmenu Ahe aparecer un men cuando se clickea sobre un botn.
Tag Propiedad generalmente utilizada para identificar el control. Tira de letras para darle un
"name".
Units Define la unidad utilizada en la propiedad 'position'. Tiene que ser alguna de estas tiras:
{points} | pixels | normalized.
116
Userdata Puede utilizarse para asociar algunos objetos (string, matriz de string, matriz mxn)
a un control.
Value Valor del control. El significado exacto depende de la propiedad estilo.
o Checkboxe, Radiobutton. Value se pone Max cuando es on y Min cuando off.
o ListBoxe, PopupMenu. Value es un vector de ndices que corresponde al ndice de la
entrada elegida en la lista. 1 es el primer tem de la lista.
o Sliders Valor elegido en la barra de desplazamiento.
Verticalalignment Para poner el alineamiento vertical del texto en el control. Tiene que ser
alguna de estas tiras: top | {middle} | bottom. Esta propiedad se puede utilizar slo con los
estilos 'text' y 'checkbox'.
h=uicontrol(f,'style','listbox', ...
'position', [10 10 150 160],...// crea un listbox
'string', "item 1|item 2|item3",...// llena la lista
'value', [1 3])// selecciona item 1 y 3 en la lista
x=0:%pi/10:%pi;
function y=foo(x)
y=sin(x)
plot(x,y,'ro-')
endfunction
f=figure(1);
uicontrol(f,'style','pushbutton', ...
'position', [10 10 100 50],...
'string', "seno",...
'callback', "plot(sin(x))")
uicontrol(f,'style','pushbutton', ...
'position', [100 10 100 50],...
'string', "funcin",...
'callback', "exec(foo(x))")
close(f)
117
A.3.2 La funcin uimenu
La funcin uimenu crea un men o un submen en una figura. Si el parent es una figura,
entonces el men se agregar a la barra de men de la figura. Si parent es un men, entonces
el nuevo tem se agregara a los tem del parent, permitiendo crear submen en cascada. La
secuencia del llamado es:
h=uimenu([prop1,val1] [,prop2, val2] ...)
h=uimenu(parent,[prop1, val1] [,prop2, val2] ...)
parent : Un entero que administra la relacin del men
prop{1, 2 ...} : nombre de la propiedad
val{1, 2 ...} : valor para afectar a la propiedad correspondiente
h : Entero que identifica el men correspondiente
Para crea un men adaptado se puede utilizar algunas de las siguientes propiedades:
callback (string) Permite colocar la instruccin a llamar cuando el tem es elegido por el
usuario.
label (string) Permite colocar el texto que aparece en el item.
tag (string) Esta propiedad generalmente es utilizada para identificar el men. Permite darle
un nombre.
118
A.3.3 Las funciones set y get
Con la funcin set se pone o modifica el valor de la propiedad de un objeto de interfase de
usuario, como uicontrol. La secuencia del llamado es:
set(prop,val)
set(h,prop,val)
h.prop=val
Esta funcin pude utilizarse para colocar una propiedad especifica a una entidad grfica. Esta
entidad grfica es identificada por su manija h. Si la manija no se especifica el objeto en uso
es tomado por defecto. El tipo de valor para poner a la propiedad depende del tipo de
propiedad de la entidad grfica.
Con la funcin get se obtiene el valor de la propiedad de una entidad grfica o de un objeto
de interfase de usuario. Las secuencias del llamado es:
f=figure('position', [10 10 300 200]);// crea una figura
m=uimenu(f,'label', 'ventanas');// crea un item en la barra de men
m1=uimenu(m,'label', 'operaciones');//crea un segundo item en el menu
"windows"
m2=uimenu(m,'label', 'salir de scilab', 'callback', "exit")
x=0:%pi/10:2*%pi;y=sin(x);
m11=uimenu(m1,'label', 'nueva ventana',
'callback',"xselect()",'callback',"plot(x,y)");
m12=uimenu(m1,'label', 'borra la ventana', 'callback',"xbasc()");
// crea un submenu para el item "operaciones"
close(f);// cierra la figura
119
h=get(prop)
val=get(h,prop)
val=h.prop
Esta funcin puede utilizarse para obtener el valor de una propiedad de un objeto GUI. Si no
se especifica la manija h, el objeto en uso es tomado por defecto. Tambin se utiliza para
obtener una lista de todos los hijos, padres, o tipos que dependen de la manija de entrada. A
continuacin se explica el significado de las variables de las secuencias del llamado de ambas
funciones:
h : una manija, el identificador de la entidad a la cual se quiere poner el valor de la propiedad.
h puede ser un vector, en cuyo caso pone el valor de la propiedad de todos los objetos
identificados por h(i).
prop : una tira de caracteres con el nombre de la propiedad que se quiere poner.
val : valor para dar a la propiedad.
En el siguiente ejemplo, con el botn Pasa1 se toma el valor de la propiedad string, en este
caso la palabra hola, del uicontrol cuya manija es h1 y lo pone como valor de la misma
propiedad pero del uicontrol con manija h2. Es decir se paso el texto de una caja a otra caja de
estilo edit. Al presionar el botn Pasa2 la palabra HOLA, en maysculas, se pone como
propiedad de h2.
clf()
f=figure(1,'position',[100 100 300 300])
h1=uicontrol(f,'style','edit', 'position', [10 10 100 50],'string','hola');
h2=uicontrol(f,'style','edit', 'position', [150 10 100 50],'string','');
h3=uicontrol(f,'style','pushbutton','position', [10 200 100
50],'string','Pasa1','callback','exec(foo2())');
h4=uicontrol(f,'style','pushbutton','position', [150 200 100
50],'string','Pasa2','callback','exec(foo1())');
function foo1()
set(h2,"string",'')
set(h2,"string",'HOLA')
endfunction
function foo2()
set(h2,"string",'')
p=get(h1,'string')
set(h2,"string",string(p))
endfunction
120
121
APENDICE B
TOMA DE DATOS CON INTERFASE TCL/TK
Existe la posibilidad de complementar a Scilab con el lenguaje Tcl/Tk, con el que se amplan
las prestaciones de Scilab para realizar programas ms elaborados, por ejemplo programacin
orientada a objetos o para la adquisicin de datos. En el captulo anterior se han utilizado los
comandos figure, uicontrol y uimenu que son ejemplos de interfaces TCL para la creacin de
objetos grficos. En este captulo, primero se presentan comandos para ejecutar sentencias o
archivos TCL y luego la aplicacin de stas para la adquisicin de datos mediante la
computadora.
B.1. EJECUCIN DE SENTENCIAS TCL
El comando TCL_EvalStr evala una tira de letras dentro del interprete tcl/tk. Es decir,
permite ejecutar sentencias escritas en el formato tcl/tk. La forma general del llamado es:
TCL_EvalStr(str [,interp])
str : es una tira de letras o vector de tiras de letras con las instrucciones tcl/tk
interp : parmetro opcional, de tiras de letras. Nombre del interpretador tcl esclavo donde se
realizarn las operaciones. Si no se proporciona un nombre, se utilaza el interpretador
principal creado por scilab.
TCL_EvalStr puede utilizarse para evaluar expresiones sin tener que escribir las instrucciones
tcl/tk en un archivo separado. Si las instrucciones son muchas, conviene utilizar la funcin
TCL_EvalFile que lee y evala un archivo tcl/tk. El llamado general de la funcin es el
siguiente:
TCL_EvalFile(filename [,interp])
filename : es una tira de caracteres que contiene el nombre del archivo a ser ledo y evaluado.
interp : significado idntico al explicado anteriormente.
122
Esta funcin permite crear poderosas interfaces utilizando directamente scripts en tck/tk.
La funcin TCL_GetVar permite obtener el valor de una variable tcl/tk . Su llamado general
es:
value=TCL_GetVar(Varname [,interp])
varname : cadena de caracteres que contiene el nombre de la variable tcl/tk.
interp : con significado idntico al explicado anteriormente
value : puede ser una letra o una matriz de tiras de letras, que contiene el valor de la variable
varname.
B.2. TOMA DE DATOS DESDE LA PUERTA SERIE
Como se dijo anteriormente, Scilab no tiene funciones propias para programar directamente
sobre las puertas serie de la PC. En cambio, el lenguaje TCL/TK, s cuenta con este tipo de
sentencias y se pueden ejecutar desde SCILAB con la funcin TCL_EvalStr. A continuacin,
se describen funciones creadas con comandos de TCL que permiten tomar datos desde la
puerta serie (COM1), utilizando mdulos de adquisicin ADAM. En particular, se programa
para el ADAM 4018 que es un mdulo para medir hasta 6 canales de seales. Por ejemplo, se
pueden medir temperaturas conectando termocuplas a estos canales. Si bien las funciones que
se muestran a continuacin pueden formar parte de un solo procedimiento, se muestran por
separado como si se tratase de un proceso, lo cual facilita su utilizacin en una interfaz grfica
donde cada una de ellas puede estar asociada a la ejecucin de un control de dicha interfaz. A
continuacin se explican las funciones:
Habilita Leer Conf Medir Deshabilita Configurar
123
La funcin habilitar_ADAM habilita el mdulo de adquisicin. La funcin TCL_EvalSTr
evala y ejecuta dos lneas de sentencias. En la primera, el comando set crea y asigna un valor
a la variable leer, que est entre corchetes. Cuando se colocan entre corchetes significa que se
debe evaluar el contenido. En este caso se abre la puerta ttyS0 para grabar o leer. La variable
leer se obtiene luego anteponiendo el signo $. En la segunda sentencia se utiliza el comando
fconfigure para poner las opciones al canal de medida $leer, mode establece el protocolo de
medida RS232 (velocidad de baudios, paridad, longitud de los bits, bit de stop), buffering
line establece que se leer cada ves que ingrese una lnea de datos en el buffer, sin esperar que
este se llene, eofchar establece cual es el carcter de fin de lnea, en este caso un vaco.
La funcin leer_configuracin_ADAM permite leer la configuracin del mdulo. Cada
mdulo tiene asignado un nmero. El parmetro de entrada nmero identifica el mdulo que
se quiere configurar. El comando puts coloca en el canal $leer el comando $0%d2, que es un
comando de programacin propio del ADAM. %d es un carcter de conversin que se
sustituye por nmero que identifica al mdulo. El comando gets lee la lnea de respuesta
desde el canal especificado y sta es puesta como valor de la variable b. En la ltima lnea se
convierte este valor de TCL a SCILAB, asignndolo a la variable de salida de la funcin, b.
La misma funcin puede utilizarse para configurar el mdulo pero en este caso el parmetro
nmero contiene toda la sintaxis de programacin correcta, de acuerdo a lo que se muestra en
la tabla de abajo. Por ejemplo si con un ADAM 4018 el parmetro nmero vale %070F0600
se configura el mdulo 07 para utilizar en todos los canales termocuplas tipo k, que leern a
function habilitar_ADAM()
TCL_EvalStr(["set leer [ open /dev/ttyS0 r+]"
"fconfigure $leer -mode 9600,n,8,1 -buffering line -
eofchar {} "
])
endfunction
function b=leer_configuracion_ADAM(nmero)
num= sprintf("puts $leer \$0%d2",nmero) //para leer configuracin
// num= sprintf("puts $leer \%d",nmero) para configurar
TCL_EvalStr(num)
TCL_EvalStr("set b [ gets $leer]")
b=TCL_GetVar('b')
endfunction
124
una velocidad de 9600 baudios por segundos y el resultado de la lectura se mostrar en
unidades de ingeniera.
Como se dijo, un mdulo de adquisicin tiene varios canales de entrada anlogas. La funcin
medir_ADAM mide un canal del mdulo, especificado por el parmetro canal, mientras que el
mdulo est especificado por nmero. Este canal de medida del mdulo no debe confundirse
con el fichero $leer habilitado anteriormente como canal de comunicacin con la puerta serie.
La funcin coloca en $leer el comando de programacin #0%d%d, donde se reemplazan los
caracteres de conversin enteros por nmero, que identifica el mdulo, y por canal, que
identifica el canal que se quiere medir. Luego de un tiempo de demora de 100 milisegundos,
se obtienen el valor que el buffer puso en $leer, asignndolo a la variable b. Esta se convierte
y se pasa como variable con formato al parmetro de salida medida.
La funcin deshabilitar_ADAM cierra el archivo $leer, mediante el comando close Si se est
corriendo un programa de gran tamao, pueden consumirse muchos recursos si se mantienen
abiertos ficheros innecesariamente.
La siguiente Tabla contiene la sintaxis de los comando de programacin del mdulo ADAM
que se utilizaron en las funciones.
Sintaxis del Comando Nombre del Comando Descripcin Ejemplo
%AANNTTCCFF Configuracin Coloca la direccin,
rango de entrada,
velocidad de baudios,
formato del dato del
mdulo
%070F0600
#AAN Leer el canal N Lee la entrada del canal
N del mdulo AA
#070
$AA2 Estado de la configuracin Pide la configuracin del
mdulo AA
$072
function medida=medir_ADAM(canal,nmero)
num= sprintf("puts $leer #0%d%d",nmero,canal)
TCL_EvalStr(num)
TCL_EvalStr("after 100")
TCL_EvalStr("set b [ gets $leer]")
b=TCL_GetVar('b')
medida=sscanf(b,">+%f")
endfunction
function deshabilitar_ADAM()
TCL_EvalStr("close $leer ")
Endfunction