Vous êtes sur la page 1sur 27

Suscríbete a DeepL Pro para poder editar este documento.

Entra en www.DeepL.com/pro para más información.

Programación con SCILAB

Por

Gilberto E. Urroz, Ph.D., P.E.

Distribuido por

i nfoClearinghouse.com

2001 Gilberto E. Urroz


Todos los derechos
reservados
Un archivo "zip" que contiene todos los programas de este documento (y
otros documentos de SCILAB en InfoClearinghouse.com) puede
descargarse en el siguiente sitio:

http://www.engineering.usu.edu/cee/faculty/gurro/Software_Calculators/Scil
ab_Docs/ScilabBookFunctions.zip

Se puede acceder a la página web de la autora de SCILAB

en:

http://www.engineering.usu.edu/cee/faculty/gurro/Scilab.html

Por favor reporte cualquier error en este documento a: gurro@cc.usu.edu


PROGRAMACIÓN SCILAB, IO, YSTRINGS 2

SCILAB programming constructs 2


Operadores de comparación y lógicos2
Bucles en SCILAB3
Construcciones condicionales en SCILAB3

Funciones enSCILAB 5
Variables globales y locales6
Comandos de funciones especiales6
Depuración7
Ejemplo de una función - Cálculo de la norma Frobenius de una matriz8

Entrada/salida enSCILAB 9
Guardar y cargar variables9
Salida no formateada a la pantalla9
Salida sin formato a un archivo9
Trabajar con archivos.10
Escribir en archivos.10
Lectura desde el teclado11
Lectura de archivos12

Manipular cuerdas enSCILAB 12


Cadenaconcatenation 13
Cadenafunctions 13
Conversión de valores numéricosto strings 14
Catenación de cuerdas para un vectorof strings 15
Conversión de cadenasto numbers 15
Ejecución de las declaraciones SCILAB representadas porstrings 16
Producción de productos etiquetados enSCILAB 17
Mediante la función disp18
La variable ans18

Exercises 19

Descargar en 1 2001 Gilberto E. Urroz


InfoClearinghouse.com
SCILAB Programación, IO y cadenas
La programación es la habilidad básica para implementar métodos numéricos. En este capítulo
se describen las construcciones fundamentales de programación utilizadas en SCILAB y se
presentan ejemplos de sus aplicaciones a algunos métodos numéricos elementales. La segunda
parte de este capítulo está dedicada a explorar las funciones de entrada/salida proporcionadas
por SCILAB, incluyendo las operaciones con archivos. Finalmente, se presenta la manipulación
de cadenas en SCILAB.

Construcciones de programación SCILAB


SCILAB proporciona al usuario una serie de construcciones de programación muy similares a las
disponibles en FORTRAN y otros lenguajes de alto nivel. A continuación presentamos algunas de
las construcciones:

Operadores de comparación y lógicos


Los operadores relacionales SCILAB son
== igual a
< menos de
> superior a
<= menor o igual que
>= mayor o igual que
<> o~= no igual a

Los operadores lógicos


SCILAB son & y
| o
~ no

Como ejemplo, pruebe los siguientes comandos en


SCILAB: 3 <enter>
3 <introducción> (==
3 2>1)&(3>1)
<introducción>
(2>1)&(3>5)
<introducción>
(2<1)&(3>1)
<introducción>
(2<1)&(3>5)
<introducción> (2>1)
| (3>1)
<introducción> (3>1)
(2>1) | (3>5) <enter>
(2<1) | (3>1) <enter>
(2<1) | (3>5) <enter>
~(2<1) <enter>
~(2>1) <enter>
~(2>1) | (3>5) <enter>

Descargar en 2 2001 Gilberto E. Urroz


InfoClearinghouse.com
Bucles en SCILAB
SCILAB incluye bucles For y While. El bucle For es similar al bucle DO en FORTRAN o al bucle
FOR...NEXT en Visual Basic. La construcción básica para el bucle For es:

para índice = valor_comienzo : incremento : valor_fin,


...sentencias...fin para índice = valor_comienzo : valor_fin,
...sentencias..., fin

Si no se incluye ningún incremento, se supone que es igual a


1. Por ejemplo, introduzca lo siguiente para bucles en
SCILAB:

r = 1; para k = 1:0.5:4, r = r+k, end <enter>


xs = -1.0; dx = 0.25; n = 10; para j = 1:n, x = xs + (j-1)*dx, end <enter>
para m = 1:10, a(m) = m^2, end <enter>
a <enter>

La construcción básica para el bucle While es:

mientras que la condición, ....declaraciones..., final

Por ejemplo, intente lo siguiente durante el bucle:

s = 100; mientras que s>50, disp(s^2), s = s - 5, end <enter>

Para y mientras que los bucles se pueden terminar con la interrupción de comando, por
ejemplo, intente lo siguiente:

para j = 1:10, disp(j), si j>5 entonces break, end, end <enter>

Construcciones condicionales en SCILAB


En el ejemplo anterior usamos una construcción if.... then... end. Hay dos tipos de
construcciones condicionales en SCILAB, una es la construcción if-then-else-end (como en el
ejemplo anterior) y la segunda es la construcción condicional select-case. Diferentes formas de
la construcción if-then-else son:

si condición entonces declaración, final


if condition then statement, else statement, end
if condition then statement, elseif condition then statement, else statement, else

statement, end Pruebe los siguientes ejemplos:

x = 10; y = 5; si x> 5 entonces disp(y), end <enter>


x = 3 ; y = 5; si x>5 entonces disp(y), si no disp(x), end <enter>
x = 3; y = 5; z = 4; si x>5 entonces disp(x), si no x>6 entonces disp(y), si no disp(z),

final <enter> La forma general de la construcción del caso seleccionado es:

seleccionar variable, caso n1, sentencia, caso n2, sentencia, ...,

final Pruebe los siguientes ejemplos:

Descargar en 3 2001 Gilberto E. Urroz


InfoClearinghouse.com
x = -1; seleccione x, caso 1, y = x+5, caso -1, y = sqrt(x), fin <enter>
r = 7; seleccione r, caso 1, disp( r), caso 2, disp(r^2), caso 7, disp(r^3), end <enter>

Todas estas construcciones pueden programarse en ficheros siguiendo una estructura similar a
la de los programas FORTRAN o Visual Basic, y luego ejecutarse desde SCILAB. Estos archivos se
denominan scripts. Por ejemplo, escriba el siguiente script SCILAB en un archivo llamado
program1.txt:

clear borrar todas las


variables x =[10. -1. 3. 5. -
7. 4. 2.];
suma = 0;
n,m] =
tamaño(x); para
j = 1:m
suma = suma + x(j);
meta
xbar = suma/m;
xbar

Guárdelo en el subdirectorio de la papelera. Dentro del tipo SCILAB:

exec('program1.txt') <enter>

Tenga en cuenta que puesto que x es un vector de fila (en realidad una matriz con n = 1 fila y
m = 7 columnas), la función tamaño le proporciona un array de dos valores en la
sentencia[n,m] = tamaño(x). Luego, m se usa en el bucle para el bucle y en el cálculo de
xbar.

Como alternativa al uso de un vector de fila (o columna) está el uso de listas. Una lista es una
colección de objetos de datos no necesariamente del mismo tipo. En el siguiente ejemplo nos
limitamos a usar listas de números. Para definir una lista utilizamos el comando list, por
ejemplo, try:

y = lista(0., 1., 2., 3., 4., 6.) <enter>


tamaño(y) <enter>

En este caso, el tamaño de la lista, a diferencia del de un vector o matriz, se proporciona como
un único número. A continuación se muestra una versión modificada del script en el programa
1.txt. Escriba este archivo en program2.txt y guárdelo en el subdirectorio bin del directorio
SCILAB:

Igual que el programa1.txt, pero usando


listasclear //borrar todas las
variables
x = lista(10., -1., 3., 5., -7., 4., 2.);
suma = 0;
n =
tamaño(x);
para j = 1:n
suma = suma + x(j);
meta
xbar = suma/n;
n
xbar

Para ejecutar el script, desde dentro de SCILAB escriba:

Descargar en 4 2001 Gilberto E. Urroz


InfoClearinghouse.com
exec('program2.txt')<enter>

Descargar en 5 2001 Gilberto E. Urroz


InfoClearinghouse.com
Funciones en SCILAB
Las funciones son procedimientos que pueden tomar argumentos de entrada y devolver cero,
uno o más valores. Las funciones se definen ya sea en línea, usando el comando deff, o como
un archivo separado que necesita ser cargado usando el comando getf. A continuación se
presentan algunos ejemplos de funciones en línea:

deff('[z]=Euler(r,theta)','z=r*exp(%i*theta)') <enter>
Euler(1.0,-%pi/2) <enter>enter

deff('[r,theta]=cartpol(x,y)',['r=sqrt(x^2+y^2)'; 'theta=atan(y,x)'])
<enter>[radio,ángulo] = cartpol(3., 4.) <enter>>enter

Estas funciones se podían haber definido con la opción Definir función de usuario... del menú
Funciones de SCILAB. Por ejemplo, seleccione esta opción e introduzca lo siguiente (su
respuesta se muestra en cursiva):

(1) Nombre de la variable de salida? x,y[OK];


(2) Nombre para la función? polcart[OK];
(3) Variable/s? r,theta[OK];
(4) ¿Código? ['x=r*cos(theta)','y=r*sin(theta)'][OK].

La respuesta del SCILAB es:

 deff('[x,y]=polcart(r,theta)',['x=r*cos(theta)';'y=r*sin(theta)]).

Pruebe la siguiente aplicación:

h,v] = polcart(10.0,%pi/6) <enter>


polcart(100.0,%pi/3) <enter>

El último comando le dará sólo el resultado para y ya que la llamada de función no fue
asignada a una matriz como en el primer caso.

Las funciones definidas en los ficheros deben comenzar con el comando

Función[y1,....,yn] = nombre(x1,...,xm)

Donde fname es el nombre de la función,[y1,...,yn] es una matriz de valores de salida, y


x1,...,xm son los valores de entrada. Escriba la siguiente función en un archivo llamado
sphecart.txt utilizando un editor de texto (por ejemplo, NOTEPAD o PFE):

función[x,y,z] = sphecart(r,theta,rho)
Conversión de coordenadas esféricas a cartesianas x
= r*cos(rho)*cos(theta)
y = r*cos(rho)*sin(theta)
z = r*sin(rho)

En SCILAB cargue la función usando:

getf('sphercart.txt')
<enter>[x1,y1,z1]=sphercart(10.0, %pi/3, %pi/6)
<enter>

Descargar en 6 2001 Gilberto E. Urroz


InfoClearinghouse.com
Observe que las funciones en línea de SCILAB son similares a las declaraciones de funciones de
FORTRAN, mientras que las funciones de SCILAB definidas en los archivos son similares a los
subprogramas o subrutinas de funciones de FORTRAN o Visual Basic. La diferencia principal es
que las funciones FORTRAN y Visual Basic sólo pueden devolver un valor, mientras que las
funciones SCILAB pueden devolver cero, uno o más valores.

Variables globales y locales


Una variable global es una definida en el entorno principal de SCILAB, mientras que una
variable local es una definida dentro de una función. Si una variable en una función no está
definida, o no está entre los parámetros de entrada, entonces toma el valor de una variable del
mismo nombre que existe en el entorno de llamada. Esta variable permanece local en el
sentido de que modificándola dentro de la función no altera su valor en el entorno de llamada
a menos que se utilice el comando resume.
Por ejemplo, utilizando la función sphercart, intente lo siguiente:

despejado
getf('sphercart.txt') <enter>
theta = %pi/3 <enter>
rho = %pi/6 <enter>
x,y,z] = sphercart(10.0,theta)<enter>

Dado que rho se define en el entorno de llamada, aunque falte ese valor en la secuencia de
llamada a la función sphercart, toma el valor de rho en el entorno de llamada.

Tenga en cuenta que no es posible llamar una función si uno de los parámetros de la secuencia
de llamada no está definido. Intente lo siguiente:

despejado
getf('sphercart.txt') <enter>
theta = %pi/3 <enter>
x,y,z]=sphercart(10.0,%pi/3,rho) <enter>

Debido a que rho no está definido en este caso, la función no puede ser evaluada.

Comandos de funciones especiales


Son comandos SCILAB utilizados casi exclusivamente en funciones:

argn: devuelve el número de argumentos de entrada y salida de la función


error: suspende el funcionamiento de una función, imprime un mensaje de error y vuelve
al nivel de entorno anterior si se detecta un error
warning: imprime un mensaje de advertencia
pausa: suspende temporalmente la operación de una función
break: fuerza el final de un bucle
return or resume: permite volver al entorno de llamada y pasar variables locales del entorno
de función al entorno de llamada.

Para obtener información adicional, utilice la función de ayuda de SCILAB con estas funciones.
El siguiente ejemplo ilustra el uso de algunos de estos comandos de funciones especiales.
Introduzca la función en un fichero llamado func1.txt, y guárdelo en el subdirectorio bin de
SCILAB:

Descargar en 7 2001 Gilberto E. Urroz


InfoClearinghouse.com
función[z] =
func1(x,y)[out,in]=argn(0
)
si x == 0 entonces
error ("división por cero");
fin,
pendiente =
y/x; pausa,
z = sqrt(pendiente);
s = resumen(pendiente);

Luego, dentro de SCILAB escriba lo siguiente:

clear <enter>
getf('func1.txt') <enter>
z = func1(0,1) <enter>
z = func1(2,1) <enter>

En la segunda llamada a func1, el indicador -1-> indica un modo de pausa. El funcionamiento


de la función se suspende temporalmente. En este punto, el usuario puede examinar los valores
calculados dentro de la función, trazar datos o realizar cualquier operación de SCILAB. El
control se devuelve a la función escribiendo el comando return <enter> (también se puede usar
curriculum vitae aquí). La operación de la función puede ser detenida usando"quit" o"abort".
Cuando se usa return (o resume), la función calcula e informa el valor de z. También está
disponible en el entorno la variable local s que se pasa al entorno global mediante el comando
resume dentro de la función. Tipo s
ENTER> para ver el valor de s.

Depuración
La forma más sencilla de depurar una función SCILAB es usar un comando de pausa en la
función. Cuando se encuentra este comando, la función se detiene y aparece el símbolo -1->.
Esto indica un "nivel" de cálculo diferente que puede utilizarse para recuperar valores de
variables incluyendo variables globales del entorno de llamada, experimentar con operaciones,
producir un gráfico si es necesario, etc. Usando una segunda pausa producirá un nuevo nivel
caracterizado por el indicador -2-
y así sucesivamente. La función reanuda la ejecución escribiendo el comando return o resume,
en cuyo momento se borran las variables utilizadas en los mensajes de nivel superior. La
ejecución de la función se puede interrumpir con el comando abortar.

Una característica adicional de depuración disponible en SCILAB es la inserción de puntos de


interrupción en la función. Estos son puntos preidentificados en la función a los que se puede
acceder durante la ejecución de la función para verificar los valores de las variables o realizar
otras operaciones. Compruebe los comandos setbpt, delbpt y disbpt.

También puede atrapar errores durante la ejecución de la función utilizando los comandos
errclear y errcatch. Compruebe estos comandos con la ayuda de SCILAB. Con un mayor nivel de
experiencia en depuración de SCILAB el usuario puede probar la función debug(i) donde i = 0,
1, 2, 3, 4, denota un nivel de depuración. Compruebe la función de depuración utilizando la
ayuda.

Descargar en 8 2001 Gilberto E. Urroz


InfoClearinghouse.com
Ejemplo de una función - Cálculo de la norma Frobenius de
una matriz.
Esta función se almacena en el fichero AbsM.txt dentro de la ubicación del subdirectorio en el
directorio SCILAB. (Nota: Aunque el nombre del archivo que contiene una función no tiene que
ser el mismo que el nombre de la función, se recomienda que sean el mismo para facilitar la
carga y el funcionamiento de la función).

La norma Frobenius de una matriz A =[aij] con n filas y m columnas se define como la raíz
cuadrada de la suma de los cuadrados de cada uno de los elementos de la matriz, es decir,

n m

|| A ||F aij.
i1 j1

La función AbsM(A), listada a continuación, calcula la norma Frobenius de una matriz:

función[v]=AbsM(A)
Esta función calcula la norma Frobenius de una matriz
Obtener primero el tamaño de la
matriz[n m] = tamaño(A);
Luego inicializar suma y agregar los términos
a(i,j)^2 suma = 0;
para i = 1:n
para j = 1:m
suma = suma + A(i,j)^2;
meta
fin;
toma raíz cuadrada y muestra el
resultado v = sqrt(suma);
Fin de la función

Dentro de SCILAB intente los siguientes comandos para cargar y ejecutar la función para un caso
particular:

clear <enter>
getf('AbsM.txt')
<enter> R =[1. 3. 4. 2.
<enter>
3. 2. 5. -7. <enter>
1. 3. 4. 5. ..........................................................;
AbsM(R) <introducir>

Las funciones se definen a lo largo del libro en relación con diferentes materias matemáticas,
es decir, vectores, matrices, integrales, ecuaciones diferenciales, etc. En los siguientes
apartados de este capítulo se tratan los temas de entrada/salida y manipulación de cadenas en
SCILAB.

Descargar en 9 2001 Gilberto E. Urroz


InfoClearinghouse.com
Entrada/Salida en SCILAB

Guardar y cargar variables.


Para guardar variables en un archivo use el comando guardar. Veamos
algunos ejemplos: A =[1. 2. 3.; -3. 4. 5.; 2. 4. 5.; 1. 3. 2.]; b = 1:10;
<enter>
A <enter>
b <enter>
save('DataAb.dat', A,b)<enter>

A continuación, mediante NOTEPAD o PDE, abrir el fichero DataAB.dat en la cola de


subdirectorios de SCILAB. Notará que no puede ver los números en el archivo. Esto se
debe a que se han guardado en formato binario. Despejemos las variables en SCILAB y
recarguemos los valores de A y b usando el comando load:

clear <enter>
load('DataAb.dat') <enter>
A <enter>
b <enter>

Salida no formateada a la pantalla


Para imprimir strings y variables sin formato, puede utilizar la función de impresión. La
forma general de la función es: imprimir (unidad o nombre de archivo, x1, x2, (y1, ..,
)). El valor unitario de la pantalla es 6 o %io(2). Pruebe los siguientes ejemplos:

x = 5; y = sin(%pi*x/10); r = 1:2:25; A = rand(5,3); <enter>


%io(2) <enter>
print(6,x,y) <enter>
print (6,A,r)<enter>
print (6,A,r)<enter
print(%io(2),x,y,r)<enter>
print(%io(2),A) <enter>

Observe que la impresión de función, al igual que la función disp utilizada


anteriormente, imprime primero la última variable de la lista. Pruebe algunos ejemplos
más:

Imprimir(6,x,'x valor =') <introducir>

Observe que, en este caso, la cadena 'x valor =' se imprime junto con la cadena 'x = ',
que es un valor por defecto del comando print. Por lo tanto, no es una buena idea
incluir un string de identificación cuando se utiliza la función de impresión para
imprimir en la pantalla.

Salida sin formato a un archivo


Puede utilizar la función de impresión para imprimir en un nombre de fichero, por
ejemplo, intentarlo:

print('data1.txt',A,r)<enter>
Descargar en 10 2001 Gilberto E. Urroz
InfoClearinghouse.com
print ('data2.txt',x,y)<enter>

Descargar en 11 2001 Gilberto E. Urroz


InfoClearinghouse.com
A continuación, con NOTEPAD, abra los archivos data1.txt y data2.txt. Nótese que la
salida incluye todos los identificadores y corchetes (!) proporcionados por SCILAB.

Trabajar con archivos.


El siguiente comando le permite abrir un archivo:

unit [,err]]=file('open', file-name [,status] [,access [,recl] [,format])

file-namestring: , file name of the file to be opened

statusstring: , El estado del archivo a abrir


"new" : file must not exist new file (default)
"old" El archivo ya debe existir.
Estado"unknown" desconocido
"scratch" El archivo debe ser borrado al final de la sesión.

accessstring: , El tipo de acceso al fichero


secuencial" : acceso secuencial :
acceso(default) "direct" directo.

: cadena de formato,
formateado" : para un archivo formateado (por
defecto) "sin formatear" : registro binario.

reclinteger: , es el tamaño de los registros en bytes cuando access="direct

unitinteger: , descriptor de unidad lógica del archivo: abierto

errinteger: , número de mensaje de error (ver error), si falla la apertura. Si


se omite un: error, se emite un mensaje de error.

También puede usar el comando: file(action,unit)

donde la acciónis one of the following


strings: "close": cierra el archivo.
"rewind": puts the pointer at beginning of file.
"backspace": pone el puntero al principio del
últimorecord. "last": pone el puntero después del último
registro.

Una vez abierto un archivo, se puede utilizar para la entrada (función de lectura) o la
salida (función de escritura). A continuación se muestran algunos ejemplos de apertura,
entrada y salida de archivos.

Escritura en archivos.
Los siguientes programas utilizan los valores de x, y, A, y r definidos anteriormente. En
estos ejemplos abrimos y escribimos en archivos, y los cerramos. Note que este
comando está orientado hacia la impresión de matrices -- una a la vez -- por lo tanto,
como se muestra en el Ejemplo 2, es mejor que junte sus datos en una matriz antes de
imprimirla. Observe también que la parte de formato, que se incluye entre comillas, es
básicamente un formato FORTRAN.

Descargar en 12 2001 Gilberto E. Urroz


InfoClearinghouse.com
 Ejemplo 1.
u = file('open','data3.txt','new')<enter>
write(u,A,'(3f10.6)') <enter>
file('close',u)<enter>

 Ejemplo 2.
x1 = 0:0.5:10 <enter>
x2 = x1^2 <enter>
B =[x1',x2'] <enter>
m = fichero('open','data4.txt','new')<enter>
write(m,B,'(2(f10.6,2x))') <enter>
fichero('close',m)<enter>)

 Ejemplo 3. Incluyendo etiquetas. Nota: las etiquetas se escriben separadas de las


variables

A = rand(2,3); B = rand(2,3); C = A + B
<enter> u = file('open','data5.txt','new)
<enter> write(u,'this is matrix A','(a)')
<enter> write(u,A,'(3(f10.6,2x)') <enter>
write(u,'this is matrix B','(a)') <enter>
write(u,B,'(3(f10.6,2x)') <enter>
write(u,'this is matrix C = A + B','(a)') <enter>
write(u,C,'(3(f10.6,2x)') <enter>
file('close',u) <enter>

Lectura desde el teclado


La lectura desde el teclado se puede realizar utilizando la función de lectura con la
unidad
%io(1) o 5. La forma general de la función de lectura es:

x]=read(descripción del archivo,n,m,[formato]),

es decir, a una variable se le debe asignar un valor (podría ser una matriz de tamaño
n,m) durante la operación de lectura. La descripción del archivo puede ser una unidad
o un número asignado a un archivo o al teclado. El formato no es necesario. Además,
para leer un solo valor use m = 1, n= 1, como se muestra a continuación.
Por ejemplo, escriba la siguiente función en un archivo llamado inout.txt:

función inout()
este script ilustra usando leer y escribir
(%io(2),'Enter a real variable x:','(a)'); x =
read (%io(1),1,1);
write(%io(2),'Enter a real variable y:','(a)');
y = read (%io(1),1,1);
z = x+y;
write(%io(2),'la suma de x e y es:','(a)')
escribir(%io(2),z,'(10x,e13.7)')
Fin de la función

Descargar en 13 2001 Gilberto E. Urroz


InfoClearinghouse.com
Dentro de SCILAB, escriba los siguientes comandos y respuestas a las instrucciones:
Getf('inout.txt') <enter>
inout( ) <enter>
1.2 <enter>
2.4 <enter>

Note que la función inout no tiene argumentos. Sin embargo, tanto en la definición
de la función como en la llamada de función tiene que tener un par de paréntesis.

Lectura de archivos
Utilice el mismo comando de lectura que se utiliza al leer desde el teclado, pero
utilizando una unidad de archivo abierta para leer. Por ejemplo, suponga que tiene un
archivo llamado signal.txt, que contiene los siguientes valores:

1.0 2.0 4.0


2.0 3.0 9.0
3.0 4.0 16.0
4.0 5.0 25.0
5.0 6.0 36.0
6.0 7.0 49.0

Si conoce el número de filas (n=6, en este caso). Para leer la matriz de valores, utilice:

u=archivo('open','signal.txt','old') <enter>
A=leer(u,6,3); <introducir>
A<entrar>

Si el número de filas es desconocido usando n=-1 se asegurará de que se lea todo el


archivo. Se supone que el fichero contiene sólo la matriz de interés. Por ejemplo,

file('rewind',u) <enter>
B = read(u,-1,3);
<enter> B <enter>
file('close',u) <enter>

Manipular cuerdas en SCILAB


Una cadena es básicamente texto que puede ser manipulado mediante comandos SCILAB. Las
cuerdas en SCILAB se escriben entre comillas simples o dobles. Los siguientes son ejemplos de
cuerdas:

‘myFile’ ‘The result is: ‘ a b c c 'abc' 'a' 'b' 'c' 'abc


“Text to be included” “Please enter the graphic window number” "“1” “3” “5”

Descargar en 14 2001 Gilberto E. Urroz


InfoClearinghouse.com
Concatenación de cadenas
La unión de dos o más cadenas se denomina concatenación. El símbolo más (+), cuando se
coloca entre dos cadenas, concatena las cadenas en una sola. En el siguiente ejemplo se
definen y concatenan las variables s1, s2 y s3:

s1 = 'El resultado de 's1


=

El resultado de

s2 = 'multiplicación 's2
=

multiplicador

s3 = 'se da a
continuación.'s3 =

se da a continuación.

Salida = s1 + s2 +
s3sOut =

El resultado de la multiplicación se da a continuación.

Funciones de cadena
La longitud de función determina, por ejemplo, el número de caracteres de un string
determinado:

-->length(sOut)
ans =

46.

La parte de función permite la extracción de caracteres de una cadena dada. Por ejemplo,
para extraer el primer carácter de un uso de cadena:

-->part('abcd',1)
ans =

El siguiente comando extrae el primer y segundo carácter de una cadena:

-->part('abcd',[1,2])
ans =

ab

En el siguiente ejemplo, se extraen los caracteres 1 y 3 de la cadena:

part('abcd',[1,3])

Descargar en 15 2001 Gilberto E. Urroz


InfoClearinghouse.com
ans=

ac

Para extraer una serie de caracteres, las posiciones de los caracteres en la cadena se
indican como una secuencia de valores en el vector que representa el segundo argumento a
la parte de función:

-->part(sOut,[4:1:15])
ans =

resultar de

La función strindex (índice de cadenas), con una llamada típica del formulario
strindex(cadena1,cadena2) determina la posición de la primera aparición de la subcadena2
dentro de la cadena1. Por ejemplo,

-->strindex(sOut,'mult')
ans =

17.

Una vez que se ha determinado la posición de una subcadena, puede utilizar la parte de
función para extraer esa subcadena u otra subcadena empezando en esa posición. Por
ejemplo, esta llamada de función extrae los caracteres 17 a 24 de la cadena sOut:

-->part(sOut,[17:24])
ans =

multiplicadores

La función strsubst (sustitución de cadena), con una llamada típica del formulario

strsubst(cadena1,cadena2,cadena3)

reemplaza la subcadena cadena2 con la subcadena cadena3 dentro de la cadena cadena1. Por
ejemplo, la siguiente llamada a la función strsubst sustituye la subcadena 'multiplicación'
por 'división' dentro de la cadena sOut:

-->strsubst(sOut,'multiplication','division')
ans =

A continuación se presenta el resultado de la división.

Conversión de valores numéricos en cadenas de texto


La cadena de función se utiliza para convertir un resultado numérico en una cadena. Esta
operación es útil cuando se muestra la salida de los cálculos numéricos. Por ejemplo, la
siguiente línea de entrada de SCILAB realiza un cálculo numérico, cuya salida inmediata es
suprimida por el punto y coma, y luego produce una cadena de salida que muestra el
resultado. La cadena de salida producida consiste en la sub-serie "The sum is" concatenada
al resultado numérico que se ha convertido en una cadena con cadena(s).

s = 5+2; "La suma es " + cadena(s)

Descargar en 16 2001 Gilberto E. Urroz


InfoClearinghouse.com
ans =

La suma es 7

El siguiente comando produce una matriz o vector de cadenas. Las cadenas en el vector
representan los números del 1 al 5.

-->sNum = string(1:5)
sNum =

!1 2 3 4 5 !

Un intento de sumar los dos primeros elementos del vector sNum produce en cambio su
concatenación, verificando que los elementos son efectivamente cadenas, y no números:

-->sNum(1)+sNum(2)
ans =

12

Catenación de cuerdas para un vector de cuerdas


Para generar una cadena que consiste en insertar una subcadena particular entre los
caracteres de un vector o array de cadenas, utilice la función strcat (string catenation). El
siguiente ejemplo produce una cadena que resulta de insertar el carácter '-' entrelos elementos
de sNum:

strcat(sNum,' - ans
') =
1 - 2 - 3 - 4 - 5

Conversión de strings en números


Para convertir una cadena que representa números en su equivalente numérico se puede
utilizar la función evstr (evaluar cadena). El siguiente comando, por ejemplo, convierte los
elementos de cadena del vector sNum, definido anteriormente, en sus equivalentes
numéricos:

-->nNum = evstr(sNum)
nNum =

! 1. 2. 3. 4. 5. !

El signo más (+) aplicado a los dos primeros elementos de nNum añadiría, en lugar
de concatenar, esos elementos:

nNum(1) + nNum(2)ans
=

3.

Descargar en 17 2001 Gilberto E. Urroz


InfoClearinghouse.com
La función evstr se puede utilizar para evaluar numéricamente cualquier cadena que
represente operaciones numéricas. A continuación se muestran algunos ejemplos:

-->evstr('2+2')
ans =

4.

evstr('sin(%pi/6) + 1/3')ans
=

.8333333

El siguiente ejemplo utiliza la función evstr para evaluar los valores numéricos definidos en
los elementos de un vector. Este ejemplo en particular utiliza los valores de un par de
variables, s y m, que deben definirse antes de intentar la evaluación de las cadenas.

s = 2, m = 3
s =

2.
m =

3.

evstr([['2' 'sqrt(s)' 'm + sans


']) = =['2''sqrt(s)' 'm +
s'])

! 2. 1.4142136 5. !

Ejecución de sentencias SCILAB representadas por cadenas de texto


Para evaluar sentencias de asignación o comandos SCILAB definidos por cadenas utilizamos la
función
execstr (ejecutar cadena). Por ejemplo,

execstr('a=1')

Aunque la sentencia a=1 se ejecuta mediante el uso de execstr, no se produce ninguna salida.
Para comprobar que la sentencia fue efectivamente ejecutada, solicite a SCILAB que muestre el
valor de a:

un -->a
a =

1.

Puede usar execstr para evaluar una serie de comandos colocando los comandos en una matriz o
vector:

execstr(['a=1','b=2','a+b'])

Una vez más, no se muestra ninguna salida, por lo que el resultado del último elemento en el
vector se pierde, pero la variable b (del segundo elemento en el vector) fue efectivamente
almacenada:
Descargar en 18 2001 Gilberto E. Urroz
InfoClearinghouse.com
b
b =

2.

Un segundo ejemplo de múltiples sentencias ejecutadas a través de execstr es el siguiente:

execstr(['s=2' 'm=3' 'r=sqrt(s)' 'q=m+s'])

Compruebe los resultados de las sentencias utilizando:

Traducción:
wikitle.com

! 2. 3. 1.4142136 5. !

El siguiente ejemplo muestra la ejecución de un pequeño programa cuyas líneas se presentan


como elementos de cadena de un vector:

execstr(['a=2' 'x=[]' 'para j = 1:4' 'x =[x a^j]' 'end'])

El resultado del último comando se puede ver entrando:

x -->x
x =

! 2. 4. 8. 16. !

Producción de productos etiquetados en SCILAB


El siguiente ejemplo muestra una manera de producir salida etiquetada en SCILAB. Los
datos para la salida están contenidos en el vector d de dimensiones 1xm:

d =[0.5:0.25:1.5];

-->[n m] = size(d); m es la lista de los

para j = 1:m, 'distancia no. ' + cadena(j) + ' es ' + cadena(d(j)) "+", fin

distancia no. 1
es.5.ans =

distancia no. 2
es.75.ans =

distancia no. 3 es
1.ans =

distancia no. 4 es
1.25.ans =

distancia no. 5 es 1,5.

Descargar en 19 2001 Gilberto E. Urroz


InfoClearinghouse.com
Utilizando la función disp
El resultado anterior utiliza las variables ans para mostrar cada línea de salida. Esta es la forma
estándar que utiliza SCILAB para mostrar la salida de corriente. El resultado mostrado arriba
puede simplificarse aún más utilizando la función disp (visualización), como se indica a
continuación:

para j=1:m, disp('distance no. '+ string(j) + ' is ' + string(d(j)) +"."),
fin

trayecto no. 1 es .5.

trayecto no. 2 es .75.

trayecto no. 3 es 1.

trayecto no. 4 es 1.25.

trayecto no. 5 es 1.5.

La función disp se puede utilizar para visualizar cualquier resultado, no sólo cadenas. El
siguiente ejemplo muestra la función disp utilizada con la cadena de texto así como la salida
numérica:

a = 2; A =[2,3;-1,4]; B = a*A;

Disp('Matriz B es:'), disp(B)

Matriz B es:

! 4. 6. !
! - 2. 8. !

La variable ans
La variable ans (respuesta) contiene la salida de corriente de SCILAB. Se puede hacer
referencia a la última salida SCILAB utilizando el nombre de variable ans. Por ejemplo, los
siguientes comandos utilizan el contenido de ans para operar en la última salida SCILAB:

3+2
ans=
5.

-->exp(ans)
ans =
148.41316

Verificar que el resultado obtenido es el uso correcto:

-->exp(5)
ans =
148.41316

Descargar en 20 2001 Gilberto E. Urroz


InfoClearinghouse.com
Ejercicios
[1]. Escribir una función SCILAB para calcular el factorial de un número entero:

n! n(n-1)(n-2)...321

[2]. Escribir una función SCILAB para calcular la desviación estándar de los datos contenidos
en un vector x =[x1 x2 x2... x3].
n
1

2
x k
x
 n k
 1 1 ,
dondeex es el valor medio de los datos,

1n
n k1
s xk .

[3]. Escribir una función SCILAB para calcular la función definida por


 
h() ln(2) exp( ), 2 
0,en otros lugares

[4]. Trazar la función h() en el intervalo -1<<10.

[5]. Guarde los datos usados en el ejercicio[4] en un archivo de texto, luego, recupere los
datos en los vectores x e y y y calcule la media y la desviación estándar de x e y usando la
función desarrollada enel ejercicio[2].

[6]. Escribir una función SCILAB que encuentre la mediana de una muestra de datos. La
mediana se define como el valor situado exactamente en el centro de la muestra de datos una
vez que se ha clasificado en orden creciente. El algoritmo para encontrar dicho valor viene
dado por:

xm = x(n+1)/2, si n es uniforme

xm = (xn/2+x(n+2)/2), si n es impar

donde n es el tamaño de la muestra. Para ordenar la muestra de datos puede utilizar la función
de clasificación SCILAB
(use -->help sort para encontrar más información

sobre esta función). [7]. Los coeficientes de la

expansión binomial

(a+b)n = C(n,0)an + C(n,1)an-1b + C(n,2)an-2b2 + ... + C(n,n,n-1)abn-1+ C(n,n)bn,

vienen dados por

Descargar en 21 2001 Gilberto E. Urroz


InfoClearinghouse.com
n!
C(n, k) .
k!(n k)!

Escribir una función SCILAB que produzca una tabla de coeficientes binomiales para n = 1, 2,
...., 5. Usar la función desarrollada en el ejercicio[1] para calcular factoriales de números
enteros.

[8]. Escribir un programa SCILAB para definir una función dada por

x 2 sin(x),0 x 1

Traza la función para 0 < x < 3.

[9]. Escriba una función SCILAB que solicite al usuario los valores del ancho del fondo (b) y
profundidad del agua (y) para un canal abierto de sección rectangular (ver figura abajo) e
imprima el área (A = bh), el perímetro mojado (P = b+2h) y el radio hidráulico (R = A/P)
debidamente etiquetados.
Pruebe la función para valores de b = 3,5 e y = 1,2.

[10]. Escribir una función SCILAB que solicite al usuario los valores de la posición inicial (x0,y0)
de un proyectil, la velocidad inicial dada como magnitud v0, y un ángulo 0, y la aceleración de
la gravedad g (ver figura abajo). La función también solicita al usuario un tiempo inicial t0,
un incremento de tiempo t y un tiempo final tf. La función produce una tabla de valores de las
componentes de velocidad vx = v0 cos(0), vy = v0 cos(0), la magnitud de la velocidad,
v = (v 2+v 2)1/2, la posición del proyectil, x = x + v cos( )t, y = y + v sin( )t - gt2/2, y
x y o 0 0 o 0 0
la distancia del proyectil desde el punto de lanzamiento, r0 = ((x-x0)2+(y-y0)2)1/2La función
también produce gráficas de x - vs. - t, y - vs. - t, r0 - vs. - t, y y - vs. -x en diferentes
ventanas gráficas. Nota: para generar una nueva ventana gráfica utilice el comando SCILAB -
-
xset('window',j) donde j es el número de la ventana.]

Descargar en 22 2001 Gilberto E. Urroz


InfoClearinghouse.com
[11]. Suponga que desea trazar la función r() = 3.5(1 - cos(2)). Escribir una función SCILAB que
genere valores de de 0 a 2, calcule los valores de r, y las coordenadas cartesianas x = r cos(), y
= r sin(), e imprima una tabla que muestre esos valores, es decir, , r, x, y
y. La función también produce una gráfica de y-vs.-x.

REFERENCIAS (para todos los documentos de SCILAB en


INFOCLEARINGHOUSE.com)
Abramowitz, M. e I.A. Stegun (editores), 1965,"Handbook of Mathematical Functions with Formulas, Graphs, and
Mathematical Tables" (Manual de funciones matemáticas con fórmulas, gráficos y tablas matemáticas), Dover
Publications, Inc. de Nueva York.

Arora, J.S., 1985, "Introduction to Optimum Design," Class notes, The University of Iowa, Iowa City, Iowa.

Instituto Asiático de Tecnología, 1969, "Hydraulic Laboratory Manual", AIT - Bangkok, Tailandia.

Berge, P., Y. Pomeau, y C. Vidal, 1984,"Order within caos - Towards a deterministic approach to turbulence" (Orden
dentro del caos - Hacia un enfoque determinista de la turbulencia), John Wiley & Sons, Nueva York.

Bras, R.L. e I. Rodriguez-Iturbe, 1985,"Random Functions and Hydrology," Addison-Wesley Publishing Company,
Reading, Massachussetts.

Brogan, W.L., 1974,"Modern Control Theory", serie QPI, Quantum Publisher Incorporated, Nueva York.

Browne, M., 1999, "Schaum's Outline of Theory and Problems of Physics for Engineering and Science",
esquemas de Schaum, McGraw-Hill, Nueva York.

Farlow, Stanley J., 1982, "Partial Differential Equations for Scientists and Engineers", Dover Publications Inc. en
Nueva York.

Friedman, B., 1956 (reeditado en 1990), "Principles and Techniques of Applied Mathematics", Dover Publications Inc.
en Nueva York.

Gómez, C. (editor), 1999, "Engineering and Scientific Computing with Scilab", Birkhäuser, Boston.

Gullberg, J., 1997, "Mathematics - From the Birth of Numbers," W. W. Norton & Company, New York.

Harman, T.L., J. Dabney y N. Richert, 2000, "Advanced Engineering Mathematics with MATLAB® - Second edition",
Brooks/Cole - Thompson Learning, Australia.

Harris, J.W., y H. Stocker, 1998, "Handbook of Mathematics and Computational Science", Springer, Nueva York.

Hsu, H.P., 1984, "Applied Fourier Analysis," Harcourt Brace Jovanovich College Outline Series, Harcourt Brace
Jovanovich, Publishers, San Diego.

Journel, A.G., 1989, "Fundamentals of Geostatistics in Five Lessons" (Fundamentos de la geoestadística en cinco
lecciones), curso corto presentado en el 28º Congreso Geológico Internacional, Washington, D.C., Unión Geofísica
Americana, Washington, D.C.

Julien, P.Y., 1998,"Erosión y Sedimentación", Cambridge University Press, Cambridge CB2 2RU, Reino Unido.

Keener, J.P., 1988, "Principles of Applied Mathematics - Transformation and Approximation," Addison-Wesley
Publishing Company, Redwood City, California.

Kitanidis, P.K., 1997,"Introduction to Geostatistics - Applications in Hydogeology," Cambridge University Press,


Cambridge CB2 2RU, Reino Unido.

Koch, G.S., Jr. y R. F. Link, 1971, "Statistical Analysis of Geological Data - Volumes I and II," Dover Publications,
Inc. en Nueva York.

Korn, G.A. y T.M. Korn, 1968, "Mathematical Handbook for Scientists and Engineers", Dover Publications, Inc. en
Nueva York.

Kottegoda, N. T., y R. Rosso, 1997, "Probability, Statistics, and Reliability for Civil and Environmental Engineers"
(Probabilidad, estadísticas y fiabilidad para ingenieros civiles y ambientales), The Mc-Graw Hill Companies, Inc. en

Descargar en 23 2001 Gilberto E. Urroz


InfoClearinghouse.com
Nueva York.

Descargar en 24 2001 Gilberto E. Urroz


InfoClearinghouse.com
Kreysig, E., 1983, "Advanced Engineering Mathematics - Fifth Edition", John Wiley & Sons, Nueva York.

Lindfield, G. y J. Penny, 2000, "Numerical Methods Using Matlab®" (Métodos numéricos que utilizan Matlab®), Prentice
Hall, Upper Saddle River, Nueva Jersey.

Magrab, E.B., S. Azarm, B. Balachandran, J. Duncan, K. Herold y G. Walsh, 2000, "An Engineer's Guide to
MATLAB®", Prentice Hall, Upper Saddle River, N.J., EE.UU.

McCuen, R.H., 1989,"Hydrologic Analysis and Design - second edition," Prentice Hall, Upper Saddle River, New Jersey.

Middleton, G.V., 2000, "Data Analysis in the Earth Sciences Using Matlab®," Prentice Hall, Upper Saddle River, New
Jersey.

Montgomery, D.C., G.C. Runger, y N.F. Hubele, 1998, "Engineering Statistics," John Wiley & Sons, Inc.

Newland, D.E., 1993, "An Introduction to Random Vibrations, Spectral & Wavelet Analysis - Third Edition", Longman
Scientific and Technical, Nueva York.

Nicols, G., 1995, "Introduction to Nonlinear Science", Cambridge University Press, Cambridge CB2 2RU, Reino Unido.

Parker, T.S. y L.O. Chua, "Practical Numerical Algorithms for Chaotic Systems", 1989, Springer-Verlag, Nueva York.

Peitgen, H-O. y D. Saupe (editores), 1988, "The Science of Fractal Images", Springer-Verlag, Nueva York.

Peitgen, H-O., H. Jürgens y D. Saupe, 1992, "Chaos and Fractals - New Frontiers of Science" (Caos y fractales -
Nuevas fronteras de la ciencia), Springer-Verlag, Nueva York.

Press, W.H., B.P. Flannery, S.A. Teukolsky, y W.T. Vetterling, 1989, "Numerical Recipes - The Art of Scientific
Computing (FORTRAN version)", Cambridge University Press, Cambridge CB2 2RU, U.K.

Raghunath, H.M., 1985, "Hydrology - Principles, Analysis and Design", Wiley Eastern Limited, Nueva Delhi, India.

Recktenwald, G., 2000, "Numerical Methods with Matlab - Implementation and Application" (Métodos numéricos
con Matlab - Implementación y aplicación), Prentice Hall, Upper Saddle River, N.J., EE.UU.

Rothenberg, R.I., 1991, "Probabilidad y estadísticas", Harcourt Brace Jovanovich College Outline Series, Harcourt
Brace Jovanovich, Publishers, San Diego, CA.

Sagan, H., 1961,"Boundary and Eigenvalue Problems in Mathematical Physics", Dover Publications, Inc. en Nueva York.

Spanos, A., 1999,"Probability Theory and Statistical Inference - Econometric Modeling with Observational Data"
(Teoría de la Probabilidad e Inferencia Estadística - Modelado Econométrico con Datos de Observación),
Cambridge University Press, Cambridge CB2 2RU, Reino Unido.

Spiegel, M. R., 1971 (segunda impresión, 1999), "Schaum's Outline of Theory and Problems of Advanced Mathematics
for Engineers and Scientists", Schaum's Outline Series, McGraw-Hill, Nueva York.

Tanis, E.A., 1987, "Statistics II - Estimation and Tests of Hypotheses," Harcourt Brace Jovanovich College Outline
Series, Harcourt Brace Jovanovich, Publishers, Fort Worth, TX.

Tinker, M. y R. Lambourne, 2000, "Further Mathematics for the Physical Sciences", John Wiley & Sons, LTD,
Chichester, Reino Unido.

Tolstov, G.P., 1962, "Fourier Series," (Traducido del ruso por R. A. Silverman), Dover Publications, Nueva York.

Tveito, A. y R. Winther, 1998, "Introduction to Partial Differential Equations - A Computational Approach", Texts in
Applied Mathematics 29, Springer, Nueva York.

Urroz, G., 2000, "Science and Engineering Mathematics with the HP 49 G - Volumes I & II", www.greatunpublished.com,
Charleston, S.C.

Urroz, G., 2001, "Applied Engineering Mathematics with Maple", www.greatunpublished.com, Charleston, S.C.

Winnick, J., "Chemical Engineering Thermodynamics - An Introduction to Thermodynamics for Undergraduate


Engineering Students", John Wiley & Sons, Inc. en Nueva York.

Descargar en 25 2001 Gilberto E. Urroz


InfoClearinghouse.com

Vous aimerez peut-être aussi