Universidad Nacional de Salta
Facultad de Ciencias Exactas
INTRODUCCIÓN AL USO DE SCILAB
Lenguaje libre para la programación científica
Autores:
Miguel Condorí
Mariela Finetti
Luis Saravia
SALTA, abril de 2011CAPÍTULO 1 ... 4
INTRODUCCIÓN ... 4
1.1. LA MOTIVACIÓN PARA LA ENSEÑANZA DEL SCILAB... 4
1.2. LAS CARACTERÍSTICAS PRINCIPALES DE SCILAB. ... 5
1.3. EL DIRECTORIO SCILAB ... 6 1.4. LA VENTANA DE TRABAJO ... 7 1.5. BIBLIOGRAFÍA ... 9 CAPITULO 2 ... 11 NOCIONES BÁSICAS ... 11 2.1. INTRODUCCIÓN ... 11
2.2. ENTRADA, EJECUCIÓN Y SALIDA ... 11
2.3. LAS VARIABLES Y LOS TIPOS DE DATOS ... 13
2.4. OPERADORES Y FUNCIONES ... 16
2.5. AYUDA DE SCILAB. ... 17
2.6. CONSTANTES ... 18
2.7. NÚMEROS COMPLEJOS ... 18
2.8. VECTORES Y MATRICES ... 19
2.9. EL GENERADOR DOBLE PUNTO ... 21
2.10. TIRA DE CARACTERES ... 23
CAPITULO 3 ... 27
PROGRAMACIÓN ... 27
3.1. INTRODUCCIÓN ... 27
3.2. DIRECTORIO PRINCIPAL DE TRABAJO ... 28
3.3. GUARDANDO LA SESIÓN DE TRABAJO ... 29
3.4. ENTRADA Y SALIDA SENCILLAS ... 30
3.5. ESTRUCTURA DE UNA FUNCIÓN ... 32
3.6. VARIABLES GLOBALES Y LOCALES ... 34
3.7. OPERADORES RELACIONALES Y LÓGICOS ... 37
3.8. SENTENCIAS DE CONTROL DE FLUJO ... 38
3.9. DEFINICIÓN DE FUNCIONES EN LÍNEA ... 43
CAPÍTULO 4 ... 45
GRÁFICOS EN SCILAB... 45
4.1. INTRODUCCIÓN ... 45
4.2. LA VENTANA GRÁFICA ... 45
4.3. REPRESENTACIÓN EN 2D ... 47
4.4. MANIPULACIÓN DE LOS PARÁMETROS DEL GRÁFICO ... 55
4.5. GRÁFICOS COMPUESTOS ... 57
4.6. CURVAS DE NIVEL ... 60
4.7. REPRESENTACIÓN DE GRÁFICOS EN 3D ... 62
OPERACIONES DE VECTORES Y MATRICES ... 67
FUNCIONES MATEMÁTICAS ... 75
6.1. FUNCIONES MATEMÁTICAS ELEMENTALES ... 75
6.2. SISTEMA DE ECUACIONES LINEALES... 76
6.3 NÚMEROS COMPLEJOS ... 77
6.4 POLINOMIOS ... 77
6.5 RESOLUCIÓN DE ECUACIONES NO LINEALES ... 79
6.6 AJUSTE LINEAL ... 80
6.7 DERIVADA ... 81
6.9 ECUACIONES DIFERENCIALES ORDINARIAS ... 87
CAPITULO 7 ... 89
ENTRADAS Y SALIDAS DE DATOS ... 89
7.1. INTRODUCCIÓN ... 89
7.2. ARCHIVOS BINARIOS (SAVE, LOAD) ... 89
7.3. FUNCIONES TIPO SCILAB (SIN FORMATO) ... 91
7.4. FUNCIONES TIPO FORTRAN (read, write) ... 92
7.5. FUNCIONES TIPO C ... 97
7.6. LEYENDO O GRABADO LÍNEAS DE ARCHIVOS DE TEXTOS... 103
CAPITULO 8 ... 104
PROBLEMAS RESUELOS ... 104
8.1. INTRODUCCIÓN ... 104
APENDICE A ... 105
DIÁLOGOS E INTERFACES GRÁFICAS ... 105
A.1. El USO DE DIÁLOGOS E INTERFACES A USUARIO ... 105
A.2. DIÁLOGOS ... 105
A.3. INTERFACES GRÁFICAS DE USUARIO ... 113
APENDICE B ... 121
TOMA DE DATOS CON INTERFASE TCL/TK ... 121
B.1. EJECUCIÓN DE SENTENCIAS TCL ... 121
CAPÍTULO 1
INTRODUCCIÓN
Este documento está conformado por apuntes de clase para la enseñanza del programa Scilab en la materia Laboratorio 1, en el departamento de Física de la Facultad de Ciencias Exactas, Universidad Nacional de Salta. Este material constituye una primera etapa en el aprendizaje de este programa permitiendo que el alumno aprenda los aspectos más importantes del mismo y pueda utilizarlo para resolver los problemas más habituales de las materias que conforman una carrera de ingeniería o Licenciatura en ciencias. Es de esperar que a partir de esta introducción, en caso de ser necesario, el alumno pueda profundizar personalmente en los aspectos más avanzados.
Hay que escribir algo sobre la estructura del libro
1.1. LA MOTIVACIÓN PARA LA ENSEÑANZA DEL SCILAB.
Tradicionalmente, se ha comenzado el proceso de enseñanza de la programación en computadoras con lenguajes simples como el Basic o sus derivados. A medida que se incrementó la capacidad de las computadoras fue posible utilizar programas que permiten manejar problemas de cálculo más complejos aunque su utilización siga siendo sencilla. Los mismos pasan a ser una herramienta poderosa que permite tratar la mayor parte de los problemas matemáticos con los que se enfrentará el alumno en su carrera de grado y en su actividad profesional posterior.
Entre los programas de mayor uso con las características mencionadas en el párrafo anterior, se encuentran Mathematica y Matlab (o similares, como Octave y Scilab). El Matlab es el más utilizado en cursos de Física e Ingeniería, mientras que el primero en general resulta más apropiado para matemáticos por su manejo del cálculo simbólico. Estos programas se caracterizan por disponer, además de las herramientas habituales de programación, de un conjunto muy grande de funciones útiles en las aplicaciones matemáticas, que permiten encarar el estudio de la mayor parte de los problemas que se presentan.
Scilab ha sido desarrollado por el INRIA, un Instituto de Investigación francés de prestigio. Recientemente, se creó el Consorcio Scilab que se encarga del servicio de mantenimiento y mejora del programa. Existen versiones para los sistemas operativos Windows y Linux, lo que aumenta su flexibilidad de uso. La popularidad de este programa en el ámbito internacional se ha ido incrementando sustancialmente en los últimos años.
1.2. LAS CARACTERÍSTICAS PRINCIPALES DE SCILAB.
Scilab es un programa compatible con Matlab y se ha desarrollado originalmente para
aplicaciones de electrónica, especialmente sistemas de control y tratamiento de señales. Está compuesto de tres partes distintas: un intérprete de los códigos de programación, las librerías de funciones (procedimientos Scilab) y librerías con rutinas en Fortran y C, dos lenguajes distintos compatibles con Scilab.
Una ventaja de Scilab es que utiliza la sintaxis de Matlab para el manejo de Matrices Numéricas, además de poder utilizar objetos más complejos. Por ejemplo, el manejo de matrices con racionales, polinomios o funciones es muy fácil de realizar con Scilab. Resumiendo podemos decir que Scilab es un paquete de software científico para el cálculo numérico con un entorno muy amigable para el usuario. Sus principales características son:
1. Es un programa orientado para la aplicación de las herramientas matemáticas a las distintas ciencias, en especial la física y la ingeniería. Esto se evidencia en la gran cantidad de funciones capaces de resolver la mayor parte de los problemas matemáticos. Scilab dispone de más de 1000 funciones matemáticas.
2. Es una aplicación interactiva. Esto significa que se le puede plantear una operación matemática y el programa entrega la respuesta de inmediato. Ello lo hace muy amigable cuando se resuelven problemas concretos no muy complicados. Pero también es posible escribir programas, es decir un conjunto sucesivo de operaciones matemáticas y lógicas, para poder resolver problemas más complicados que requieran un tratamiento más cuidadoso.
3. Scilab es Software Libre. Actualmente existe una línea de trabajo que piensa que el desarrollo de programas debe realizarse por el trabajo mancomunado de las personas
interesadas y que lo mismos deben tener libre disponibilidad de manera que puedan ser usados y eventualmente cambiados sin restricciones, siempre que se reconozca la autoría del programa. Este es el esquema utilizado en el caso del Scilab, que es de libre disponibilidad y se puede encontrar en Internet bajo la dirección:
http://www.scilab.org
Desde este sitio pueden descargarse diferentes versiones del programa y consultar información general, manuales y documentación adicional. También existe un grupo de noticias (News) donde pueden intercambiarse experiencias, ideas y programas desarrollados en Scilab. Además, existen numerosos sitios en internet donde puede encontrarse información adicional.
4. Se encuentra disponible para diferentes sistemas operativos: Windows y Linux. Es importante decir que el grupo Scilab antes mencionado actualiza con frecuencia su software, creando nuevas versiones, corrigiendo errores e implementando nuevas funciones.
Scilab tiene además otras importantes características para el programador más avanzado o con
necesidades específicas, entre las que se pueden mencionar:
Intérprete sofisticado y lenguaje de programación con la sintaxis tipo MATHLAB.
Cientos de funciones matemáticas desarrolladas (el usuario puede ampliarlas).
Muy buenos gráficos (2D, 3D y animación).
Muchas librerías desarrolladas (llamadas toolboxes en MATHLAB ).
Control (control clásico, LQG, H)
Paquete para optimización LMI (Matrices con inecuaciones lineales).
Optimización (diferenciable y no diferenciable).
Scicos (entorno interactivo para la modelización y simulación con sistemas híbridos)
Metanet (análisis de redes y optimización).
1.3. EL DIRECTORIO SCILAB
En el directorio de instalación de Scilab los subdirectorios más significativos son los siguientes:
bin (binarios) es el directorio en el que se almacenan los archivos ejecutables. El código ejecutable de Scilab se encuentra allí (scilex para el entorno Windows). Este directorio también contiene los scripts1 que administran los ficheros que se generan con Scilab y manejan la impresión de los mismos.
demos (demostración) es el directorio donde se encuentran todos los ejemplos y demostraciones. El fichero alldems.dem permite añadir una nueva demostración para que pueda ser ejecutada haciendo click sobre el botón Demos del menú. Es muy útil consultar Demos ya que los ejemplos incluidos pueden inspirar al nuevo usuario.
examples (ejemplos) contiene ejemplos muy útiles de cómo conectar Scilab con programas externos, utilizando enlaces dinámicos ( dynamic link ).
man (manuales) es el directorio que contiene la ayuda on-line de Scilab y que está subdividido en submanuales.
routines (rutinas) es el directorio que contiene el código fuente de todas las rutinas numéricas.
En la versión de Scilab para Linux, es posible seleccionar el directorio de instalación para la distribución aunque se recomienda hacerlo en /usr/local.
1.4. LA VENTANA DE TRABAJO
En la figura 1.1 de esta sección se observa la ventana de trabajo del Scilab. En la barra de herramientas se tienen diferentes opciones, entre las cuales se puede mencionar:
File – (archivo) aparece una lista con opciones que permiten manejar los archivos que se
utilizan, como Open, Load, Save y Print (abrir, cargar, grabar, imprimir). Las siguientes opciones están disponibles dentro del menú:
Exec: (ejecutar) para ejecutar en la ventana un archivo de procedimientos o una función (se guardan con terminación .sci).
Change Directory: (cambiar directorio) para cambiar el directorio de trabajo.
Get Current Directory: (obtener el directorio corriente) para obtener el camino (path) al directorio actual.
Exit: (salir) termina la sesión actual de scilab.
1 Un script es un programa sencillo que contiene una secuencia de instrucciones que el programa principal (en este caso Scilab) deberá interpretar. Ver capítulo 3.
Edit – (editar) la lista contiene opciones para copiar parte de un texto, mediante el uso del
“clipboard” (porta papeles), un sector de memoria donde se guarda el contenido copiado hasta que se “pega” en otro texto.
Preferences – (preferencias) contiene opciones para cambiar la apariencia de la pantalla de
trabajo, como el lenguaje (inglés/francés), color, fuente de las letras, etc.
Control – (control) la lista contiene opciones para controlar la ejecución de las funciones mediante las instrucciones resume, abort e interrupt, (reasume, aborta, interrumpe) que
permiten moverse dentro de diferentes procedimientos y ventanas de trabajo interactivas.
Editor – (editor) al elegirlo aparece el programa editor de textos SciPad con el cual se
escriben los procedimientos o funciones que se ejecutarán en Scilab.
Applications – (aplicaciones) desde allí se pueden ejecutar algunas aplicaciones que
funcionan bajo scilab, como Scicos que es un paquete para la simulación de sistemas dinámicos.
? – (ayuda) este menú contiene las opciones Help y Demos.
Demos – (demostraciones) Se abre una ventana con una lista de demostraciones de las posibilidades de Scilab. Se elige una y se presiona OK. Se recomienda probar las posibilidades de Scilab ejecutando las diferentes demostraciones.
Help (ayuda) Esta opción permite acceder a una descripción de cada uno de los comandos de Scilab. La información es igual a la contenida en el “manual de guía”. Los comandos están agrupados por tipos de función y al aparecer la lista, se puede apretar sobre el nombre de alguno para que aparezca la información detallada sobre el mismo. Recorriendo estas listas se puede apreciar la gran variedad de funciones disponibles en Scilab.
Figura 1.1
1.5. BIBLIOGRAFÍA
En el sitio de Internet mencionado en 1.2 se dispone de documentos de introducción, aplicaciones específicas y manuales para el usuario. También existen libros sobre el uso de Scilab, algunos de los cuales se detallan a continuación.
* Un manual en español: Título: Introducción al Scilab
Autor: Héctor Mora Escobar – Univ. Nacional de Colombia Fecha de publicación: Nov/2001
Páginas: 55
Disponibilidad: archivo poscript
* Un manual en inglés:
Autor: Scilab Group Fecha de publicación: Páginas: 126
Disponibilidad: archivo poscript.
*Manual de referencia en inglés: Título: Reference manual
Autor: Scilab Group Páginas: 722
Disponibilidad: archivo poscript
De este libro se disponen dos índices con cada comando del manual, uno ordenado por tema y otro por abecedario (en Word), útiles para encontrar los comandos que se necesiten.
*Un libro muy completo, en inglés:
Titulo: Numerical and statistical methods with scilab in science and engineering Author: Gilberto Urroz
Fecha de publicación: Febrero/2002 Páginas: 1100 (dos volúmenes) Disponibilidad: 2 archivos pdf
CAPITULO 2
NOCIONES BÁSICAS
2.1. INTRODUCCIÓN
En este capítulo se introducirá la información básica sobre el funcionamiento del lenguaje y los comandos más comunes a fin de poder comenzar a utilizar el programa. Como con cualquier otra aplicación la destreza en el uso de la misma se irá adquiriendo en la medida del uso del software. En capítulos posteriores se irá profundizando el aprendizaje del lenguaje.
Los ejemplos desarrollados para este libro se realizaron usando la versión 5.3.1 de Scilab para Windows, la última al momento de la edición de estos apuntes, pero las nociones básicas son comunes con las versiones anteriores, siendo las diferencias entre ellas fundamentalmente el agregado de nuevas funciones y aplicaciones.
En el pasado las versiones para Windows eran mucho mas amigables que las de Linux. En la actual versión no existen diferencias sustanciales. La sintaxis de comando y sentencias son las mismas y se corren igual en ambas versiones. Sólo se observan ligeras diferencias de aspectos y traducción al castellano de los menús.
2.2. ENTRADA, EJECUCIÓN Y SALIDA
Comencemos viendo cómo se ejecuta el programa y cómo se cierra al dejar de usarlo. Inicie Scilab simplemente haciendo click en el icono correspondiente en su escritorio (en la versión para Linux, llame una terminal de comandos, generalmente con el botón derecho del mouse, y escriba scilab). Lo primero que se muestra es la ventana de trabajo de Scilab con el siguiente Menú Principal:
Scilab es una aplicación interactiva, por lo tanto se introducen las operaciones que se desean ejecutar (“los comandos”) y el programa las ejecuta. Veremos después que también es posible ejecutar una serie de comandos escritos en un archivo (programas), mediante un editor de texto. Por ello esta versión ya viene con un editor incorporado, llamado SciNotes, al cual se accede desde el menú Applications.
En la parte superior está el menú principal desde donde se pueden ejecutar las operaciones principales desplegando los menús. Debajo de este menú, se presenta una barra de herramientas con iconos para la ejecución rápida de comandos específicos como por ejemplo llamar a SciNotes, abrir un archivo, cortar, copiar, pegar, cambiar directorio actual, etc.
Mas abajo, en la ventana de trabajo, Scilab muestra el siguiente símbolo, que se conoce como
prompt, indicando que el programa está listo para recibir la instrucción:
-->
Después del prompt es el lugar donde se comienza a introducir los comandos a ejecutar. En el caso de la figura se le ha ordenado que sume 2+3 y almacene el resultadoen la variable t. El comando se ejecuta presionando la tecla ENTER. Scilab imprime el contenido de la variable t, con el resultado de la operación, y a continuación vuelve a mostrar el prompt indicando al usuario que esta lista para recibir otra instrucción.
File Edit Preferences Control Editor ?
_______________________________ scilab-4.1
Copyright (C) 1989-2006 Consortium Scilab (INRIA/ENPC)
_______________________________ Startup execution:
loading initial environment -->t= 2+3
t = 5.
Para salir de Scilab se utiliza el comando “exit”. Este comando puede ejecutarse escribiéndolo a continuación del prompt y presionando enter, o seleccionando la opciónSalir desde el menú
File, con lo cual se vuelve al escritorio del sistema operativo.
2.3. LAS VARIABLES Y LOS TIPOS DE DATOS
En Scilab se pueden definir variables en las que se almacenan valores numéricos o alfanuméricos. Estas variables quedan guardadas en la memoria RAM de la computadora y pueden utilizarse en diferentes cálculos mientras dure la ejecución del programa o no se redefina la variable. Una variable es creada simplemente asignándole un valor. Por ejemplo, anteriormente se definió la variable t introduciendo en ella la suma 2+3.
En computación suelen usarse distintos tipos de datos: numérico entero, numérico flotante, texto alfanumérico, etc. Scilab determina el tipo de la variable a partir del contenido asignado a la variable, por lo tanto se puede cambiar de tipo simplemente cargando un nuevo valor. Como ejemplo, a continuación se carga en la variable t un número flotante y luego un texto alfabético.
Los tipos de datos básicos mas importantes que maneja Scilab son enteros, punto flotante (reales en sus distintas notaciones) y cadenas de caracteres. Como ejemplos tenemos:
4532 entero 3.5 punto flotante -->exit -->t=2.56 t = 2.56 -->t="Scilab" t = Scilab
-4.1234 punto flotante -31.45e+11 punto flotante “scilab” cadena de caracteres
Como se aprecia, los textos alfanuméricos (cadenas de caracteres) deben introducirse entre comillas para que Scilab los reconozca como tales y no los confunda con identificadores de variables.
Más adelante veremos que Scilab utiliza tipos más complejos de variable que permiten manejar números complejos, matrices y polinomios. La posibilidad de almacenar matrices en una variable y realizar diversas operaciones con ellas permite que Scilab pueda llevar a cabo operaciones complejas con suma facilidad, convirtiéndolo en un poderoso lenguaje de cálculo. Las mayúsculas y minúsculas son distinguidas por Scilab. Esto significa que t y T son dos variablesdiferentes, es decir se guardan por separado en la memoria. Por ejemplo:
Como se aprecia, t y T se guardan por separado y pueden ser utilizadas como tales a posteriori.
Es posible pedir en cualquier momento un listado de las variables disponibles en la memoria. Para ello se ejecuta el comando “who”, que muestra en pantalla el nombre de todas las variables que está utilizando Scilab durante la sección de trabajo, tanto las definidas por defecto como por el usuario.
-->t = 2.56 t = 2.56 -->T = 3.1e3 T = 3100. -->t, T t = 2.56 T = 3100.
Con el comando “who_user” se muestra un listado de todas las variables definidas por el usuario, lo cual es muy útil para no redefinir variables. En el ejemplo vemos que la lista contiene a las variables t y T, que se definieron en el ejemplo anterior.
Al comenzar su trabajo, Scilab define un conjunto de variables (variables predeterminadas o del entorno Scilab). No deben usarse identificadores de variables similares a las predeterminadas por Scilab ya que su uso está reservado.
Los nombres (identificadores) de las variables pueden tener hasta 24 caracteres de longitud. Deben comenzar con una letra o con el símbolo $. El resto de los símbolos pueden ser letras, números, , _, $, ¡. Por ejemplo, los siguientes nombres son válidos:
Primer_valor, b33, $signo, $123, masaInicial
Scilab posee la variable predeterminada “ans” que almacena el último valor calculado. El uso de la misma permite realizar operaciones posteriores empleando este valor.
Como se aprecia, la variable “ans” siempre almacena el último valor calculado. En el ejemplo se realiza un segundo cálculo operando con el resultado anterior, luego de esta segunda instancia “ans”adopta el nuevo valor.
-->4.5+0.23 ans = 4.73 -->ans*2 ans = 9.46 -->who_user
Las variables de usuario son:
T t WSCI
Para facilitar el trabajo, Scilab guarda en memoria todas las operaciones sucesivas que se están realizando. Si se quiere utilizar una de ellas a posteriori, basta presionar las teclas del cursor (flecha arriba o abajo) para recorrer la lista. Los comandos utilizados van apareciendo y uno puede seleccionar y ejecutar aquel que se quiere utilizar por segunda vez.
Scilab también permite realizar varias operaciones en una misma orden, separando cada orden o comando con una coma.
En la ejecución de una orden, si ésta se encuentra finalizada por un punto y coma, no se muestra el resultado de la ejecución en la ventana de Scilab, pero la operación se lleva adelante. (Esta forma de ejecutar órdenes se utiliza mucho en la confección de programas).
2.4. OPERADORES Y FUNCIONES
Scilab incluye numerosos operadores, entre ellos los aritméticos. Las cuatro operaciones básicas: suma, resta, multiplicación y división están representadas por: + - * / y la potencia por: ^ ó **.
Además se dispone de los paréntesis: ( ) para agrupar las operaciones. Las reglas con las que operan los símbolos precedentes son las habituales en matemática.
-->a1=5, a2=4.35, a3=0.0023 a1 = 5. a2 = 4.35 a3 = .0023
-->a1=5; a2=4.35; a3=0.023; -->
Se dispone también de una gran cantidad de funciones, que prácticamente cubren la mayor parte de las necesidades. Algunas de las funciones elementales disponibles son:
abs, acos, acosh, asin, asinh, atan, atanh, ceil, cos, cosh, cotg, coth, sin, sinh, tan, tanh, sqrt, exp, fix, floor, int, round
log, log10, log2
max, min, módulo(a,b)
La mayoría son reconocibles por su nombre. Por ejemplo ceil es la parte entera superior, floor es la parte entera inferior, fix redondea hacia cero (igual a int), módulo(a,b) proporciona el residuo de a dividido b donde ambos son enteros.
Además de las funciones elementales existe una gran cantidad de funciones especiales que se irán viendo a lo largo del curso, muchas de ellas de interés por sus aplicaciones en física e ingeniería.
2.5. AYUDA DE SCILAB.
Ya hemos visto que en el menú principal se encuentra un botón “?” para invocar la ayuda de Silab donde se accede a un navegador de ayuda y al detalle de todos los comandos agrupados por temas.
También es posible obtener la información de un comando específico directamente dentro de la ventana de trabajo con el comando “help”. Si, por ejemplo, se escribe después del pront ”help tan”, sin las comillas, obtendremos directamente la información detallada sobre la función tangente. Si no se dispone del nombre específico de la función, se puede solicitar información de todas las funciones de un tema dado utilizando el comando “apropos”. Por ejemplo, se puede pedir “apropos polynomial” para obtener todas las funciones relacionadas con los polinomios.
Si bien la ayuda de Scilab está en inglés es sumamente útil para la confirmación de la sintaxis o ver todas las posibilidades de un comando, y para obtener ejemplos de aplicación y una lista
de comandos asociados. Su utilización es altamente recomendable cada vez que se invoca un nuevo comando.
2.6. CONSTANTES
Es habitual utilizar en matemática algunas constantes que tienen una importancia especial, como ser el número pi, el número e, etc. Estos números se encuentran predefinidos en Scilab y pueden ser utilizados directamente en cualquier cálculo, se les llama “constantes”. Estos números están protegidos de modo que no se pueden cambiar. Se distinguen mediante una nomenclatura especial, colocando el signo % delante de su nombre. En el cuadro siguiente se muestran algunos de ellos. En el ejemplo se ve que al intentar cambiar el número pi, dándole el valor 0 el programa marca un error ya que una constante no se puede cambiar. En el cuadro se observa el número e y también el número imaginario i que se utiliza para escribir números complejos.
2.7. NÚMEROS COMPLEJOS
Scilab maneja los números complejos en forma sencilla. Para eso define internamente una variable, %i, que contiene el número imaginario i. Un complejo cualquiera se expresa usando la parte real más la imaginaria multiplicada por %i. Por ejemplo:
a = 5+7*%i -->%pi %pi = 3.1415927 -->%pi=0 !--error 13
Redefiniendo la variable permanente -->%e %e = 2.7182818 -->2+3*%i ans = 2. + 3.i
Las funciones de Scilab admiten números complejos como variables del cálculo y pueden expresar sus resultados como números. Por ejemplo:
2.8. VECTORES Y MATRICES
Scilab está preparado para trabajar con arreglos de variables (vectores y matrices) sin dificultad alguna. Esto convierte al Scilab en un lenguaje de cálculo matricial, ya que están definidas todas las operaciones que se aplican a matrices en forma de funciones. Las matrices se definen utilizando corchetes [ ]. Existen tres formas para definir una matriz, las que se ilustran en los ejemplos que siguen:
-->b = sqrt(-4) //se obtiene la raiz cuadrada b = 2.i -->c=sqrt(1+%i) c = 1.0986841 + .4550899i -->c^2 ans = 1. + i -->c = [11,12,13;21,22,23] c = 11. 12. 13. 21. 22. 23. -->d = [11 12 13;21 22 23] d = 11. 12. 13. 21. 22. 23. -->f = [11 12 13 -->21 22 23] f = 11. 12. 13. 21. 22. 23.
Como se aprecia, los elementos de la matriz se pueden separar con comas o con un espacio en blanco. Las filas sucesivas se separan con punto y coma o escribiéndolas en renglones sucesivos. En todos los casos la expresión debe comenzar y terminar con corchetes.
El elemento de una matriz C que ocupa la fila b y la columna d se indica como C(b,d) . Por ejemplo, en la matriz C definida anteriormente:
A continuación expondremos las operaciones más sencillas. Las restantes se verán en el capítulo cuatro.
La matriz transpuesta se obtiene con el símbolo ‘ colocado después de la variable. Por ejemplo, refiriéndonos a la matriz C definida anteriormente:
El producto de una constante por una matriz se expresa con el signo habitual de producto *, con el que la constante semultiplica por cada elemento de la matriz.
El producto entre dos matrices se define mediante el operador para la multiplicación “*”. La operación A*B indica el producto matricial entre las matrices A y B. El producto de dos matrices se puede definir sólo si el número de columnas de la matriz izquierda es el mismo que el número de filas de la matriz derecha. Por ejemplo para matrices de 2x2
-->c' ans = 11. 21. 12. 22. 13. 23. -->C(2,3) ans = 23. -->2*c ans = 22. 24. 26. 42. 44. 46.
Scilab también puede efectuar el producto entre los elementos de dos matrices anteponiendo un punto al signo asterisco, es decir: .*. En el ejemplo siguiente se ve la diferencia entre ambas operaciones.
2.9. EL GENERADOR DOBLE PUNTO
Resulta muy útil en el entorno de Scilab la generación de vectores formados por una sucesión de valores igualmente separados. A esos efectos dispone de una forma abreviada de generación de vectores que se escribe con el siguiente formato:
valorinicial : incremento : valor final
Esto genera un vector cuyo primer valor es el valor “inicial” y los valores siguientes están igualmente espaciados en la cantidad “incremento” hasta llegar al valor “final”. Se puede omitir el incremento y en este caso se considera por defecto el valor 1.
-->A=[1,1;2,2];B=[2,2]';C=[3,3;1,1];
-->A*C // product de matrices ans = 4. 4. 8. 8. 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.
Debido al uso del doble punto en la notación al operador se le conoce con el nombre de generador doble punto y también 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 =
2.10. TIRA DE CARACTERES
Una cadena de caracteres (string) es básicamente una variable que contiene un texto que se coloca entre comillas simples o dobles. Una cadena de caracteres puede ser manipulada a través de comandos específicos. En esta sección veremos algunos que pueden ser de gran utilidad cuando se trabaja con archivos de texto.
Dos o más cadenas de caracteres pueden unirse en sucesión mediante la operación de concatenación, que se realiza directamente empleando el símbolo +:
Las matrices de caracteres se construyen como matrices ordinarias, es decir utilizando corchetes. Un uso muy importante de las matrices de caracteres es la manipulación y creación de funciones. El siguiente ejemplo ilustra la creación de una matriz de caracteres.
La función 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 !
La función part permite extraer caracteres de una tira, para lo cual debemos indicar la posición del los caracteres a extraer. Para extraer una serie de caracteres, la posición se indica como una secuencia de valores.
La función strindex(str1,str2) proporciona la posición que la tira str2 tiene en str1. Una vez que se determina la posición de str2 se puede utilizar la función part para extraerlo de la tira.
La función 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
La función strcat(str1,str2) genera una tira insertando str2 entre los caracteres de str1. Este último tiene que ser un vector de caracteres.
La función string(x) convierte la matriz x en una matriz de caracteres:
Los caracteres números pueden convertirse a datos numéricos mediante la función 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.
Como se observa en el último ejemplo, la función puede usarse para evaluar cualquier operación expresada como caracteres, incluyendo las que tienen variables que guardan números. También pueden ejecutarse sentencias expresadas como tiras de caracteres mediante la función 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 ejecución de un programa cuyas líneas 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 =
CAPITULO 3
PROGRAMACIÓN
3.1. INTRODUCCIÓN
La forma interactiva de la Scilab resulta cómoda cuando se necesitan realizar cálculos que hagan uso de unos pocos comandos. A medida que el cálculo se complica, la lista de comandos se agranda y por ende se facilitan las equivocaciones. Por otra parte, resulta útil que una sucesión 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 líneas de sentencias. En Scilab, la lista de comandos se organiza en un tipo de estructura a las que se les da el nombre de guión (script). Esta se guarda en un archivo de texto con extensión “sci” o “sce”. Por lo general se reserva la extensión “sci” para funciones definidas por el usuariopara aplicaciones específicas. Por ejemplo, un archivo para una función que calcula el promedio de una lista de números puede llamarse “promedio.sci”. Cuando se escriben programas más extensos, donde se involucra el uso de varias sentencias y/o funciones se lo identifica con la extensión “.sce”. Esto puede verse cuando se quiere guardar una función, 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 convención y Scilab puede ejecutar programas (funciones y/o scripts) con cualquier extensión e inclusive sin extensión.
La estructura de un programa puede ser más rica que una simple sucesión de comandos, puesto que estos deberán ser ejecutados con cierta lógica, dependiendo de las necesidades propias de la aplicación. En Scilab existen comandos que permiten tomar decisiones de acuerdo a los resultados obtenidos, o permiten repetir un cálculo con distintos datos iniciales.
Estos enriquecen mucho las posibilidades numéricas de una función y son los llamados comandos de control que serán detallados más adelante.
Además de los comandos de control de flujo, los siguientes comandos son muy útiles para utilizar en la confección y manejos de programas.
; (operador punto y coma) colocado al final de una sentencia evita la impresión en pantalla de la salida del comando.
// permite introducir comentario, líneas 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 versión de Scilab para Linux el directorio de trabajo por defecto es el “home” de la cuenta del usuario que ha iniciado la sesión.
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 función para ejecutarla. Existe una alternativa. Se puede modificar el directorio de
-->pwd ans =
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” acompañado del nombre de la función para correr el programa.
En el menú de File, de la barra de Scilab, también 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 búsqueda de carpetas y archivos.
3.3. GUARDANDO LA SESIÓN 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 línea 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 línea de órdenes mediante las teclas “izquierda ” y “derecha ”.
En las versiones más 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 información sobre los cálculos realizados. Esto es como se ha hecho en estos apuntes, donde los cuadros de ejemplos han sido llenados con información recogida de esa manera. -->exec caida.sci ; -->chdir ('C:\programas-scilab') ans = T -->pwd ans = C:\programas-scilab
Es posible guardar en un archivo todos los comandos y resultados que se van obteniendo en una sesión de trabajo mediante el comando “diary”. Si se ejecuta al comienzo de la sesión:
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 función 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 función que se estuvo ensayando, lista para ser usada.
En File, de la barra de menús de Scilab, también existen opciones para guardar y posteriormente recuperar (cargar) el entorno, es decir la sesión de trabajo, lo que genera un archivo de resguardo con extensión “.sav”. A diferencia del archivo generado por el comando diary este no se puede editar.
3.4. ENTRADA Y SALIDA SENCILLAS
La función input se utiliza para la entrada de datos a través 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” sólo se coloca si se solicita el ingreso de una variable tipo tira de caracteres.
Esta función 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 enun programa.
La función disp imprime el contenido de una variable en la salida estándar (monitor). Su forma general es:
disp(x1,[x2,....,xn])
Donde las xn pueden ser nombres de variables, constantes o tiras de caracteres. Esta función
requiere al menos un argumento. De haber varios se van mostrando uno por línea, 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
3.5. ESTRUCTURA DE UNA FUNCIÓN
Supongamos que queremos evaluar numéricamente el movimiento de una bola que se arroja verticalmente. Si se coloca un eje z, ver figura, la posición queda identificada por la coordenada z y el movimiento está descripto por la función z(t) donde t es el tiempo. Si el eje es positivo hacia arriba, la bola parte del origen, su velocidad inicial vale vo y la aceleración de la gravedad es g. La ecuación del movimiento es:
z = vo*t - 0.5*g*t2
Se supone que aceleración y velocidad son positivas cuando se orientan hacia arriba.
Los comandos para calcular esta expresión en forma interactiva se dan en la pantalla de abajo. En esta, se han dado valores específicos a la velocidad inicial (2 ms-1), gravedad (9,8 ms-2 ), tiempo (10 s). Esto se hace a continuación del primer prompt y en el segundo se introduce la ecuación para calcular la posición. La respuesta es que la bola ha caído 470 m desde donde se inició el movimiento.
Si deseamos calcular z varias veces convendrá colocar este procedimiento dentro de una función. Para ello se debe utilizar un editor de texto donde escribir la función, se puede utilizar cualquier editor, pero Scilab dispone de SciNotes, que se ejecuta desde el menú
Applications. z vo 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.
La estructura que debe tener la función para que Scilab la reconozca es:
function [res1,res2,…] = nombre(par1,par2,....) ………
endfunction
Las líneas de punto indican dónde deben colocarse los comandos de cálculo. El nombre identifica a la función y deberá ser llamada desde la ventana de trabajo con ese nombre; par1, par2, etc. son parámetros que se introducen desde fuera de la función para que sean usados por la misma en el cálculo; res1, res2, etc. son las variables en las cuales la función devuelve los resultadosdel cálculo.
Tomando el caso del ejemplo anterior, se crea la función “caida” que almacena el resultado del cálculo 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 característicos, lo que facilita la lectura del procedimiento. También ayuda mucho a la lectura el utilizar sangrías (código tabulado) entre bloques de comando que pertenecen a un mismo nivel de decisión.Los comandos que comienzan con // son comentarios que Scilab no procesa. Se colocan en un procedimiento para que el que inspecciona la función tenga una explicación adecuada del cálculo.
Para usar la función es necesario que esté guardada en un archivo, por ejemplo “caida.sci”, e indicarle a Scilab donde está para que la encuentre. Si la función está en el directorio de trabajo, esto se realiza mediante el comando “exec” como sigue:
function z = caida(vo,g,t)
// Calculo de la posición de una bola en caída libre // vo = velocidad de la bola // g = aceleración // t = tiempo, // z = distancia resultado z = vo*t - 0.5*g*t^2 endfunction
-->exec(“caida.sci”);
Esto basta hacerlo una vez, por ejemplo cuando se pone en marcha Scilab, para que la función esté disponible para otros cálculos. 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 función 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 líneas del programa aparezcan en la pantalla de trabajo cuando se carga la función, 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 función tiene una sola respuesta. Si hay varias se colocarán separadas por coma como se indica en la definición general de la estructura de una función.
A continuación ejecutaremos la función, para lo cual se la carga con la opción ejecutar desde el directorio File o con la sentencia exec directamente en el prompt de la ventana de trabajo. Luego se llama la función con su nombre asignando el resultado a la variable x. En el llamado hay que introducir el valor de los parámetros. En el ejemplo se asignan los siguientes valores vo: 3 m/s, g: 9.8 m/s2 y t: 2 s. El resultado es –13,6 m. Debe tenerse cuidado de colocar adecuadamente los signos. Obsérvese que se utiliza la variable x para cargar el resultado de la función, mientras que adentro de la misma se utilizó la variable z. Esto se puede hacer porque las variables en la función son locales y no globales, lo que se explicará mas adelante.
Como se indicó anteriormente, bajo el menú File aparece la opción 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 función. Esto es cómodo si no recordamos exactamente la ubicación de la misma.
3.6. VARIABLES GLOBALES Y LOCALES
-->exec(“caida.sci”); -->x=caida(3,9.8,2) x =
Cuando dentro de un programa se utiliza una función, las variables definidas dentro de la función no están disponibles para el programa principal, se dice que son variables localesa la función. Ambos, función y programa principal, se comunican a través de los parámetros de la función, por ellos se ingresa la información externa necesaria, y por medio de las variables de salida de la función, ésta entrega los cálculos realizados.
Existe la posibilidad de utilizar dentro de una función una variable que se declara en el programa principal, declarándola como variable global. Para ello basta definir una variable dada, por ejemplo vari1, mediante el comando global como se indica a continuación:
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 función con el valor que se le asigna sin necesidad de entrarla como un parámetro de la función. Por supuesto, en ese caso cualquier cambio que se le haga al valor de la variable dentro de la función también va a cambiar el valor de la variable en el programa principal.
Como ejemplo, supongamos que se escribe la siguiente función, que se guarda con el nombre pru.sci
En ella se introduce como parámetro 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 función 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 parámetro de la función. Luego se llama la función pru que realiza el producto de b por f. Como se observa, el valor de f es usado directamente por la función, sin que tenga que ser ingresada como un parámetro.
function c=pru(b) c=b*f
Es posible definir una variable local de una función como global. En ese caso quedará disponible para ser utilizada en otra función, para lo cual la misma debe ser definida también como global en la nueva función. Como ejemplo, definamos una función “pru1” cuyo único objetivo es definir la variable z interna a la función. Para que ella esté disponible para otro programa se la define como global. Por otro lado, en el otro programa, “pru2”, también se define z como una variable global y se realiza el producto de esta con el parámetro de entrada b; el resultado se guarda en la variable c.
A continuación, 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 = function z=pru1() global z z=3 endfunction function c=pru2(b) global z c=b*z endfunction
Un caso típico del uso de variables globales es el de constantes que se utilizan a lo largo del cálculo, que conviene definirlas globales para no repetir definiciones en cada función. Fuera de estos casos y para evitar errores de programación, 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 información a través de los parámetros formales.
3.7. OPERADORES RELACIONALES Y LÓGICOS
Acabamos de ver la forma en que se define una función utilizando un ejemplo muy sencillo con un solo comando. En la práctica, las funciones constarán de más de un comando, por lo que con el fin de plantear cálculos de utilidad será necesario disponer de mayor ductilidad en dos aspectos:
a) En poder tomar decisiones en el cálculo teniendo en cuenta los resultados que se están obteniendo. Por ejemplo, el cálculo a realizar podría ser distinto si el valor de una cierta variable es positivo o negativo.
b) En muchos casos es necesario realizar cálculos repetitivos. Por ejemplo, obtener el resultado de un cierto cálculo varias veces con distintos valores de los datos.
La toma de decisiones se hará por comparaciones numéricas o lógicas en el programa. Se necesita disponer de operadores que puedan hacer esas operaciones. Ellos son de dos tipos: operadores relacionales y operadores lógicos.
a) Los operadores relacionales son aquellos capaces de comparar dos cantidades numéricas y decidir cuanto vale una respecto a otra. Los que están disponibles, incluyendo el símbolo que los definen son las siguientes:
< menor <= menor o igual > mayor >= mayor o igual == igual ~= ó <> diferente
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 operación será un valor lógico, verdadero (True) o falso (False).
Estas operaciones pueden combinarse mediante operadores lógicos.
b) Los operadores lógicos compararán valores lógicos derivados de comparaciones relacionales. Los operadores lógicos son:
& y
o ~ no
Por ejemplo, si se tienen 4 variables p, q, r y s se podría escribir: p < q & r > s. Si p es menor que q y r mayor que s esta comparación lógica dará un valor lógico 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
Como todo lenguaje de programación, 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 operación, mientras que los bucles nos permiten realizar varias iteraciones de un mismo proceso. A continuación 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 bifurcación con la que se puede inspeccionar una condición descripta mediante un operador relacional o combinaciones lógicas de los mismos. Su forma más sencilla es:
if condición then ... end
Si la condición tiene un resultado lógico verdadero el programa ejecuta las sentencias indicadas con punteado. De lo contrario, salta directamente a continuación de end.
La condición del if puede ser una condición lógica, del tipo A==B, donde A y B son matrices del mismo tamaño. Para que se considere que la condición 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.
Condición Sentencia 1 Sentencia 2 falso verdadero falso Condición 2 Sentencia 3 Sentencia 2 verdadero Condición 1 falso verdadero Sentencia 1
Otra posibilidad es una bifurcación entre verdadero y falso haciendo uso de la sentencia else. Si la condición es verdadera se ejecutan las sentencias dentro del bloque then, si la condición resulta falsa se ejecutan las sentencias correspondientes al bloque else.
if condición then ... else
……….. end
Otra alternativa son las bifurcaciones anidadas, de acuerdo al resultado de la condición de la sentencia elseif: If condición1 ……… elseif condición 2 ……… else ……… end
Habitualmente estas condiciones forman parte de una función, pero también se pueden usar expresadas en un solo renglón 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
condición
Sentencias
falso
El comando for se utiliza si se quiere realizar una acción en forma repetitiva, teniendo en cuenta una variable que se incrementa en cada paso y que puede ser utilizada para cambiar algún aspecto del cálculo 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 cálculo 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 también se ejecuta una acción repetitiva. Se fija la condición, y siempre que ésta se cumpla, el bucle se repite. Al dejar de cumplirse la condición impuesta se termina el bucle y se continúa con la instrucción siguiente.
for x= -3:3; if x=<0 then; fx=x^3 else; fx= x^2 end; end;
while condición ... end
Se diferencia del ciclo for en que necesariamente la acción dentro del bucle debe modificar la(s) variable(s) de la condición. Esta condición debe alcanzar el valor lógico false, en algún momento de la ejecución, porque de lo contrario se entraría en un bucle sin salida que repetiría infinitamente las instrucciones dentro del bloque, provocando que el programa no continúe. 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
Al principio se evalúa la variable de control cuyo resultado debe ser un escalar o una cadena de caracteres. La condición selecciona un resultado entre varios valores de variable, estos son valor1,valor2, etc. Si variable no toma alguno de los valores dados, entonces se continúa por
else ejecutando el último conjunto de comandos.
En la primera línea del ejemplo se genera un número en forma aleatoria y se toma su parte entera. Si el número es cero se muestra el valor, si es uno también se muestra, en caso contrario se muestra un cartel.
3.9. DEFINICIÓN DE FUNCIONES EN LÍNEA
Como se vio anteriormente, el usuario puede definir sus propias funciones en un archivo de texto, los guarda con extensión “sci” y los carga en Scilab mediante el comando getf o exec cuando quiere utilizarlos.
Existe una forma de hacer definición de funciones en línea (on-line) en la pantalla de trabajo y en una sola instrucción a través de la sentencia deff. Estas son muy útiles para programas que sólo se utilizan una vez o para probar partes de funciones en la etapa de diseño del programa. La función no queda almacenada una vez que se termina la sesión de trabajo.
La descripción 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 función 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
instrucciones constituyen la definición de la función y deben incluir la asignación de la variable de salida.
El comando deff puede ser utilizado dentro de una función y la nueva función puede ser una entrada o salida de cualquier otra función. A continuación 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
CAPÍTULO 4
GRÁFICOS EN SCILAB
4.1. INTRODUCCIÓN
Scilab dispone de salidas gráficas 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 gráficos de Scilab se pueden:
1) Mostrar funciones en dos y tres dimensiones, con gran variación en la forma en que se ingresan los datos y una buena disponibilidad de recursos técnicos 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 irán presentando en forma ordenada desde los recursos más sencillos y de uso común hasta llegar a las representaciones más elaboradas.
4.2. LA VENTANA GRÁFICA
Scilab abre una ventana distinta de la ventana de trabajo para dibujar los gráficos solicitados. Pueden abrirse varias ventanas gráficas a la vez y están identificadas con un número (0,1,2,3....). En esta ventana gráfica están disponibles los siguientes menús:
File
Herramientas
Editar
? (ayuda) Dentro del menú File encontramos las opciones:
Load: permite leer un gráfico grabado en formato SCILAB.
Save: permite grabar el gráfico en formato SCILAB , con la extensión . scg ( por defecto). Export: permite grabar el gráfico en formatos como Postscript, GIF, BMP, etc.
Copy to clipboard: copia el gráfico al portapapeles para que puede pegarse en otros
documentos.
Print: imprime el gráfico activo. Close: cierra la ventana gráfica.
El menú Herramientas contiene comandos para poner o quitar la barra de herramientas, agrandar o disminuir zonas de la imagen y rotar los gráficos 3D. El menú Editar contiene los comandos propios de un editor gráfico para cambiar las propiedades de la figura (forma de ejes, letras color, etc)
Cuando ejecutamos una instrucción para generar gráficos, como plot que se explicará a continuación, si ninguna ventana gráfica está activada Scilab coloca el dibujo en la ventana
número 0. Si hacemos otro gráfico éste se ubicará encima del primero. Por lo tanto es necesario borrar el contenido de la ventana gráfica, lo que puede hacerse de dos maneras:
Desde el menú Editar ( ítem limpiar figura )
Desde la ventana de trabajo de Scilab con la instrucción clf() o xbasc()
Podemos trabajar muy fácilmente con varias ventanas gráficas, con la ayuda de las instrucciones:
xset("window",num) Convierte la ventana número 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 gráfica, Scilab crea una.
xbasc(num)
Borra el contenido de la ventana gráfica número num Si num se omite, Scilab borra el contenido de la ventana activa.
xdel(num) Elimina la ventana gráfica número num
Si num es omitido, Scilab elimina la ventana activa.
4.3. REPRESENTACIÓN EN 2D
La forma más simple para trazar la gráfica de una función de R x R es mediante la instrucción
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) uniéndolos por defecto mediante líneas negras o de acuerdo a otro estilo que se haya especificado previamente. La calidad de la representación dependerá del número de puntos x(i),y(i) que se grafiquen .
El llamado general de la función es:
Con plot también se puede graficar un conjunto de curvas, es decir hacer gráficos múltiples.
plot(x1,y1,<lasp1>,x2,y2,<lasp2>,...xN,yN,<laspN>,<globprop1>, <globprop2>,..<globpropN>)
x debe ser una matriz o un vector de números reales. Si se omite se asume un vector de 1:n
donde n es el número de puntos de la variable y.
y debe ser una matriz o vector de reales, pero también puede ser una función definida.
<lasp> es un argumento opcional que especifica la manera en que se dibujan las líneas. Debe
ser una tira de caracteres y determina el estilo, las marcas y el color de las líneas 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 tamaño.
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 dimensión 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 sólo x o y es una matriz, el vector se dibuja versus las filas o las columnas de la matriz. La elección 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.
y también puede ser una función, en este caso se debe proporcionar x (como un vector o
matriz) y el cálculo y(x) se hace implícitamente.
4.3.1 LineSpec
Se utiliza para cambiar rápidamente la apariencia de las líneas de un dibujo. Debe ser una tira de caracteres que hace referencias al del estilo de la línea, el marcador y el color. Estas referencias deben ser especificadas sin ambigüedades, el orden no es importante. Por ejemplo, para una línea 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))