Subido por José María Cortina Seara

Introducción a Scilab esp

Anuncio
Machine Translated by Google
www.scilab.org
INTRODUCCIÓN A SCILAB
Consorcio sCilab
Domaine de Voluceau - Rocquencourt - BP 105 - 78153 Le Chesnay Cedex Francia
Machine Translated by Google
!
#
"
Machine Translated by Google
noviembre de 2010
Resumen
En este documento, hacemos una descripción general de las características de Scilab para que podamos
familiarizarse con este entorno. El objetivo es presentar el núcleo de habilidades
necesario para empezar con Scilab. En la primera parte, presentamos cómo obtener y
instalar este software en nuestro ordenador. También presentamos cómo obtener ayuda.
con la documentación en línea proporcionada y también gracias a los recursos web y
foros En las secciones restantes, presentamos el lenguaje Scilab, especialmente
sus características de programación estructurada. Presentamos una característica importante de
Scilab, que es el manejo de matrices reales y una visión general del álgebra lineal
biblioteca. La definición de funciones y la gestión elemental de entrada.
y se presentan las variables de salida. Presentamos las características gráficas de Scilab y
mostrar cómo crear un gráfico 2D, cómo configurar el título y la leyenda y
cómo exportar ese gráfico a un formato vectorial o de mapa de bits.
Contenido
5
1 Descripción
general 1.1 Introducción . . . . . . . .
. . . . . . ...
. . ...
. . . . . . ...
.5
1.2 Descripción general de Scilab . . . .
. . ...
. . ...
. . . . . . ...
.5
. . . . . . ...
. . . . . . ...
.6
1.3.1 Instalación de Scilab en Windows . .
. . ...
. . . . . . ...
.7
1.3.2 Instalación de Scilab en Linux . . .
. . ...
. . . . . . ...
.7
. . ...
. . . . . . ...
.8
. . . . . . ...
.8
. . . . . . ...
.9
...
1.3 Cómo obtener e instalar Scilab .
. ...
1.3.3 Instalación de Scilab en Mac OS . .
1.4 Cómo obtener ayuda . . . . . . . . . . . . . . . . . . . .
1.5 Listas de correo, wiki e informes de errores . . . . . . . . . .
1.6 Obtener ayuda de demostraciones y macros de Scilab .
. ...
. . ...
. . . . . . ...
1.7 Ejercicios .
...
. . ...
. ...
. . . . . 10
. . ...
. 11
11
2 Primeros pasos 2.1 La
consola . . .
. . ...
. . . . . . ...
. . ...
. ...
. . ...
. 11
2.2 El editor .
...
. . ...
. . . . . . ...
. . ...
. ...
. . ...
. 12
2.3 Atraque .
. ...
. . ...
. . . . . . ...
. . ...
. ...
. . ...
. 14
. . . . . . ...
. . ...
2.4 Uso de exec . . .
. . ...
2.5 Procesamiento por lotes . . . . .
. ...
. . ...
2.6 Ejercicios .
. ...
. . ...
. . ...
. dieciséis
. ...
. . ...
. . . . . . ...
. 17
. . . . . . ...
. . ...
. ...
. 19
1
. . ...
Machine Translated by Google
3 Elementos básicos del lenguaje 3.1 Creación
. . ...
de variables reales . .
3.2 Nombres de variables . . . . . .
20
. . . . . . ...
. . . . . . ...
. . ...
. . . . . . ...
3.3 Comentarios y líneas de continuación .
3.4 Funciones matemáticas elementales .
3.5 Variables matemáticas predefinidas .
. . . . . . ...
. 20
. ...
. 21
. . ...
. . . . . . ...
. 22
. . . . . ...
. . ...
. ...
. 22
. . . . . ...
. . ...
. ...
. 22
. ...
. . ...
. . . . . . ...
. . ...
. ...
. . ...
. 23
3.7 Números complejos .
3.8 Números enteros . . . . .
. ...
. . . . . . ...
. . ...
. ...
. . ...
. 24
. . ...
. . . . . . ...
. . ...
. ...
3.6 Booleanos .
3.8.1 Resumen de números enteros . . . .
3.8.2 Conversiones entre enteros .
. . ...
. 25
. . . . . . ...
. . ...
. ...
. 25
. . . . ...
. . ...
. ...
. 26
. . . . . 27
3.8.3 Números enteros circulares y problemas de portabilidad . . . . . . . .
. . ...
. . . . . . ...
. . . . . . ...
. 28
3.9 Enteros de punto flotante . .
. ...
. . . . . . ...
. . ...
. ...
. . ...
. 29
. . ...
. . . . . . ...
. . ...
. ...
. . ...
. 29
3.12 Tipo dinámico de variables .
. ...
. . ...
3.13 Ejercicios .
. ...
. 30
. . . . . . ...
. . . . . . ...
. 30
3.10 La variable ans .
3.11 Cuerdas . .
. ...
. ...
. . . . . . ...
. . ...
. . ...
4 Matrices 4.1
Resumen .
31
...
. . ...
. . . . . . ...
. ...
4.3 La matriz vacía [] . . .
4.4 Matrices de consulta .
. . ...
. . ...
. . . . . . ...
4.2 Crear una matriz de valores reales . . .
. . ...
. . ...
. ...
. . . . . . ...
. . ...
. . . . . . ...
. . ...
. . . . . ...
4.5 Acceso a los elementos de una matriz .
. . . . . . ...
. . ...
4.6 El operador de dos puntos ”:” . .
. 31
. . . . . 32
. . ...
. 33
. . . . . . ...
. 33
. . ...
. ...
. 34
. . . . . . ...
. 35
. . . . . . ...
. . ...
. ...
. . ...
. 38
4.8 Las matrices son dinámicas . . .
. . ...
. ...
. . ...
. . . . . . ...
. 39
4.9 El operador dólar ”$” . .
. . . . . . ...
. . ...
. . . . . . ...
. 39
4.10 Operaciones de bajo nivel . . .
. . ...
. . . . . . ...
. . . . . . ...
. 40
4.11 Operaciones elementales . .
. . ...
. ...
. . . . . . ...
. 41
4.7 La matriz del ojo .
. . ...
. . ...
4.12 Transpuesta conjugada y transpuesta no conjugada .
...
. . . . . . ...
4.13 Multiplicación de dos vectores .
. . ...
. . . . . 42
. . ...
. ...
. 43
4.14 Comparación de dos matrices reales . . . .
. . . . . . ...
. . ...
. ...
. 44
4.15 Problemas con los números enteros de punto flotante . . . . . . . . . .
. . ...
. ...
. 45
. 46
. . . . . . ...
. . ...
. ...
4.17 Características del álgebra lineal de alto nivel . . . . . . . . .
. ...
. . ...
. . . . . . ...
. . ...
4.18 Ejercicios .
. . ...
. . . . . 48
4.16 Más sobre funciones elementales . . .
5 Bucles y bifurcaciones 5.1 La
sentencia if .
. 48
49
. ...
. . . . . . ...
. . . . . . ...
. . ...
. ...
. . ...
. 50
...
. . . . . . ...
. . ...
. ...
. . ...
. 52
5.2 La instrucción select . .
5.3 La sentencia for .
. . . . . . ...
5.4 La sentencia while . . .
. . . . . . ...
5.5 Las sentencias break y continue . . .
2
. . ...
. ...
. . ...
. 49
. . ...
. ...
. . ...
. 53
. . ...
. ...
. . ...
. 54
Machine Translated by Google
6 Funciones 6.1
55
. . ...
. . . . . . ...
. . ...
. . . . . . ...
. 55
...
. . . . . . ...
. . ...
. . . . . . ...
. 57
6.3 Bibliotecas de funciones . . . . .
. . . . . . ...
Resumen .
...
6.2 Definición de una función .
. . ...
. . . . . . ...
. 59
6.4 Gestión de argumentos de salida .
6.5 Niveles en la pila de llamadas . .
...
. . . . . . ...
. . . . . . ...
. 61
. . ...
. . . . . . ...
. . . . . . ...
. 62
6.6 La declaración de devolución . .
. . . . . . ...
. ...
. . ...
. 63
. . . . . . ...
. . ...
. 64
. . . . . . ...
. 66
. . ...
6.7 Funciones de depuración con pausa .
. . ...
66
7 Trazado 7.1
Descripción general . . . .
. . ...
. ...
. . ...
. . . . . . ...
. . ...
. . . . . . ...
. . ...
. ...
. . ...
. 66
7.3 Gráficos de contorno . . . . . . .
. . ...
. ...
. . ...
. . . . . . ...
. 68
7.4 Títulos, ejes y leyendas .
. ...
7.5 Exportación . .
. . ...
. ...
. . ...
. . . . . . ...
. 71
. . . . . . ...
. . ...
. ...
. 73
7.2 Gráfico 2D .
. . ...
. . ...
8 Notas y referencias
74
9 Agradecimientos
75
10 Respuestas a los ejercicios 10.1
76
. . ...
. . . . . . ...
. . . . . . ...
. 76
10.2 Respuestas para la sección 2.6 . . . . . . .
. . . . . . ...
. . . . . . ...
. 76
10.3 Respuestas para la sección 3.13 . . . . . .
. . . . . . ...
. . . . . . ...
. 79
10.4 Respuestas para la sección 4.18 . . . . . .
. . . . . . ...
. . . . . . ...
. 82
Respuestas al apartado 1.7 . .
Referencias
83
Índice
84
3
Machine Translated by Google
Copyright c 2008-2010 - Consorcio Scilab - Digiteo - Michael Baudin
Este archivo debe usarse bajo los términos de Creative Commons Attribution
Licencia ShareAlike 3.0 Unported:
http://creativecommons.org/licenses/by-sa/3.0
4
Machine Translated by Google
1. Información general
En esta sección, presentamos una descripción general de Scilab. La primera subsección presenta
el proyecto de código abierto asociado con la creación de este documento. Luego presentamos el
software, la licencia y los aspectos científicos de Scilab. En la tercera subsección, describimos los
métodos para descargar e instalar Scilab en los sistemas operativos Windows, GNU/Linux y Mac.
En las subsecciones restantes, describimos varias fuentes de información necesarias cuando
tenemos que obtener ayuda de Scilab o de otros usuarios.
Describimos las páginas de ayuda integradas y analizamos las listas de correo y wiki que están
disponibles en línea. Finalmente, nos tomamos un momento para ver las demostraciones que se
proporcionan con Scilab.
1.1 Introducción
Este documento es un proyecto de código abierto. Las fuentes LATEX están disponibles en Scilab
Forge:
http://forge.scilab.org/index.php/p/docintrotoscilab/
Las fuentes de LATEX se proporcionan bajo los términos de la licencia Creative Commons
Attribution ShareAlike 3.0 Unported:
http://creativecommons.org/licenses/by-sa/3.0
Los scripts de Scilab se proporcionan en Forge, dentro del proyecto, en el subdirectorio scripts.
Los scripts están disponibles bajo la licencia CeCiLL:
http://www.cecill.info/licencias/Licence_CeCILL_V2-en.txt
1.2 Descripción general de Scilab
Scilab es un lenguaje de programación asociado con una rica colección de algoritmos numéricos
que cubren muchos aspectos de los problemas de computación científica.
Desde el punto de vista del software, Scilab es un lenguaje interpretado. Esto generalmente
permite obtener procesos de desarrollo más rápidos, porque el usuario accede directamente a un
lenguaje de alto nivel, con un rico conjunto de funciones proporcionadas por la biblioteca. El
lenguaje Scilab está destinado a ampliarse para que los tipos de datos definidos por el usuario
puedan definirse con operaciones posiblemente sobrecargadas. Los usuarios de Scilab pueden
desarrollar sus propios módulos para que puedan resolver sus problemas particulares. El lenguaje
Scilab permite compilar y vincular dinámicamente otros lenguajes como Fortran y C: de esta
manera, las bibliotecas externas se pueden usar como si fueran parte de las funciones integradas de Scilab.
Scilab también interactúa con LabVIEW, una plataforma y entorno de desarrollo para un lenguaje
de programación visual de National Instruments.
Desde el punto de vista de la licencia, Scilab es un software libre en el sentido de que el
usuario no paga por él y Scilab es un software de código abierto, proporcionado bajo la licencia
Cecill [2]. El software se distribuye con código fuente, para que el usuario tenga acceso a los
aspectos más internos de Scilab. La mayoría de las veces, el usuario descarga e instala una
versión binaria de Scilab, ya que el consorcio Scilab proporciona Windows,
5
Machine Translated by Google
Versiones ejecutables de Linux y Mac OS. La ayuda en línea se proporciona en muchos idiomas locales.
Desde el punto de vista científico, Scilab viene con muchas características. Al principio de Scilab, las
funciones se centraban en el álgebra lineal. Pero, rápidamente, la cantidad de funciones se extendió para
cubrir muchas áreas de la computación científica. La siguiente es una breve lista de sus capacidades:
• Álgebra lineal, matrices dispersas,
• Polinomios y funciones racionales,
• Interpolación, aproximación,
• Optimización lineal, cuadrática y no lineal,
• Solucionador de ecuaciones diferenciales ordinarias y ecuaciones algebraicas diferenciales
solucionador,
• Control clásico y robusto, optimización de desigualdad de matriz lineal,
• Optimización diferenciable y no diferenciable,
• Procesamiento de la señal,
• Estadísticas.
Scilab proporciona muchas funciones gráficas, incluido un conjunto de funciones de trazado, que
permiten crear gráficos en 2D y 3D, así como interfaces de usuario. El entorno Xcos proporciona un
modelador y simulador de sistemas dinámicos híbridos.
1.3 Cómo obtener e instalar Scilab
Sea cual sea su plataforma (es decir, Windows, Linux o Mac), los archivos binarios de Scilab se pueden
descargar directamente desde la página de inicio de Scilab
http://www.scilab.org
o desde el área de Descargas
http://www.scilab.org/download
Los archivos binarios de Scilab se proporcionan para plataformas de 32 y 64 bits para que coincidan
con la máquina de instalación de destino.
Scilab también se puede descargar en forma de fuente, de modo que pueda compilar Scilab usted
mismo y producir su propio binario. Compilar Scilab y generar un binario es especialmente interesante
cuando queremos comprender o depurar una función existente, o cuando queremos agregar una nueva
función. Para compilar Scilab, se necesitan algunos archivos binarios de requisitos previos, que también
se proporcionan en el Centro de descargas. Además, se requiere un compilador Fortran y C. La compilación
de Scilab es un proceso que no se detallará más en este documento, porque este capítulo está dedicado
principalmente al comportamiento externo de Scilab.
6
Machine Translated by Google
Figura 1: consola Scilab en Windows.
1.3.1 Instalación de Scilab en Windows
Scilab se distribuye como un binario de Windows y se proporciona un instalador para que la
instalación sea realmente fácil. La consola Scilab se presenta en la figura 1. Se pueden hacer
varios comentarios sobre este proceso de instalación.
En Windows, si su máquina está basada en un procesador Intel, Intel Math Kernel Library
(MKL) [7] permite que Scilab realice cálculos numéricos más rápidos.
1.3.2 Instalación de Scilab en Linux
En Linux, las versiones binarias están disponibles en el sitio web de Scilab como archivos .tar.gz.
No es necesario un programa de instalación con Scilab en Linux: simplemente descomprima el
archivo en un directorio de destino. Una vez hecho esto, el archivo binario se encuentra en
<ruta>/scilab 5.xx/bin/scilab. Cuando se ejecuta este script, la consola aparece inmediatamente
y se ve exactamente igual que en Windows.
Tenga en cuenta que Scilab también se distribuye con el sistema de empaquetado disponible
con las distribuciones de Linux basadas en Debian (por ejemplo, Ubuntu). Este método de
instalación es extremadamente simple y eficiente. Sin embargo, tiene un pequeño inconveniente:
la versión de Scilab empaquetada para su distribución de Linux puede no estar actualizada.
Esto se debe a que existe cierto retraso (de varias semanas a varios meses) entre la disponibilidad
de una versión actualizada de Scilab en Linux y su lanzamiento en las distribuciones de Linux.
Por ahora, Scilab viene en Linux con una biblioteca de álgebra lineal binaria que garantiza
la portabilidad. Bajo Linux, Scilab no viene con una versión binaria de ATLAS [1], por lo que el
álgebra lineal es un poco más lento para esa plataforma, en comparación con Windows.
7
Machine Translated by Google
1.3.3 Instalación de Scilab en Mac OS
En Mac OS, las versiones binarias están disponibles en el sitio web de Scilab como un archivo .dmg.
Este binario funciona para las versiones de Mac OS a partir de la versión 10.5. Utiliza el instalador
de Mac OS, que proporciona un proceso de instalación clásico. Scilab no está disponible en los
sistemas Power PC.
Scilab versión 5.2 para Mac OS viene con una biblioteca Tcl/Tk que está deshabilitada por
razones técnicas. Como consecuencia, existen algunas pequeñas limitaciones en el uso de Scilab
en esta plataforma. Por ejemplo, la interfaz Scilab/Tcl (TclSci), el editor gráfico y el editor de variables
no funcionan. Estas funciones se reescribirán en Java en futuras versiones de Scilab y estas
limitaciones desaparecerán.
Aún así, usar Scilab en un sistema Mac OS es fácil y utiliza los accesos directos que son
familiares para los usuarios de esta plataforma. Por ejemplo, la consola y el editor usan la tecla Cmd
(tecla Apple) que se encuentra en los teclados Mac. Además, no hay clic derecho en esta plataforma.
En cambio, Scilab es sensible al evento de teclado Control-Click.
Por ahora, Scilab viene en Mac OS con una biblioteca de álgebra lineal que está optimizada y
garantiza la portabilidad. Bajo Mac OS, Scilab no viene con una versión binaria de ATLAS [1], por lo
que el álgebra lineal es un poco más lento para esa plataforma.
1.4 Cómo obtener ayuda
La forma más sencilla de integrar la ayuda en línea en Scilab es utilizar la función de ayuda. La
Figura 2 presenta la ventana de ayuda de Scilab. Para usar esta función, simplemente escriba
"ayuda" en la consola y presione la tecla <Enter>, como en la siguiente sesión.
ayuda
Suponga que desea ayuda sobre la función optim. Puede intentar navegar por la ayuda
integrada, encontrar la sección de optimización y luego hacer clic en el elemento de optimización
para mostrar su ayuda.
Otra posibilidad es utilizar la ayuda de la función, seguida del nombre de la función, para la cual
se requiere ayuda, como en la siguiente sesión.
ayudar a optimizar
Scilab abre automáticamente la entrada asociada en la ayuda.
También podemos utilizar la ayuda proporcionada en el sitio web de Scilab
http://www.scilab.org/product/man
Esta página siempre contiene la ayuda para la versión actualizada de Scilab. Al usar la función
de "búsqueda" de mi navegador web, la mayoría de las veces puedo encontrar rápidamente la
página de ayuda que necesito. Con ese método, puedo ver las páginas de ayuda para varios
comandos de Scilab al mismo tiempo (por ejemplo, los comandos derivative y optim, de modo que
pueda proporcionar la función de costo adecuada para la optimización con optim calculando
derivadas con derivada).
En la página de inicio de Scilab se presenta una lista de libros comerciales, libros gratuitos,
tutoriales en línea y artículos:
http://www.scilab.org/publicaciones
8
Machine Translated by Google
Figura 2: ventana de ayuda de Scilab.
1.5 Listas de correo, wiki e informes de errores
La lista de correo [email protected] está diseñada para todas las preguntas sobre el uso de
Scilab. Para suscribirse a esta lista de correo, envíe un correo electrónico a [email protected]. La lista de correo [email protected] se enfoca en el desarrollo de
Scilab, ya sea el desarrollo del núcleo de Scilab o de módulos complicados que interactúan
profundamente con el núcleo de Scilab. Para suscribirse a esta lista de correo, envíe un correo electrónico a dev-subscribe
Estas listas de correo están archivadas en:
http://dir.gmane.org/gmane.comp.mathematics.scilab.user
y:
http://dir.gmane.org/gmane.comp.mathematics.scilab.devel
Por lo tanto, antes de hacer una pregunta, los usuarios deben considerar buscar en el
archivo si la misma pregunta o tema ya ha sido respondido.
Una pregunta publicada en la lista de correo puede estar relacionada con un punto técnico muy
específico, por lo que requiere una respuesta que no es lo suficientemente general como para ser
pública. La dirección [email protected] está diseñada para este propósito. Los desarrolladores
del equipo de Scilab brindan respuestas precisas a través de este canal de comunicación.
El wiki de Scilab es una herramienta pública para leer y publicar información general
sobre Scilab:
http://wiki.scilab.org
9
Machine Translated by Google
Figura 3: Ventana de demostraciones de Scilab.
Lo utilizan tanto los usuarios como los desarrolladores de Scilab para publicar información sobre Scilab.
Desde el punto de vista de un desarrollador, contiene instrucciones paso a paso para compilar Scilab
desde las fuentes, dependencias de varias versiones de Scilab, instrucciones para usar el repositorio
de código fuente de Scilab, etc.
El Scilab Bugzilla http://bugzilla.scilab.org permite enviar un informe cada vez que encontramos un
nuevo error. Puede suceder que este error ya haya sido descubierto por otra persona. Esta es la razón
por la que se recomienda buscar en la base de datos de errores los problemas relacionados existentes
antes de informar de un nuevo error. Si el error aún no se informa, es muy bueno informarlo, junto con
un script de prueba. Este script de prueba debe ser lo más simple posible, lo que permite reproducir el
problema e identificar el origen del problema.
Una forma eficaz de obtener información actualizada es utilizar fuentes RSS. el rss
feed asociado con el sitio web de Scilab es
http://www.scilab.org/en/rss_en.xml
Este canal emite regularmente comunicados de prensa y anuncios generales.
1.6 Obtener ayuda de demostraciones y macros de Scilab
El consorcio Scilab mantiene una colección de scripts de demostración, que están disponibles desde la
consola, en el menú ? > Demostraciones de Scilab. La figura 3 presenta la ventana de demostración.
Algunas demostraciones son gráficas, mientras que otras son interactivas, lo que significa que el usuario
debe presionar la tecla <Enter> para pasar al siguiente paso de la demostración.
Los scripts de demostración asociados se encuentran en el directorio de Scilab, dentro de cada
módulo. Por ejemplo, la demostración asociada al módulo de optimización se encuentra en el archivo
<ruta>\scilab-5.2.0\modules\optimization\demos\datafit\datafit.dem.sce
Por supuesto, la ruta exacta del archivo depende de su instalación particular y su sistema operativo.
10
Machine Translated by Google
Analizar el contenido de estos archivos de demostración suele ser una solución eficiente
para resolver problemas comunes y comprender características particulares.
Otro método para encontrar ayuda es analizar el código fuente de Scilab (¡Scilab es de hecho
de código abierto!). Por ejemplo, la función derivada se encuentra en
<ruta>\scilab-5.2.0\modules\optimization\macros\derivative.sci
La mayoría de las veces, las macros de Scilab están muy bien escritas, cuidando todas las
combinaciones posibles de argumentos de entrada y salida y muchos valores posibles de los
argumentos de entrada. A menudo, los problemas numéricos difíciles se resuelven en estos scripts
para que proporcionen una profunda fuente de inspiración para desarrollar sus propios scripts.
1.7 Ejercicios
Ejercicio 1.1 (Instalación de Scilab) Instale la versión actual de Scilab en su sistema: en el momento en que se escribe
este documento, esta es Scilab v5.2. Es instructivo instalar una versión anterior de Scilab para comparar el
comportamiento actual con el anterior. Instale Scilab 4.1.2 y vea las diferencias.
Ejercicio 1.2 (Ayuda en línea: derivada) La función derivada permite calcular la derivada numérica de una función. El
propósito de este ejercicio es encontrar la página de ayuda correspondiente, por varios medios. En la ayuda en línea,
busque la entrada correspondiente a la función derivada.
Busque la entrada correspondiente en la ayuda en línea. Utilice la consola para encontrar la ayuda.
Ejercicio 1.3 (Hacer una pregunta en el foro) Probablemente ya tenga una o más preguntas. Publique su pregunta en
la lista de correo de usuarios [email protected].
2 Primeros pasos
En esta sección, hacemos nuestros primeros pasos con Scilab y presentamos algunas tareas
simples que podemos realizar con el intérprete.
Hay varias formas de usar Scilab y los siguientes párrafos presentan tres métodos:
• usar la consola en el modo interactivo,
• usar la función exec contra un archivo,
• utilizando el procesamiento por lotes.
2.1 La consola
La primera forma es utilizar Scilab de forma interactiva, escribiendo comandos en la consola,
analizando los resultados y continuando este proceso hasta calcular el resultado final.
Este documento está diseñado para que los ejemplos de Scilab que se imprimen aquí se puedan
copiar en la consola. El objetivo es que el lector pueda experimentar por sí mismo el comportamiento
de Scilab. De hecho, esta es una buena manera de comprender el comportamiento del programa
y, la mayoría de las veces, permite una forma rápida y sencilla de realizar el cálculo deseado.
En el siguiente ejemplo, la función disp se usa en el modo interactivo para
imprima la cadena "¡Hola mundo!".
11
Machine Translated by Google
Figura 4: La finalización en la consola.
-->s="¡Hola mundo!"
s=
Hola Mundo !
--> mostrar ( s)
Hola Mundo !
En la sesión anterior, no escribimos los caracteres ”-->”, que es el indicador y que Scilab administra.
Solo escribimos la instrucción s="Hello World!" con nuestro teclado y luego presione la tecla <Enter>. La
respuesta de Scilab es s = y ¡Hola mundo!. Luego escribimos disp(s) y la respuesta de Scilab es Hello
World!.
Cuando editamos un comando, podemos usar el teclado, como con un editor normal.
Podemos usar las flechas izquierda ÿ y derecha ÿ para mover el cursor en la línea y usar las teclas
<Backspace> y <Suppr> para corregir errores en el texto.
Para obtener acceso a los comandos ejecutados anteriormente, use la tecla de flecha hacia arriba ÿ.
Esto permite navegar por los comandos anteriores utilizando las teclas de flecha arriba ÿ y abajo ÿ.
La tecla <Tab> proporciona una función de finalización muy conveniente. En el siguiente
session, escribimos la declaración disp en la consola.
--> disipar
Luego podemos escribir en la tecla <Tab>, que hace que aparezca una lista en la consola, como se
presenta en la figura 4. Scilab muestra un cuadro de lista, donde los elementos corresponden a todas
las funciones que comienzan con las letras "disp". Luego podemos usar las teclas de flecha arriba y
abajo para seleccionar la función que queremos.
El autocompletado funciona con funciones, variables, archivos y controladores gráficos.
y hace que el desarrollo de scripts sea más fácil y rápido.
2.2 El redactor
Scilab versión 5.2 proporciona un nuevo editor que permite editar scripts fácilmente. La figura 5 presenta
al editor durante la edición del anterior "¡Hola mundo!" ejemplo.
12
Machine Translated by Google
Figura 5: El editor.
Se puede acceder al editor desde el menú de la consola, en Aplicaciones
> menú Editor, o desde la consola, como se presenta en la siguiente sesión.
--> redactor ()
Este editor permite administrar varios archivos al mismo tiempo, como se presenta en
figura 5, donde editamos cinco archivos al mismo tiempo.
Hay muchas características que vale la pena mencionar en este editor. lo mas
Las funciones más utilizadas se encuentran en el menú Ejecutar.
• Cargar en Scilab permite ejecutar las declaraciones en el archivo actual, como si hiciéramos un
copiar y pegar. Esto implica que las declaraciones que no terminan con el punto y coma ”;”
character producirá una salida en la consola.
• Evaluate Selection permite ejecutar las sentencias que se encuentran actualmente
leccionado
• Execute File Into Scilab permite ejecutar el archivo, como si usáramos la función exec. Los
resultados que se producen en la consola son únicamente aquellos que están asociados a
funciones de impresión, como disp por ejemplo.
También podemos seleccionar algunas líneas en el script, hacer clic con el botón derecho (o Cmd+Click
en Mac) y obtener el menú contextual que se presenta en la figura 6.
El menú Editar proporciona una función muy interesante, comúnmente conocida como "impresora
bonita" en la mayoría de los idiomas. Esta es la función Editar > Sangría correcta, que
13
Machine Translated by Google
Figura 6: Menú contextual en el editor.
Sangría automáticamente la selección actual. Esta característica es extremadamente conveniente,
ya que permite formatear algoritmos, de modo que if, for y otros bloques estructurados sean fáciles
de analizar.
El editor proporciona un acceso rápido a la ayuda en línea. De hecho, supongamos que hemos
seleccionado la declaración disp, como se presenta en la figura 7. Cuando hacemos clic con el
botón derecho en el editor, obtenemos el menú contextual, donde la entrada Ayuda sobre ”disp”
permite abrir la página de ayuda asociada con la disp. función.
2.3 Acoplamiento
Los gráficos de la versión 5 de Scilab se han actualizado, por lo que muchos componentes ahora
se basan en Java. Esto tiene una serie de ventajas, incluida la posibilidad de administrar las
ventanas de acoplamiento.
El sistema de acoplamiento utiliza Flexdock [10], un proyecto de código abierto que proporciona
un marco de acoplamiento Swing. Supongamos que tenemos tanto la consola como el editor
abiertos en nuestro entorno, como se muestra en la figura 8. Puede ser molesto manejar dos
ventanas, porque una puede ocultar a la otra, por lo que tenemos que moverlas constantemente
para que realmente funcione. mira qué pasa.
El sistema Flexdock permite arrastrar y soltar el editor en la consola, de modo que finalmente
tenemos una sola ventana, con varias subventanas. Todas las ventanas de Scilab son acoplables,
incluida la consola, el editor, la ayuda y las ventanas de trazado. En la figura 9, presentamos una
situación en la que hemos acoplado cuatro ventanas a la ventana de la consola.
Para acoplar una ventana a otra ventana, debemos arrastrar y soltar el
14
Machine Translated by Google
Figura 7: Ayuda contextual en el editor.
Arrastra desde
aquí y suéltalo
en la consola
Figura 8: La barra de título en la ventana de origen. Para acoplar el editor a la consola,
arrastre y suelte la barra de título del editor en la consola.
15
Machine Translated by Google
Haga clic aquí
para desacoplar
Click aquí para
cerrar el muelle
Figura 9: Acciones en la barra de título de la ventana acoplable. La flecha redonda en la barra de título de la ventana permite
desacoplar la ventana. La cruz permite cerrar la ventana.
ventana de origen en la ventana de destino. Para hacer esto, hacemos clic con el botón izquierdo en la barra de título de la
ventana acoplable, como se indica en la figura 8. Antes de soltar el clic, pasemos el mouse sobre la ventana de destino y
notemos que se muestra una ventana rodeada de líneas punteadas. Esta ventana "fantasma" indica la ubicación de la futura
ventana acoplada. Podemos elegir esta ubicación, que puede estar en la parte superior, inferior, izquierda o derecha de la
ventana de destino. Una vez que hemos elegido la ubicación de destino, soltamos el clic, lo que finalmente mueve la ventana de
origen a la ventana de destino, como en la figura 9.
También podemos liberar la ventana de origen sobre la ventana de destino, lo que crea
pestañas, como en la figura 10.
2.4 Usando exec
Cuando se van a ejecutar varios comandos, puede ser más conveniente escribir estas declaraciones en un archivo con el editor
Scilab. Para ejecutar los comandos ubicados en dicho archivo, se puede usar la función exec, seguida del nombre del script.
Este archivo generalmente tiene la extensión .sce o .sci, dependiendo de su contenido:
• los archivos que tienen la extensión .sci contienen funciones de Scilab y al ejecutarlos se cargan las funciones en el
entorno de Scilab (pero no se ejecutan),
• los archivos que tienen la extensión .sce contienen tanto funciones de Scilab como ejecutables
declaraciones.
dieciséis
Machine Translated by Google
Las pestañas
del muelle
Figura 10: Pestañas de acoplamiento.
La ejecución de un archivo .sce generalmente tiene un efecto, como calcular varias variables
y mostrar los resultados en la consola, crear gráficos 2D, leer o escribir en un archivo, etc.
Suponga que el contenido del archivo myscript.sce es el siguiente.
disp("¡Hola mundo!")
En la consola de Scilab, podemos usar la función exec para ejecutar el contenido de este
script.
--> exec ("miscript. sce") --> disp ("
Hola Mundo !" )
Hola Mundo !
En situaciones prácticas, como la depuración de un algoritmo complicado, el modo
interactivo se usa la mayor parte del tiempo con una secuencia de llamadas a las funciones
exec y disp.
2.5 Procesamiento por lotes
Otra forma de utilizar Scilab es desde la línea de comandos. Varias opciones de línea de
comando están disponibles y se presentan en la figura 11. Sea cual sea el sistema operativo,
los archivos binarios se encuentran en el directorio scilab-5.2.0/bin. Las opciones de la línea
de comandos se deben agregar al binario para la plataforma específica, como se describe a
continuación. La opción -nw permite deshabilitar la visualización de la consola. La opción
-nwni permite iniciar el modo no gráfico: en este modo, la consola no se muestra y las
funciones de trazado están deshabilitadas (usarlas generará un error).
17
Machine Translated by Google
-e instrucción ejecuta la instrucción Scilab proporcionada en la instrucción -f archivo
ejecuta el script Scilabusuario
proporcionado
en el archivo
-l lang
configura
el idioma
del
'fr' para francés
y 'en' para
inglés
(el valor
predeterminado
es 'en') establece el tamaño de pila inicial
-mem N
-ns
si esta opción está presente, el archivo de inicio scilab.start no se ejecuta si esta
-nouserstartup no ejecuta
opción
losestá
archivos
presente,
de inicio
entonces
del usuario
el banner
SCIHOME/.scilab
de bienvenidaode
SCIHOME/scilab.ini
Scilab no se muestra
start
-nb
Scilab como línea de comando con funciones avanzadas (p. ej., gráficos) inicie Scilab como línea de comando
sin funciones avanzadas imprima la versión del producto y salga
-noroeste
-nwni
-versión
Figura 11: Opciones de la línea de comandos de Scilab.
• En Windows, se proporcionan dos ejecutables binarios. El primer ejecutable es WScilex.exe, la
habitual consola gráfica e interactiva. Este ejecutable corresponde al icono que está disponible en
el escritorio después de la instalación de Scilab. El segundo ejecutable es Scilex.exe, la consola
no gráfica.
Con el ejecutable Scilex.exe, la consola basada en Java no se carga y la terminal de Windows se
usa directamente. El programa Scilex.exe es sensible a las opciones -nw y -nwni.
• Bajo Linux, el script scilab proporciona opciones que permiten configurar su comportamiento. De
forma predeterminada, se inicia el modo de gráficos. El script scilab es sensible a las opciones -nw
y -nwni. Hay dos ejecutables adicionales en Linux: scilab-cli y scilab-adv-cli. El ejecutable scilabadv-cli es equivalente a la opción -nw, mientras que scilab-cli es equivalente a la opción -nwni[8].
• Bajo Mac OS, el comportamiento es similar a la plataforma Linux.
En la siguiente sesión de Windows, lanzamos el programa Scilex.exe con la opción -nwni. Luego
ejecutamos la función de trazado para comprobar que esta función no está disponible en el modo no
gráfico.
D :\ Programas \ scilab -5.2.0\ bin > Scilex . exe - nwni
___________________________________________
scilab-5.2.0
Consorcio Scilab (DIGITEO)
Copyright (c) 1989 -2009 (INRIA)
Copyright (c) 1989 -2007 (ENPC)
___________________________________________
Ejecución de inicio: cargando
entorno inicial --> trama ()
!- - error 4
Variable indefinida: parcela
18
Machine Translated by Google
La opción de línea de comandos más útil es la opción -f, que permite ejecutar los comandos
desde un archivo dado, un método generalmente llamado procesamiento por lotes. Suponga que
el contenido del archivo myscript2.sce es el siguiente, donde se usa la función de salida para salir
de Scilab.
disp ("¡Hola mundo!") salir ()
El comportamiento predeterminado de Scilab es esperar la nueva entrada del usuario: es por
eso que se usa el comando de salida, para que la sesión finalice. Para ejecutar la demostración
bajo Windows, creamos el directorio ”C:\scripts” y escribimos las sentencias en el archivo C:
\scripts\myscript2.sce. La siguiente sesión, ejecutada desde la terminal de MS Windows, muestra
cómo usar la opción -f para ejecutar el script anterior.
Tenga en cuenta que usamos la ruta absoluta del ejecutable Scilex.exe.
C :\ scripts >D :\ Programas \ scilab -5.2.0\ bin \ Scilex . exe -f myscript2 . escena
___________________________________________
scilab-5.2.0
Consorcio Scilab (DIGITEO)
Copyright (c) 1989 -2009 (INRIA)
Copyright (c) 1989 -2007 (ENPC)
___________________________________________
Ejecución de inicio: cargando
entorno inicial
Hola Mundo !
C :\ guiones >
Scilab considera cualquier línea que comience con los dos caracteres de barra inclinada ”//”
como un comentario y la ignora. Para comprobar que Scilab permanece de forma predeterminada
en modo interactivo, comentamos la declaración de salida con la sintaxis ”//”, como en el siguiente
script.
disp ("¡Hola mundo!") // salir ()
Si escribimos el comando "scilex -f myscript2.sce" en la terminal, Scilab ahora esperará la
entrada del usuario, como se esperaba. Para salir, escribimos interactivamente la instrucción
quit() en la terminal.
2.6 Ejercicios
Ejercicio 2.1 (La consola) Escriba la siguiente declaración en la consola.
átomos
Ahora escriba en la tecla <Tab>. ¿Lo que sucede? Ahora escriba la letra "I" y vuelva a escribir en <Tab>.
¿Lo que sucede?
Ejercicio 2.2 (Uso de exec) Cuando desarrollamos un script Scilab, a menudo usamos la función exec en combinación
con la función ls, que muestra la lista de archivos y directorios en el directorio actual. También podemos usar pwd,
que muestra el directorio actual. La variable SCI contiene el nombre del directorio de la instalación actual de Scilab.
Lo usamos muy a menudo para ejecutar los scripts que se proporcionan en Scilab. Escriba las siguientes
declaraciones en la consola y vea qué sucede.
personas con discapacidad
SCI
ls (SCI +"/módulos")
19
Machine Translated by Google
ls ( SCI +" / módulos / gráficos / demostraciones
") exec ( SCI +"/ módulos / gráficos / demostraciones /2 d_3d_plots / contornof . dem . sce ")
exec ( SCI +"/ módulos / gráficos / demostraciones /2 d_3d_plots / contornof . dem . sce " );
3 Elementos básicos del lenguaje
Scilab es un lenguaje interpretado, lo que significa que permite manipular variables de forma muy
dinámica. En esta sección, presentamos las características básicas del lenguaje, es decir, mostramos
cómo crear una variable real y qué funciones matemáticas elementales se pueden aplicar a una variable
real. Si Scilab proporcionara solo estas funciones, solo sería una súper calculadora de escritorio.
Afortunadamente, es mucho más y este es el tema de las secciones restantes, donde mostraremos
cómo administrar otros tipos de variables, es decir, booleanos, números complejos, enteros y cadenas.
Parece extraño al principio, pero vale la pena decirlo desde el principio: en Scilab, todo es una
matriz. Para ser más precisos, deberíamos escribir: todas las variables reales, complejas, booleanas,
enteras, de cadena y polinómicas son matrices. Las listas y otras estructuras de datos complejas (como
tlists y mlists) no son matrices (pero pueden contener matrices). Estas estructuras de datos complejas
no se presentarán en este documento.
Es por esto que podríamos comenzar presentando matrices. Aún así, elegimos presentar primero
los tipos de datos básicos, porque las matrices de Scilab son, de hecho, una organización especial de
estos bloques de construcción básicos.
En Scilab podemos manejar números reales y complejos. Esto siempre lleva a cierta confusión si el
contexto no es lo suficientemente claro. En lo que sigue, cuando escribamos variable real, nos referiremos
a una variable cuyo contenido no es complejo. Las variables complejas se tratarán en la sección 3.7
como un caso especial de variables reales. En la mayoría de los casos, las variables reales y las variables
complejas se comportan de manera muy similar, aunque se debe tener un cuidado especial cuando se
procesan datos complejos. Debido a que haría que la presentación fuera engorrosa, simplificamos la
mayoría de las discusiones al considerar solo variables reales, teniendo especial cuidado con las
variables complejas solo cuando sea necesario.
3.1 Creando variables reales
En esta sección, creamos variables reales y realizamos operaciones simples con ellas.
Scilab es un lenguaje interpretado, lo que implica que no es necesario declarar una variable antes
de usarla. Las variables se crean en el momento en que se crean por primera vez.
establecer.
En el siguiente ejemplo, creamos y establecemos la variable real x en 1 y realizamos una
multiplicación en esta variable. En Scilab, el operador ”=” significa que queremos establecer la variable
en el lado izquierdo al valor asociado con el lado derecho (no es el operador de comparación, cuya
sintaxis está asociada con el operador ”==”) .
--> x = 1
x=
1.
--> x = x * 2
20
Machine Translated by Google
+ suma - resta
ÿ multiplicación /
división derecha, es
decir x/y = xyÿ1 \ división izquierda, es
ÿ1
año
decir x\y = x potencia, es decir x ÿÿ potencia
ˆ
y
(igual que ˆ) ' transponer
conjugado
Figura 12: Operadores matemáticos elementales de Scilab.
x=
2.
El valor de la variable se muestra cada vez que se ejecuta una declaración. Ese comportamiento se
puede suprimir si la línea termina con el punto y coma ”;” carácter, como en el siguiente ejemplo.
-->y =1; ->y=y *2;
Todos los operadores algebraicos comunes presentados en la figura 12 están disponibles en Scilab.
Observe que el operador de potencia está representado por el carácter de sombrero ”ˆ” de modo que
en Scilabx.es
por la expresión
”xˆ2”
o de manera
equivalente
porSe
el revisará
operadorde
”x**2”
calcular la 2expresión
Larealizado
comilla simple
ción 3.7, que
presenta
números
complejos.
”' ”
se presentará
con más
nuevo en la sección 4.12, que trata de la transpuesta
conjugada
deprofundidad
una matriz. en la sec.
3.2 Nombres de variables
Los nombres de las variables pueden ser tan largos como el usuario desee, pero en Scilab solo se tienen
en cuenta los primeros 24 caracteres. Por consistencia, debemos considerar solo nombres de variables
que no tengan más de 24 caracteres. Se permiten todas las letras ASCII de la ”a” a la ”z”, de la ”A” a la
”Z” y los dígitos del ”0” al ”9”, con los caracteres adicionales ”%”, ”_”, ”#”, ” ps Tenga en cuenta que los
nombres de las variables, cuya primera letra es "%", tienen un significado especial en Scilab, como
veremos en la sección 3.5, que presenta las variables matemáticas predefinidas.
Scilab distingue entre mayúsculas y minúsculas, lo que significa que Scilab considera que las letras
mayúsculas y minúsculas son diferentes. En el siguiente script, definimos las dos variables A y a y
verificamos que Scilab considere que estas dos variables son diferentes.
--> A = 2
un =
2.
-->a = 1
un =
1.
-->AA
= 2.
21
Machine Translated by Google
-->un
un =
1.
3.3 Comentarios y líneas de continuación
Scilab considera cualquier línea que comience con dos barras inclinadas ”//” como un comentario
y la ignora. No hay posibilidad de comentar un bloque de líneas, como con los comentarios ”/
* ... */” en el lenguaje C.
Cuando una declaración ejecutable es demasiado larga para escribirse en una sola línea,
la segunda línea y las subsiguientes se denominan líneas de continuación. En Scilab, cualquier
línea que termine con dos puntos se considera el comienzo de una nueva línea de continuación.
En la siguiente sesión, damos ejemplos de comentarios de Scilab y líneas de continuación.
--> // Este es mi comentario. -->x =1..
- - >+2..
- - >+3..
- - >+4
x=
10
3.4 Funciones matemáticas elementales
Las tablas 13 y 14 presentan una lista de funciones matemáticas elementales. La mayoría de
estas funciones toman un argumento de entrada y devuelven un argumento de salida. Estas
funciones están vectorizadas en el sentido de que sus argumentos de entrada y salida son
matrices. Esto permite calcular datos con mayor rendimiento, sin ningún bucle.
En el siguiente ejemplo, usamos las funciones cos y sin y comprobamos la igualdad cos(x)
2
2
+ pecado(x) = 1.
-->x = cos (2)
x=
- 0,4161468 -->y =
sen (2) y = 0,9092974
-->x^2+ y^2
respuesta =
1.
3.5 Variables matemáticas predefinidas
En Scilab, varias variables matemáticas son variables predefinidas, cuyos nombres comienzan
con un carácter de porcentaje "%". Las variables que tienen un significado matemático se
resumen en la figura 15.
En el siguiente ejemplo, usamos la variable %pi para comprobar la igualdad matemática
2
2
cos(x)
+ pecado(x) = 1.
22
Machine Translated by Google
acos acosd acosh acoshm acosm acot acotd acoth
acsc acscd acsch asec
asecd asech asin
asinh asinhm asinm atan
atand atanh atanhm atanm
porque
costo
cosh coshm cosm cotd cotg cscd csch secd
cothm csc
sech
segundo
sinc sind
sinh sinhm sinm bronceado
tan tan
tanhm tanm
así como
bata
pecado
Figura 13: Funciones matemáticas elementales de Scilab: trigonometría.
exp
registro expm log10 log1p log2 logm max
maxi min mini modulo pmodulo sign signm sqrt
m2
Figura 14: Funciones matemáticas elementales de Scilab: otras funciones.
-->c= coseno ( %pi )
c=
- 1.
-->s= pecado ( %pi )
s=
1.225D-16
-->c^2+s^2
respuesta =
1.
El hecho de que el valor calculado de sin(ÿ) no sea exactamente igual a 0 es una
consecuencia del hecho de que Scilab almacena los números reales con números de punto flotante,
es decir, con precisión limitada.
3.6 Booleanos
Las variables booleanas pueden almacenar valores verdaderos o falsos. En Scilab, verdadero se escribe con %t
o %T y falso se escribe con %f o %F. La Figura 16 presenta la comparación de varios
operadores que están disponibles en Scilab. Estos operadores devuelven valores booleanos y
tomar como argumentos de entrada todos los tipos de datos básicos (es decir, números reales y complejos, enteros
y cuerdas). Los operadores de comparación se revisan en la sección 4.14, donde el
se hace énfasis en la comparación de matrices.
En el siguiente ejemplo, realizamos algunos cálculos algebraicos con Scilab
booleanos.
%i el número imaginario i
%e constante de Euler e
%pi la constante matemática ÿ
Figura 15: Variables matemáticas predefinidas.
23
Machine Translated by Google
a&b
lógico y
a|b
lógico o
ÿa
no lógico
verdadero si las dos expresiones son iguales
a==baÿ=b o a<>b verdadero si las dos expresiones son diferentes
a<b
verdadero si a es menor que b
a>b verdadero si a es mayor que b
a<=b
verdadero si a es menor o igual que b
a>=b
verdadero si a es mayor o igual que b
Figura 16: Operadores de comparación.
real
parte real
imag
parte imaginaria
imult multiplicación por i, el unitario imaginario
isreal devuelve verdadero si la variable no tiene una entrada compleja
Figura 17: Funciones elementales de números complejos de Scilab.
-->a= %T
un =
T
-->b = ( 0 == 1 )
segundo =
F
-->a&b
respuesta =
F
3.7 Números complejos
Scilab proporciona números complejos, que se almacenan como pares de números de coma flotante.
La variable predefinida %i representa el número imaginario matemático i que
2 me satisface = ÿ1. Todas las funciones elementales presentadas anteriormente, como sin
por ejemplo, están sobrecargados para números complejos. Esto significa que, si su entrada
argumento es un número complejo, la salida es un número complejo. La Figura 17 presenta
funciones que permiten manejar números complejos.
En el siguiente ejemplo, establecemos la variable x en 1 + i, y realizamos varias
operaciones básicas sobre él, como recuperar sus partes reales e imaginarias. Date cuenta cómo
el operador de comillas simples, denotado por ”' ”, se usa para calcular el conjugado de un
Número complejo.
-->x= 1+ %i
x=
1. + yo
--> es real (x)
respuesta =
F
24
Machine Translated by Google
int8 int16 int32
uint8 uint16 uint32
Figura 18: Tipos de datos enteros de Scilab.
--> x
'
respuesta =
1. - yo ->y =1 - %iy = 1.
- yo
--> reales (y)
respuesta =
1.
--> imagen (y)
respuesta =
- 1.
Finalmente comprobamos que la igualdad (1+i)(1ÿi) = 1ÿi
2
= 2 es verificado por Scilab.
-->x*y
respuesta =
2.
3.8 Enteros
Podemos crear varios tipos de variables enteras con Scilab. Las funciones que permiten crear dichos
enteros se presentan en la figura 18.
En esta sección, primero revisamos las características básicas de los números enteros, que
están asociados con un rango particular de valores. Luego analizamos la conversión entre enteros.
En la sección final, consideramos el comportamiento de los números enteros en los límites y nos enfocamos
en los problemas de portabilidad.
3.8.1 Resumen de números enteros
Existe un vínculo directo entre el número de bits utilizados para almacenar un número entero y el
rango de valores que puede manejar el número entero. El rango de una variable entera depende del
número de sus bits.
• Un entero con signo de n bits toma sus valores del rango [ÿ2
nÿ1
,2
nÿ1
ÿ 1].
• Un entero sin signo de n bits toma sus valores del rango [0, 2 n ÿ 1].
Por ejemplo, un entero con signo de 8 bits, creado por la función int8, puede almacenar valores en
7
7
, 2 valores
el rango [ÿ2 ÿ 1], que se simplifica
a [ÿ128,correspondiente
127]. El mapa desde
se presenta
el tipo en
de la
entero
figurahasta
19. el rango de
En la siguiente sesión, comprobamos que un entero de 32 bits sin signo tiene valores ÿ 1], que
dentro del rango [0, 2
32
se simplifica a [0, 4294967295].
--> formato (25) -->n
=32
25
Machine Translated by Google
7
un entero de 8 bits con signo en [ÿ2 , 7 2 ÿ1] = [ÿ128, 127]
y=int8(x)
8
y=uint8(x) un entero sin signo de 8 bits en [0, 2
15
y=int16(x) un entero de 16 bits con signo en [ÿ2
ÿ 1] = [0, 255]
2
, 15
ÿ 1] = [ÿ32768, 32767]
y=uint16(x) un entero sin signo de 16 bits en [0, 2
dieciséis
31
y=int32(x) un entero de 32 bits con signo en [ÿ2
, 2 31 ÿ1] = [ÿ2147483648, 2147483647]
32
y=uint32(x) un entero sin signo de 32 bits en [0, 2
ÿ1] = [0, 65535]
ÿ 1] = [0, 4294967295]
Figura 19: Funciones enteras de Scilab.
conversión de iconvert a representación entera
inttype tipo de enteros
Figura 20: Funciones de conversión de enteros de Scilab.
norte =
32.
- - >2^ n - 1
respuesta =
4294967295.
-->i = uint32 (0)
yo =
0
-->j=yo -1
=
j
4294967295
-->k = j +1
k=
0
3.8.2 Conversiones entre enteros
Hay funciones que permiten convertir desde y hacia tipos de datos enteros. Estas
funciones se presentan en la figura 20.
La función inttype permite consultar el tipo de una variable entera.
Dependiendo del tipo, la función devuelve un valor correspondiente, como se resume
en la tabla 21.
inttipo(x) Tipo
1 entero de 8 bits con signo
entero con signo de 16 bits
24
entero de 32 bits con signo
11
Entero sin signo de 8 bits
12
Entero sin signo de 16 bits
14
Entero sin signo de 32 bits
Figura 21: Tipos de enteros devueltos por la función inttype.
26
Machine Translated by Google
Cuando se suman dos números enteros, se analizan los tipos de los operandos: el tipo de
número entero resultante es el mayor, por lo que se puede almacenar el resultado. En el siguiente
script, creamos un entero i de 8 bits (que está asociado con inttype=1) y un entero j de 16 bits
(que está asociado con inttype=2). El resultado se almacena en k, un entero con signo de 16 bits.
-->i= int8 (1)
yo =
1
--> tipoint (i)
respuesta =
1.
-->j= int16 (2)
=
j
2
--> tipoint (j)
respuesta =
2.
-->k=i +jk =
3
--> tipoint (k)
respuesta =
2.
3.8.3 Números enteros circulares y problemas de portabilidad
El comportamiento de los enteros en los límites del rango merece un análisis particular, ya que
es diferente de un software a otro. En Scilab, el comportamiento es circular, es decir, si se
incrementa un número entero en el límite superior, el siguiente valor está en el límite inferior. En
la siguiente sesión se da un ejemplo de comportamiento circular, donde
--> uint8 (0+( -4:4))
respuesta =
252 253 254 255 0 1 2 3 4
--> uint8 (2^8+( -4:4))
respuesta =
252 253 254 255 0 1 2 3 4 --> int8 (2^7+( -4:4))
respuesta =
124 125 126 127 -128 -127 -126 -125 -124
Esto contrasta con otros paquetes matemáticos, como Octave o Matlab.
En estos paquetes, si un entero está en el límite superior, el siguiente entero permanece en el
límite superior. En la siguiente sesión de Octave, ejecutamos los mismos cálculos que antes.
octava -3.2.4. exe :1 > uint8 (0+( -4:4))
respuesta =
000001234
octava -3.2.4. exe :5 > uint8 (2^8+( -4:4))
respuesta =
252 253 254 255 255 255 255 255 255
octava -3.2.4. exe :2 > int8 (2^7+( -4:4))
respuesta =
27
Machine Translated by Google
124 125 126 127 127 127 127 127 127
La forma circular de Scilab permite una mayor flexibilidad en el procesamiento de números
enteros, ya que permite escribir algoritmos con menos declaraciones if. Pero estos algoritmos
deben verificarse, particularmente si involucran los límites. Además, traducir un script de otro
sistema de computación a Scilab puede generar resultados diferentes.
3.9 Enteros de coma flotante
En Scilab, la variable numérica predeterminada es el doble, es decir, el número de coma flotante
de 64 bits. Esto es cierto incluso si escribimos lo que matemáticamente es un número entero. En
[9], Cleve Moler llama a este número "pedernal", una abreviatura de entero de punto flotante. En la
hincapié en que podemos almacenar números enteros en52el, práctica,
intervalo 2[ÿ2]
52]de
enforma
dobles.
segura,
Hacemos
siempre
que todos los valores enteros de entrada, intermedios y de salida estén estrictamente dentro del
intervalo [ÿ2 2 52]52, ,los
realizamos
cálculos la
enteros
suma son
exacta
exactos.
de dosPor
números
ejemplo,
enteros
en el siguiente
grandes que
ejemplo,
permanecen
en el intervalo "seguro".
--> formato (25)
-->a= 2^40 - 12
un =
1099511627764.
-->b= 2^45 + 3
segundo =
35184372088835.
-->c = a + b
c=
36283883716599.
En cambio, cuando realizamos cálculos fuera de este intervalo, podemos tener resultados
inesperados. Por ejemplo, en la siguiente sesión, vemos que las sumas que involucran términos
ligeramente mayores que 253 producen solo valores pares.
--> formato (25) - >(2^53 + (1:10)) '
respuesta =
9007199254740992.
9007199254740994.
9007199254740996.
9007199254740996.
9007199254740996.
9007199254740998.
9007199254741000.
9007199254741000.
9007199254741000.
9007199254741002.
En la siguiente sesión, calculamos 252 usando el número entero de punto flotante 2 en el
primer caso y usando el número entero de 16 bits 2 en el segundo caso. En el primer caso, no se
produce desbordamiento, incluso si el número está en el límite de los números de punto flotante de 64 bits.
En el segundo caso, el resultado es completamente erróneo, porque el número 252 no se puede
representar como un entero de 16 bits.
- - >2^52
28
Machine Translated by Google
respuesta =
4503599627370496.
--> uint16 (2^52)
respuesta =
0
En la sección 4.15, analizamos los problemas que surgen cuando los índices involucrados para acceder
los elementos de una matriz son dobles.
3.10 La variable ans
Cada vez que hacemos un cálculo y no almacenamos el resultado en una variable de salida, el resultado se
almacena en la variable ans predeterminada. Una vez definida, podemos usar esta variable como cualquier
otra variable de Scilab.
En la siguiente sesión, calculamos exp(3) para que el resultado se almacene en la variable ans. Luego
usamos su contenido como una variable regular.
--> exp (3)
respuesta =
20.08553692318766792368
-->t = log ( respuesta ) t
=
3.
En general, la variable ans debe usarse solo en una sesión interactiva, para avanzar en el cálculo sin
definir una nueva variable. Por ejemplo, es posible que nos hayamos olvidado de almacenar el resultado de
un cálculo interesante y no queramos volver a calcular el resultado. Este podría ser el caso después de una
larga secuencia de pruebas y errores, donde experimentamos varias formas de obtener el resultado sin
preocuparnos de almacenarlo. En este caso interactivo, el uso de ans puede permitir ahorrar algo de tiempo
humano (o de máquina). En cambio, si estamos desarrollando un script utilizado de forma no interactiva, es
una mala práctica confiar en la variable ans y debemos almacenar los resultados en variables regulares.
3.11 Cuerdas
Las cadenas se pueden almacenar en variables, siempre que estén delimitadas por comillas dobles ”" ”. La
operación de concatenación está disponible desde el operador ”+”. En la siguiente sesión de Scilab,
definimos dos cadenas y luego las concatenamos con el ”+”. ” operador.
-->x =
x=
foo
" Foo "
-->y=" barra y
= barra
"
-->x+y
respuesta =
Foobar
Hay muchas funciones que permiten procesar cadenas, incluidas las ex regulares.
presiones No daremos más detalles sobre este tema en este documento.
29
Machine Translated by Google
3.12 Tipo dinámico de variables
Cuando creamos y gestionamos variables, Scilab permite cambiar el tipo de una variable de
forma dinámica. Esto significa que podemos crear un valor real y luego ponerle una variable
de cadena, como se presenta en la siguiente sesión.
--> x = 1
x=
1.
--> x+1
respuesta =
2.
-->x="foo
x=
Foo
--> barra x+"
"
"
respuesta =
Foobar
Hacemos hincapié aquí en que Scilab no es un lenguaje tipado, es decir, no tenemos
que declarar el tipo de una variable antes de establecer su contenido. Además, el tipo de una
variable puede cambiar durante la vida de la variable.
3.13 Ejercicios
Ejercicio 3.1 (Precedencia de operadores) ¿Cuáles son los resultados de los siguientes cálculos (piénselo antes de
intentarlo en Scilab)?
2*3+42+3
*42/3+42
+3/4
Ejercicio 3.2 (Paréntesis) ¿Cuáles son los resultados de los siguientes cálculos (piénselo antes de intentarlo en
Scilab)?
2 * (3 + 4) (2 + 3)
* 4 (2 + 3) / 4 3 /
(2 + 4)
Ejercicio 3.3 (Exponentes) ¿Cuáles son los resultados de los siguientes cálculos (piénselo antes de intentarlo en
Scilab)?
1.23456789 d10
1.23456789 e10
1.23456789 e -5
Ejercicio 3.4 (Funciones) ¿Cuáles son los resultados de los siguientes cálculos (piénselo antes de intentarlo en
Scilab)?
sqrt (4)
sqrt (9)
sqrt ( -1) sqrt
( -2) exp (1)
log ( exp (2))
exp ( log (2))
30
Machine Translated by Google
10^2
log10 (10^2)
10^ log10 (2)
signo (2) signo
(-2) signo (0)
Ejercicio 3.5 (Trigonometría) ¿Cuáles son los resultados de los siguientes cálculos (piénselo antes
de intentarlo en Scilab)?
cos (0)
sen (0)
cos ( %pi )
sen ( %pi )
cos ( %pi /4) - sen ( %pi /4)
4 Matrices
En el lenguaje Scilab, las matrices juegan un papel central. En esta sección, presentamos las
matrices de Scilab y presentamos cómo crear y consultar matrices. También analizamos cómo
acceder a los elementos de una matriz, ya sea elemento por elemento o por operaciones de nivel
superior.
4.1 Resumen
En Scilab, el tipo de datos básico es la matriz, que se define por:
• el número de filas,
• el número de columnas,
• el tipo de datos.
El tipo de datos puede ser real, entero, booleano, cadena y polinomio. Cuando dos matrices tienen
el mismo número de filas y columnas, decimos que las dos matrices tienen la misma forma.
En Scilab, los vectores son un caso particular de matrices, donde el número de filas (o el
número de columnas) es igual a 1. Las variables escalares simples no existen en Scilab: una
variable escalar es una matriz con 1 fila y 1 columna. Es por eso que en este capítulo, cuando
analizamos el comportamiento de las matrices de Scilab, existe el mismo comportamiento para los
vectores de fila o columna (es decir, matrices de n×1 o 1×n) así como para los escalares (es decir, matrices de 1×1).
Es justo decir que Scilab fue diseñado principalmente para matrices de variables reales.
Esto permite realizar operaciones de álgebra lineal con un lenguaje de alto nivel.
Por diseño, Scilab fue creado para poder realizar operaciones matriciales lo más rápido posible.
El componente básico de esta función es que las matrices de Scilab se almacenan en una estructura
de datos interna que se puede administrar a nivel de intérprete. La mayoría de las operaciones
básicas de álgebra lineal, como la suma, la resta, la transposición o el producto punto, se realizan
mediante un código fuente compilado y optimizado. Estas operaciones se realizan con los
operadores comunes ”+”, ”-”, ”*” y la comilla simple ”' ”, por lo que, a nivel de Scilab, el código
es simple
fuente
y rápido.
31
Machine Translated by Google
Con estos operadores de alto nivel, la mayoría de los algoritmos matriciales no requieren el uso
bucles De hecho, un script de Scilab que realiza las mismas operaciones con bucles es
típicamente de 10 a 100 veces más lento. Esta función de Scilab se conoce como vectorización. Para
obtener una implementación rápida de un algoritmo dado, el Scilab
El desarrollador siempre debe usar operaciones de alto nivel, de modo que cada instrucción procese
una matriz (o un vector) en lugar de un escalar.
Tareas más complejas de álgebra lineal, como la resolución de sistemas de ecuaciones lineales Ax
= b, varias descomposiciones (por ejemplo, el pivote parcial de Gauss
PA = LU), los cálculos de valores propios/vectores propios también se realizan mediante
y códigos fuente optimizados. Estas operaciones son realizadas por operadores comunes como la barra
inclinada ”/” o la barra invertida ”\” o con funciones como especificación, que calcula
Valores propios y vectores propios.
4.2 Crear una matriz de valores reales
Hay una sintaxis simple y eficiente para crear una matriz con valores dados. los
siguiente es la lista de símbolos utilizados para definir una matriz:
• los corchetes ”[” y ”]” marcan el principio y el final de la matriz,
• comas "," separan los valores en diferentes columnas,
• punto y coma ”;” separar los valores de diferentes filas.
La siguiente sintaxis se puede utilizar para definir una matriz, donde los espacios en blanco son opcionales
(pero haga que la línea sea más fácil de leer) y "..." denota valores intermedios:
A = [a11
,
a12 , ... ,
a1n; a21
,
a22 , ... ,
a2n; ...; an1
,
En el siguiente ejemplo, creamos una matriz de 2 × 3 de valores reales.
-->A = [1
un =
1.
4.
,
2
2.
5.
,
3; 4
,
5
,
6]
3.
6.
Está disponible una sintaxis más simple, que no requiere el uso de la coma y el punto y coma.
caracteres. Al crear una matriz, el espacio en blanco separa las columnas mientras
la nueva línea separa las filas, como en la siguiente sintaxis:
A = [ a11 a12 ... a1n
a21 a22 ... a2n
...
an1 an2 ... ann ]
Esto permite aligerar considerablemente el manejo de matrices, como en el siguiente
sesión.
-->A = [1 2 3
-- >4 5 6]
un =
1.
4.
2.
5.
3.
6.
32
an2 , ... ,
Ana ].
Machine Translated by Google
ojo
matriz de identidad
linspace
unos
vector espaciado linealmente
matriz hecha de unos
ceros
matriz hecha de ceros
testmatrix genera algunas matrices particulares
generador de números aleatorios
gran
rand
generador de números aleatorios
Figura 22: Funciones que generan matrices.
La sintaxis anterior para matrices es útil en las situaciones donde las matrices son
para ser escrito en archivos de datos, porque simplifica la lectura humana (y la verificación)
de los valores en el archivo, y simplifica la lectura de la matriz en Scilab.
Varios comandos de Scilab permiten crear matrices a partir de un tamaño dado, es decir, a partir de un
número dado de filas y columnas. Estas funciones se presentan en la figura 22. El
los más utilizados son ojo, ceros y unos. Estos comandos toman dos entradas
argumentos, el número de filas y columnas de la matriz a generar.
-->A = unidades (2 ,3)
un =
1.
1.
1.
1.
1.
1.
4.3 La matriz vacía []
Se puede crear una matriz vacía usando corchetes vacíos, como en la siguiente
sesión, donde creamos una matriz 0 × 0.
-->A =[]
un =
[]
Esta sintaxis permite borrar el contenido de una matriz, de modo que el asociado
la memoria se libera.
-->A = unidades (100 ,100);
-->A = []
un =
[]
4.4 Matrices de consulta
Las funciones de la figura 23 permiten consultar o actualizar una matriz.
La función de tamaño devuelve los dos argumentos de salida nr y nc, que son los
número de filas y el número de columnas.
-->A = unidades (2 ,3)
un =
1.
1.
1.
1.
-- >[nr
1.
1.
, nc ]= tamaño (A)
33
Machine Translated by Google
Talla
tamaño de los
diferente matrix matrixobjetos
resize_matrix
cambiar
crear
la forma
una nueva
de un vector
matriz o
con
una
unmatriz
tamaño
a un
diferente
tamaño
Figura 23: Funciones que consultan o modifican matrices.
nc =
3.
nr =
2.
La función de tamaño tiene un valor práctico importante cuando diseñamos una función, ya que el
procesamiento que debemos realizar sobre una matriz dada puede depender de su forma. Por
ejemplo, para calcular la norma de una matriz dada, se pueden usar diferentes algoritmos dependiendo
de si la matriz es un vector columna de tamaño nr × 1 y nr > 0, un vector fila de tamaño 1 × nc y nc >
0, o una matriz general de tamaño nr × nc y nr, nc > 1.
La función de tamaño también tiene la siguiente sintaxis
nr = tamaño ( A
,
sel)
que permite obtener solo el número de filas o el número de columnas y donde sel puede tener los
siguientes valores
• sel=1 o sel="r", devuelve el número de filas,
• sel=2 o sel="c", devuelve el número de columnas.
• sel="*", devuelve el número total de elementos, es decir, el número de columnas
veces el número de filas.
En la siguiente sesión, usamos la función de tamaño para calcular el número total de elementos
de una matriz.
-->A = unidades (2 ,3)
un =
1.
1.
1.
1.
1.
1.
--> tamaño (A , "*" )
respuesta =
6.
4.5 Acceso a los elementos de una matriz
Existen varios métodos para acceder a los elementos de una matriz A:
• toda la matriz, con la sintaxis A,
• elemento por elemento con la sintaxis A(i,j),
• un rango de valores de índice con el operador de dos puntos ”:”.
34
Machine Translated by Google
El operador de dos puntos se revisará en la siguiente sección.
Para hacer un acceso global a todos los elementos de la matriz, la variable simple
nombre, por ejemplo A, se puede utilizar. Todas las operaciones de álgebra elemental están disponibles
para matrices, como la suma con ”+”, la resta con ”-”, siempre que el
dos matrices tienen el mismo tamaño. En el siguiente script, agregamos todos los elementos de
dos matrices.
-->A = unidades (2 ,3)
un =
1. 1. 1. 1.
-->B = 2 * unos (2 ,3)
B=
2.
2.
2.
2.
-->A+B
1.
1.
2.
2.
respuesta =
3.
3.
3.
3.
3.
3.
Se puede acceder directamente a un elemento de una matriz con la sintaxis A(i,j), pro
siempre que i y j sean valores de índice válidos.
Destacamos que, por defecto, el primer índice de una matriz es 1. Esto contrasta
con otros lenguajes, como el lenguaje C por ejemplo, donde el primer índice es
0. Por ejemplo, suponga que A es una matriz nr × nc, donde nr es el número de filas
y nc es el número de columnas. Por tanto, el valor A(i,j) tiene sentido sólo si
los valores de índice i y j satisfacen 1 ÿ i ÿ nr y 1 ÿ j ÿ nc. Si los valores del índice son
no es válido, se genera un error, como en la siguiente sesión.
-->A = unidades (2 ,3)
un =
1.
1.
1.
1.
1.
1.
-->A (1 ,1)
respuesta =
1.
-->A (12 ,1)
!- - error 21
Índice no válido.
-->A (0 ,1)
!- - error 21
Índice no válido.
El acceso directo a los elementos de la matriz con la sintaxis A(i,j) solo debe usarse
cuando no se pueden usar otros comandos de Scilab de nivel superior. De hecho, Scilab proporciona
muchas características que permiten producir cálculos más simples y rápidos, basados en
vectorización. Una de estas características es el operador de dos puntos ”:”, que es muy importante
en situaciones prácticas.
4.6 El operador de dos puntos ”:”
La sintaxis más simple del operador de dos puntos es la siguiente:
v = yo:j
35
Machine Translated by Google
donde i es el índice inicial y j es el índice final con i ÿ j. Esto crea
el vector v = (i, i + 1, . . . , j). En la siguiente sesión, creamos un vector de índice
valores de 2 a 4 en una declaración.
-->v = 2:4
v=
2.
3.
4.
La sintaxis completa permite configurar el incremento utilizado al generar el
valores de índice, es decir, el paso. La sintaxis completa para el operador de dos puntos es
v = yo: s: j
donde i es el índice inicial, j es el índice final y s es el paso. Este comando
crea el vector v = (i, i + s, i + 2s, . . i + ns) donde .n, es el entero mayor
tal que i + ns ÿ j. Si s divide a j ÿ i, entonces el último índice en el vector de índice
valores es j. En otros casos, tenemos i + ns < j. Mientras que en la mayoría de las situaciones, el paso s
es positivo, también puede ser negativo.
En la siguiente sesión, creamos un vector de valores de índice crecientes de 3 a
10 con un paso igual a 2.
-->v = 3:2:10
v=
3.
5.
7.
9.
Observe que el último valor en el vector v es i+ns = 9, que es menor que j = 10.
En la siguiente sesión, presentamos dos ejemplos donde el paso es negativo. En
el primer caso, el operador de dos puntos genera valores de índice decrecientes de 10 a 4. En
el segundo ejemplo, el operador de dos puntos genera una matriz vacía porque no
no hay valores menores de 3 y mayores de 10 al mismo tiempo.
-->v = 10: -2:3
v=
10
-->v = 3: -2:10
v=
8.
6.
4.
[]
Con un vector de valores de índice, podemos acceder a los elementos de una matriz en un determinado
rango, como con la siguiente sintaxis simplificada
A( i:j ,k :l )
donde i,j,k,l son valores de índice inicial y final. La sintaxis completa es
A(i:s:j,k:t:l), donde s y t son los pasos.
Por ejemplo, supongamos que A es una matriz de 4 × 5 y que queremos acceder a la
elementos ai, j para i = 1, 2 y j = 3, 4. Con el lenguaje Scilab, esto se puede hacer
en una sola sentencia, usando la sintaxis A(1:2,3:4), como se muestra a continuación
sesión.
-->A = matriz de prueba ( " " ,5)empuñadura
un =
25.
- 300.
1050.
- 1400.
630.
- 300.
4800. - 18900.
26880.
- 12600.
1050. - 18900.
79380. - 117600.
56700.
- 1400.
26880. - 117600.
179200. - 88200.
36
Machine Translated by Google
toda la matriz
A
A(:,:) toda la matriz
A(i:j,k) los elementos en las filas de i a j, en la columna k
A(i,j:k) los elementos en la fila i, en las columnas de j a k
A(i,:) la fila i
A(:,j) la columna j
Figura 24: Acceso a una matriz con el operador de dos puntos ”:”.
630. - 12600.
56700. - 88200.
44100.
-->A (1:2 ,3:4)
respuesta =
1050.
- 18900.
- 1400.
26880.
En algunas circunstancias, puede suceder que los valores del índice sean el resultado de una
cálculo. Por ejemplo, el algoritmo puede estar basado en un ciclo donde el índice
los valores se actualizan periódicamente. En estos casos, la sintaxis
A( vi , vj ),
donde vi,vj son vectores de valores de índice, se pueden utilizar para designar los elementos de
A cuyos subíndices son los elementos de vi y vj. Esa sintaxis se ilustra en el
siguiente ejemplo.
-->A = matriz de prueba ( " " ,5) empuñadura
un =
25.
- 300.
1050.
- 1400.
630.
- 300.
4800. - 18900.
26880.
- 12600.
1050. - 18900.
79380. - 117600.
56700.
- 1400.
26880. - 117600. - 12600.
179200. - 88200.
630.
56700. - 88200.
44100.
--> vi=1:2
vi =
1.
2.
--> vj =3:4
vj =
3.
-->A(vi , vj )
4.
respuesta =
1050.
- 18900.
--> vi = vi +1
vi =
2.
--> vj = vj +1
vj =
4.
-->A(vi , vj )
- 1400.
26880.
3.
5.
respuesta =
26880. 117600.
- 12600.
56700.
37
Machine Translated by Google
Hay muchas variaciones en esta sintaxis, y la figura 24 presenta algunas de las
posibles combinaciones.
Por ejemplo, en la siguiente sesión, usamos el operador de dos puntos para
intercambiar dos filas de la matriz A.
-->A = matriz de prueba ( " " ,3)empuñadura
un =
9.
- 36.
30
- 36.
192. - 180.
30. - 180. 180.
-->A ([1 2] ,:) = A ([2 1] ,:)
un =
- 36. 192. - 180.
9. - 36. 30.
30. - 180. 180.
También podríamos intercambiar las columnas de la matriz A con el enunciado A(:,[3
1 2]).
En esta sección hemos analizado varios usos prácticos del operador de dos puntos.
De hecho, este operador se usa en muchas secuencias de comandos donde el rendimiento importa, ya que
permite acceder a muchos elementos de una matriz en una sola instrucción. Esto está asociado
con la vectorización de scripts, un tema central en el lenguaje Scilab
y se revisa a lo largo de este documento.
4.7 La matriz del ojo
La función ojo permite crear la matriz identidad con el tamaño que depende de
el contexto. Se ha elegido su nombre en lugar de I para evitar confusiones.
con un índice o con el número imaginario.
En la siguiente sesión sumamos 3 a los elementos de la diagonal de la matriz A.
-->A = unidades (3 ,3)
un =
1.
1.
1.
1.
1.
1.
1.
1.
1.
-->B = A + 3* ojo ()
B=
4.
1.
1.
4.
1.
1.
1.
1.
4.
En la siguiente sesión, definimos una matriz identidad B con la función ojo dependiendo del
tamaño de una matriz A dada.
-->A = unidades (2 ,2)
un =
1.
1.
1.
1.
-->B = ojo (A)
B=
1.
0.
0.
1.
38
Machine Translated by Google
Finalmente, podemos usar la sintaxis eye(m,n) para crear una matriz identidad con
m filas y n columnas.
4.8 Las matrices son dinámicas
El tamaño de una matriz puede crecer o reducirse dinámicamente. Esto permite adaptar el tamaño
de la matriz a los datos que contiene.
Considere la siguiente sesión donde definimos una matriz de 2 × 3.
-->A = [1 2 3; 4 5 6]
un =
1.
2.
4.
5.
3.
6.
En la siguiente sesión, insertamos el valor 7 en los índices (3, 1). Esto crea el
tercera fila en la matriz, establece la entrada A(3, 1) en 7 y llena los otros valores de la
fila recién creada con ceros.
-->A (3 ,1) = 7
un =
1.
4.
7.
2.
5.
0.
3.
6.
0.
El ejemplo anterior mostró que las matrices pueden crecer. En la siguiente sesión, nos
Vea que también podemos reducir el tamaño de una matriz. Esto se hace usando el vacío
operador de matriz ”[]” para eliminar la tercera columna.
-->A (: ,3) = []
un =
1.
4.
7.
2.
5.
0.
También podemos cambiar la forma de la matriz con la función de matriz. La matriz
La función permite remodelar una matriz de origen en una matriz de destino con un tamaño diferente.
La transformación se realiza columna por columna, apilando los elementos de la
matriz fuente. En la siguiente sesión, remodelamos la matriz A, que tiene 3×2 = 6
elementos en un vector fila con 6 columnas.
-->B = matriz (A ,1 ,6)
B=
1.
4.
7.
2.
5.
0.
4.9 El operador dólar ”$”
Por lo general, hacemos uso de índices para hacer referencia desde el inicio de una matriz. Por
oposición, el operador dólar ”$” permite referenciar elementos desde el final de
la matriz. El operador ”$” significa ”el índice correspondiente a la última” fila o
columna, dependiendo del contexto. Esta sintaxis está asociada con un álgebra, de modo que
el índice $-i corresponde al índice `ÿi, donde ` es el número de
filas o columnas. En la figura 25 se presentan varios usos del operador dólar .
En el siguiente ejemplo, consideramos una matriz de 3 × 3 y accedemos al elemento
A(2,1) = A(nr-1,nc-2) = A($-1,$-2) porque nr = 3 y nc = 3.
39
Machine Translated by Google
A(i,$) el elemento en la fila i, en la columna nc
A($,j) el elemento en la fila nr, en la columna j
A($-i,$-j) el elemento en la fila nr ÿ i, en la columna nc ÿ j
Figura 25: Acceso a una matriz con el operador dólar ”$”. El operador ”$” significa
”el último índice”.
-->A= matriz de prueba ( " hilb
un =
9.
- 36.
- 36.
192. - 180.
30. - 180.
" ,3)
30
180.
-->A($ -1 ,$ -2)
respuesta =
- 36.
El operador dólar ”$” permite agregar elementos dinámicamente al final de las matrices.
En la siguiente sesión, agregamos una fila al final de la matriz de Hilbert.
-->A($ +1 ,:) = [1 2 3]
un =
9.
- 36.
- 36.
192. - 180.
30. - 180. 1. 2.
30
180.
3.
El operador ”$” se usa la mayor parte del tiempo en el contexto de la instrucción ”$+1”,
que permite sumar al final de una matriz. Esto puede ser conveniente, ya que evita
la necesidad de actualizar el número de filas o columnas continuamente aunque debería
debe usarse con cuidado, solo en las situaciones en las que el número de filas o columnas no puede
ser conocido de antemano. La razón es que el intérprete tiene que reasignar internamente
memoria para toda la matriz y para copiar los valores antiguos al nuevo destino.
Esto puede conducir a penalizaciones de rendimiento y es por eso que debemos ser advertidos contra
malos usos de este operador. Con todo, el único buen uso de la instrucción "$+1" es
cuando no sabemos de antemano el número final de filas o columnas.
4.10 Operaciones de bajo nivel
Todos los operadores de álgebra comunes, como ”+”, ”-”, ”*” y ”/”, están disponibles con
matrices. En las siguientes secciones, nos enfocamos en el significado exacto de estos operadores,
de modo que se evitan muchas fuentes de confusión.
Las reglas para los operadores ”+” y ”-” se aplican directamente del álgebra habitual.
En la siguiente sesión, sumamos dos matrices de 2 × 2.
-->A = [1 2
-- >3 4]
un =
1.
3.
2.
4.
-->B =[5 6
-- >7 8]
B=
40
Machine Translated by Google
5.
7.
-->A+B
6.
8.
respuesta =
6.
10
8.
12
Cuando realizamos una suma de dos matrices, si un operando es una matriz 1 × 1
(es decir, un escalar), el valor de este escalar se suma a cada elemento de la segunda matriz.
Esta característica se muestra en la siguiente sesión.
-->A = [1 2
-- >3 4]
un =
1.
3.
-->A + 1
2.
4.
respuesta =
2.
4.
3.
5.
La suma es posible solo si las dos matrices son conformes a la suma. En
la siguiente sesión, tratamos de sumar una matriz de 2 × 3 con una matriz de 2 × 2 y comprobamos
que esto no es posible.
-->A = [1 2
-- >3 4]
un =
1.
3.
2.
4.
-->B = [1 2 3
-- >4 5 6]
B=
1.
2.
4.
5.
-->A+B
!- - error 8
Adición inconsistente.
3.
6.
Los operadores elementales que están disponibles para matrices se presentan en la figura 26.
El lenguaje Scilab proporciona dos operadores de división, es decir, la división correcta ”/”
y la división izquierda ”\”. La división correcta es tal que X = A/B = ABÿ1 es el
solución de XB = A. La división de la izquierda es tal que X = A\B = Aÿ1B es la solución
de AX = B. La división izquierda A\B calcula la solución del mínimo asociado
problema del cuadrado si A no es una matriz cuadrada.
La Figura 26 separa los operadores que tratan las matrices como un todo y las
operadores por elementos, que se presentan en la siguiente sección.
4.11 Operaciones elementales
Si un punto ”.” se escribe antes de un operador, se asocia con un elemento
operador, es decir, la operación se realiza elemento a elemento. Por ejemplo, con
el operador de multiplicación habitual ”*”, el contenido de la matriz C=A*B es cij =
41
Machine Translated by Google
+
-
suma
.+ adición por elementos
resta
.- resta por elementos
ÿ
multiplicación
.ÿ multiplicación por elementos
/
división derecha
división izquierda
./ división elemental por la derecha
.\ división por elementos a la izquierda
\
ˆ
o ÿÿ potencia, es decir, x
'
y
.ˆ potencia elemental
transponer y conjugar .' transponer (pero no conjugar)
Figura 26: Operadores matriciales y operadores elementales.
PAGS
k=1, n
aikbkj _ Con el operador de multiplicación por elementos ”.*”, el contenido de la
matriz C=A.*B es cij = aij bij .
En la siguiente sesión se multiplican dos matrices con el operador ”*” y
luego con el operador elementwise ”.*”, para que podamos comprobar que los resultados son
diferente.
-->A = unidades (2 ,2)
un =
1.
1.
1.
1.
-->B = 2 * unos (2 ,2)
B=
2.
2.
2.
2.
-->A*B
respuesta =
4.
4.
-->A .* B
4.
4.
respuesta =
2.
2.
2.
2.
4.12 Transpuesta conjugada y transpuesta no conjugada
Puede haber cierta confusión cuando se utiliza la comilla simple ”. " y el
definiciones regulares
”' ”
los operadores se utilizan sin un conocimiento cuidadoso de su ex
”'
de acto de comillas simples. Con una matriz de dobles que contiene valores reales, la comilla simple
”
El operador solo transpone la matriz. En cambio, cuando una matriz de dobles que contiene
se utiliza valores complejos, la matriz de comillas
”' ”
operador transpone y conjuga el
simples. Por lo tanto, la operación A=Z' produce una matriz con entradas Ajk = Xkj ÿiYkj ,
2 = ÿ1 y X e Y son los reales y
donde i es el número imaginario tal que i
partes imaginarias de la matriz Z. La comilla simple elemento a elemento ”.' ” transpone siempre sin
conjugar la matriz, sea real o compleja. Por lo tanto, la operación
A=Z.' produce una matriz con entradas Ajk = Xkj + iYkj .
En la siguiente sesión, una matriz asimétrica de dobles que contienen complejos
se utilizan valores, de modo que la diferencia entre los dos operadores es obvia.
-->A = [1 2;3 4] + %i * [5 6;7 8]
un =
42
Machine Translated by Google
1. + 5. yo 3. +
2. + 6. yo
7. yo
4. + 8. yo
-->A'
respuesta =
1. - 5. yo
3. - 7. yo
2. - 6. yo
4. - 8. yo
-->A.'
respuesta =
1. + 5. yo
3. + 7. yo
2. + 6. yo
4. + 8. yo
En la siguiente sesión, definimos una matriz no simétrica de dobles que contienen reales
valores y ver que los resultados de ”' ” y ”.' son los mismos en este particular
caso.
-->B = [1 2;3 4]
B=
1.
2.
3.
4.
-->B'
respuesta =
1.
3.
2.
4.
-->B.'
respuesta =
1.
3.
2.
4.
Muchos errores se crean debido a esta confusión, por lo que es obligatorio preguntar
usted mismo la siguiente pregunta: ¿qué pasa si mi matriz es compleja? Si el
”
”
.'
la respuesta es "Solo quiero transponer", entonces el operador de comillas por elementos
es
para ser utilizado.
4.13 Multiplicación de dos vectores
T
Sea u ÿ R n un vector columna y v
ÿ R n sea un vector columna. La matriz
A = uvT tiene entradas Aij = uivj . En la siguiente sesión de Scilab, multiplicamos el
vector columna u por el vector fila v y almacenar el resultado en la variable A.
-->u = [1
-- >2
- - >3]
tu =
1.
2.
3.
-->v = [4 5 6]
v=
4.
5.
6.
-->u*v
respuesta =
4.
5.
6.
8.
10
12
12
15.
18
43
Machine Translated by Google
and(A,"r") en fila ”y” y(A,"c") en
columna ”y” o(A,"r") en fila ”o”
o(A,"c") en columna ”o”
Figura 27: Operadores especiales de comparación para matrices. Los operadores habituales
”<”, ”&”, ”|” también están disponibles para matrices, pero and y or permiten realizar operaciones
por filas y por columnas.
Esto podría generar cierta confusión porque los libros de texto de álgebra lineal consideran
solo vectores columna. Usualmente denotamos por u ÿ R n un vector columna, de modo que
el .vector
En la de
implementación asociada de Scilab,
el vector de fila correspondiente se denota porTua
fila se puede almacenar directamente en la variable u. También podría ser una fuente de
errores, si se espera que el vector esperado sea un vector de fila y, de hecho, es un vector de
columna. Esta es la razón por la cual cualquier algoritmo que funcione solo en un tipo particular
de matriz (vector de fila o vector de columna) debe verificar que el vector de entrada tenga la
forma correspondiente y generar un error si no.
4.14 Comparación de dos matrices reales
La comparación de dos matrices solo es posible cuando las matrices tienen la misma forma.
De hecho, los operadores de comparación presentados en la figura 16 se realizan cuando los
argumentos de entrada A y B son matrices. Cuando se comparan dos matrices, el resultado
es una matriz de valores booleanos. Esta matriz se puede combinar con operadores como y,
o, que se presentan en la figura 27. Los operadores habituales ”&”, ”|” también están
disponibles para matrices, pero and y or permiten realizar operaciones por filas y por columnas.
En la siguiente sesión de Scilab, creamos una matriz A y la comparamos con el número 3.
Observe que esta comparación es válida porque el número 3 se compara elemento por
elemento con A. Luego creamos una matriz B y comparamos las dos matrices A y B.
Finalmente, la función o se usa para realizar una comparación por filas de modo que
obtengamos las columnas donde un valor en la columna de la matriz A es mayor que un valor
en la columna de la matriz B.
-->A = [1 2 7 -->6 9 8]
A = 1.
6.
2.
9.
7.
8.
-->A >3
respuesta =
FFT
TTT
-->B =[4 5 6 -->7
8 9]
B=
4.
5.
7.
8.
-->A >B
6.
9.
44
Machine Translated by Google
respuesta =
FFT
FTF --> o
(A >B , "r" )
respuesta =
FTT
4.15 Problemas con los números enteros de coma flotante
En esta sección, analizamos los problemas que pueden surgir cuando usamos números enteros
que se almacenan como números de coma flotante. Si se usan sin precaución, estos números
pueden conducir a resultados desastrosos, como vamos a ver.
Suponga que la matriz A es una matriz cuadrada de 2×2. Para acceder al elemento (2,1) de
esta matriz, podemos usar un índice constante, como A(2,1), que es seguro.
Además, podemos acceder al elemento (2,1) usando valores de coma flotante, como en la
siguiente sesión.
-->A = matriz de prueba ( " " ,2) hilb
un =
4.
- 6. 12.
- 6.
Ahora, para acceder al elemento de la matriz, podemos usar las variables i y j y usar el
enunciado A(i,j), como en la siguiente sesión.
-->yo = 2
yo =
2.
--> j = 1 j
=
1.
-->A(i,j)
respuesta =
- 6.
En la sesión anterior, enfatizamos que las variables i y j son dobles. Es por esto que la siguiente
afirmación es válida.
-->A( 2
,
[1.0 1.1 1.5 1.9] )
respuesta =
- 6.
- 6. - 6. - 6.
La sesión anterior muestra que los valores de punto flotante 1.0, 1.1, 1.5 y 1.9 se convierten
todos al número entero 1, como si la función int se hubiera utilizado para convertir el número de
punto flotante en un número entero. De hecho, la función int devuelve el número de punto
flotante que almacena la parte entera del número de punto flotante dado: en cierto sentido, se
redondea hacia cero. Por ejemplo, int(1.0), int(1.1), int(1.5) e int(1.9) todos devuelven 1 mientras
que int(-1.0), int(-1.1), int(-1.5) e int(-1.9) todos devuelve -1.
Tenga en cuenta que el comportamiento de redondeo puede explicarse mediante la función
int y no mediante la función floor. Esto se puede ver cuando consideramos valores enteros
negativos, donde los valores devueltos de las dos funciones no son los mismos. De hecho,
suponga que la matriz A es una matriz de 4 × 4, creada por A = testmatrix("hilb",4) para
45
Machine Translated by Google
ejemplo. La función triu devuelve la parte superior del triángulo de la matriz de entrada.
Las sentencias triu(A,-1), triu(A,int(-1.5)) y triu(A,-1.5) producen el mismo resultado. En cambio,
la instrucción triu(A,piso(-1.5)) produce el mismo resultado que triu(A,-2).
Este sistema permite tener un lenguaje a la vez simple y eficiente. Pero también puede
tener consecuencias desafortunadas, que a veces conducen a resultados inesperados.
Por ejemplo, considere la siguiente sesión.
--> unos (1 ,1)
respuesta =
1.
--> unos (1 ,(1 -0.9)*10)
respuesta =
[]
Si los cálculos se realizaron con aritmética exacta, el resultado de (1 ÿ 0,9) ÿ 10 debería ser
igual a 1, lo que daría lugar a una matriz de 1×1. En cambio, la declaración ones(1,(1-0.9)*10) crea
una matriz vacía, porque el valor devuelto por la función int es igual a cero, como se presenta en la
siguiente sesión.
--> entero ((1 -0.9)*10)
respuesta =
0.
De hecho, el número decimal 0,9 no se puede representar exactamente como un número de
punto flotante de doble precisión. Esto conduce a un redondeo, de modo que la representación
de coma flotante de 1-0,9 es ligeramente menor que 0,1. Cuando se realiza la multiplicación
(1-0.9)*10, el resultado de coma flotante es, por lo tanto, ligeramente menor que 1, como se
presenta en la siguiente sesión.
--> formato (25) - - >1
-0.9
respuesta =
0.0999999999999999777955
- - >(1 -0.9)*10
respuesta =
0.9999999999999997779554
Luego, el número de coma flotante 0.999999999999999 se considera como el número entero
cero, lo que hace que la función de los unos devuelva una matriz vacía. Por lo tanto, el origen
de este problema es el uso del número de coma flotante 0.1, que no debería haberse usado
sin precaución para realizar aritmética de enteros con números de coma flotante.
4.16 Más sobre funciones elementales
En esta sección, analizamos varias funciones elementales, especialmente funciones
trigonométricas basadas en grados, funciones logarítmicas y funciones elementales basadas en matrices.
Las funciones trigonométricas como seno y coseno se proporcionan con el argumento de
entrada clásico en radianes. Pero algunas otras funciones trigonométricas, como la función
cosd, por ejemplo, toman un argumento de entrada en grado. Esto significa que, en el sentido
matemático, tand(x) = tan(xÿ/180). Estas funciones se pueden identificar fácilmente porque su
nombre termina con la letra ”d”, por ejemplo, cosd, sind, entre otras. La ventaja clave de las
funciones elementales basadas en grados es que
46
Machine Translated by Google
proporcionar resultados exactos cuando su argumento tiene valores matemáticos especiales, como
múltiplos de 90ÿ . De hecho, la implementación de las funciones basadas en grados se basa
en una reducción de argumento que es exacta para valores enteros. Esto permite obtener exactamente
resultados de punto flotante para casos particulares.
En la siguiente sesión, calculamos sin(ÿ) y sind(180), que son matemáticas
icamente iguales, pero están asociados con diferentes resultados de coma flotante.
--> pecado ( %pi )
respuesta =
1.225D-16
--> pecado (180)
respuesta =
0.
El hecho de que sen(ÿ) no sea exactamente cero está asociado con la precisión limitada de
Números de punto flotante. De hecho, el argumento ÿ se almacena en la memoria con un límite
número de dígitos significativos, lo que conduce al redondeo. En cambio, el argumento 180 es
representado exactamente como un número de punto flotante, porque es un entero pequeño. Por eso,
el valor de sind(180) es calculado por la función sind como sin(0). Una vez más,
el número cero está representado exactamente por un número de coma flotante. Además, el pecado
función está representada en el intervalo [ÿÿ/2, ÿ/2] por un polinomio de la forma p(x) =
x+x 3 q(x 2 ) donde q es un polinomio de bajo grado. Por lo tanto, obtenemos sind(180)=sin(0)=0,
cual es el resultado exacto.
La función log calcula el logaritmo natural del argumento de entrada, es decir,
X
la inversa de la función exp= e
, donde e es la constante de Euler. Para calcular
la función logaritmo para otras bases, podemos usar las funciones log10 y log2,
asociado con las bases 10 y 2 respectivamente. En la siguiente sesión calculamos
los valores de las funciones log, log10 y log2 para algunos valores específicos de x.
-->x = [ exp (1) exp (2) 1 10 2^1 2^10]
x=
2.7182818
7.3890561
1.
10
2.
1024.
-- >[x ' log (x ') log10 (x ') log2 (x ')]
respuesta =
1.
2.
0.
2.3025851
0.6931472
6.9314718
2.7182818
7.3890561
1.
10
2.
1024.
0.4342945
0.8685890
0.
1.
0.30103
3.0103
1.442695
2.8853901
0.
3.3219281
1.
10
La primera columna de la tabla anterior contiene varios valores de x. La columna
el número 2 contiene varios valores de log(x), mientras que las columnas 3 y 4 contienen
varios valores de log10(x) y log2(x).
La mayoría de las funciones son por elementos, es decir, dada una matriz de entrada, aplican el mismo
función para cada entrada de la matriz. Aún así, algunas funciones tienen un significado especial.
con respecto al álgebra lineal. Por ejemplo, la matriz exponencial de una función
X
1
k!Xk , donde X es una matriz cuadrada n × n. Con el fin de
calcular la exponencial de una matriz, podemos usar la función expm. Obviamente,
se define por e
= PAG
k=0,ÿ
la función exponencial elemento a elemento exp no devuelve el mismo resultado. Más
generalmente, las funciones que tienen un significado especial con respecto a las matrices tienen
un nombre que termina con la letra ”m”, ej. expm, sinm, entre otros. En el
47
Machine Translated by Google
chol
Factorización de Cholesky
matriz de compañeros de compañía
número de condición
det
determinante condicional
inversión
matriz inversa
linsolve
solucionador de ecuaciones lineales
lsq lu
problemas de mínimos cuadrados lineales
Factores LU de eliminación gaussiana
qr
segundo
descomposición QR
número de condición inversa
valores propios
especificación svd
valor singular de descomposición
testmatrix una colección de matrices de prueba
rastro
rastro
Figura 28: Algunas funciones comunes para álgebra lineal.
siguiente sesión, definimos una matriz de 2 × 2 que contiene múltiplos específicos de ÿ/2 y
utilice las funciones sin y sinm.
-->A = [ %pi /2 %pi ; 2* %pi 3* %pi /2]
un =
1.5707963
3.1415927
6.2831853
4.712389
--> pecado (A)
respuesta =
1.
- 2.449 D -16 - 1.
1.225D-16
--> sen ( A)
respuesta =
- 0.3333333
1.3333333
0.6666667
0.3333333
4.17 Funciones de álgebra lineal de nivel superior
En esta sección, presentamos brevemente las funciones de álgebra lineal de alto nivel de Scilab.
Scilab tiene una biblioteca de álgebra lineal completa, que es capaz de gestionar tanto densos
y matrices dispersas. Se necesitaría un libro completo de álgebra lineal para hacer
una descripción de los algoritmos proporcionados por Scilab en este campo, y esto es obviamente
fuera del alcance de este documento. La Figura 28 presenta una lista de los más comunes
funciones de álgebra lineal.
4.18 Ejercicios
Ejercicio 4.1 (Más uno) Crea el vector (x1 + 1, x2 + 1, x3 + 1, x4 + 1) con la siguiente x.
x = 1:4;
Ejercicio 4.2 (Multiplicación vectorizada) Crea el vector (x1y1, x2y2, x3y3, x4y4) con la
siguiendo x e y.
48
Machine Translated by Google
x = 1:4; y =
5:8;
1
Ejercicio 4.3 (Invertido vectorizado) Crear el vector
x1
, 1 , 1 , 1
x2
con la siguiente x.
x4
x3
x = 1:4;
x1
Ejercicio 4.4 (División vectorizada) Crear el vector
y.
y1
,
x2
y2
,
x3
y3
,
x4
y4
con la siguiente x y
x = 12*(6:9); y = 1:4;
Ejercicio 4.5 (Elevación al cuadrado vectorizada) Crea el vector x
2
1,
x22 , x23 , x24
con x = 1, 2, 3, 4.
Ejercicio 4.6 (Seno vectorizado) Crea el vector (sin(x1), sin(x2), . . . , sin(x10)) con x es un vector de 10 valores
elegidos linealmente en el intervalo [0, ÿ].
Ejercicio 4.7 (Función vectorizada) Calcular los valores de y = f(x) de la función f definida por la ecuación
f(x) = log10 (r/10x + 10x )
(1)
con r = 2.220.10ÿ16 y xa vector de 100 valores elegidos linealmente en el intervalo [ÿ16, 0].
5 Bucles y ramificaciones
En esta sección, describimos cómo hacer sentencias condicionales, es decir, presentamos
la sentencia if. Presentamos la instrucción select, que permite crear selecciones más
complejas. Presentamos los bucles de Scilab, es decir, presentamos las declaraciones for y
while. Finalmente presentamos dos herramientas principales para administrar bucles, es
decir, las instrucciones break y continue.
5.1 La sentencia if
La declaración if permite realizar una declaración si se cumple una condición. El if usa una
variable booleana para realizar su elección: si el booleano es verdadero, entonces se ejecuta
la declaración. Una condición se cierra cuando se cumple la palabra clave final. En el
siguiente script, mostramos la cadena "¡Hola!" si se cumple la condición %t, que siempre es
verdadera.
si ( %t ) entonces
disp ("¡Hola!") fin
El script anterior produce:
Hola !
Si la condición no se cumple, la sentencia else permite realizar una sentencia alternativa,
como en el siguiente script.
si ( %f ) entonces
disp ("¡Hola!") else disp
("¡Adiós!") end
49
Machine Translated by Google
El script anterior produce:
Adiós !
Para obtener un valor booleano, se puede utilizar cualquier operador de comparación, por
ejemplo, ”==”, ”>”, etc... o cualquier función que devuelva un valor booleano. En la siguiente sesión,
usamos el operador ”==” para mostrar el mensaje ”¡Hola!”.
yo = 2
if (i == 2) entonces disp
("¡Hola!") else
disp ("¡Adiós!") fin
Es importante no usar el operador ”=” en la condición, es decir, no debemos usar la declaración
si ( i = 2 ) entonces. Es un error, ya que el operador ”=” permite poner una variable: es diferente al
operador de comparación ”==”. En caso de error, Scilab nos avisa de que ha pasado algo malo.
-->yo = 2
yo =
2.
--> if ( i = 2 ) entonces Advertencia :
uso obsoleto de '=' en lugar de '== '.
!
--> disp ("¡Hola!")
Hola !
--> más
--> disp (" ¡Adiós ! ") --> fin
Cuando tenemos que combinar varias condiciones, la declaración elseif es útil.
En el siguiente script, combinamos varias declaraciones elseif para administrar varios valores del
entero i.
yo = 2
if ( i == 1 ) then disp (" ¡Hola !
") elseif ( i == 2 ) then disp
(" ¡Adiós ! ") elseif ( i == 3 ) then disp
(" Tchao ! ") else
disp ("Au Revoir!") fin
Podemos usar tantas declaraciones elseif como necesitemos, y esto permite crear ramas tan
complicadas como sea necesario. Pero si se requieren muchas declaraciones elseif, la mayoría de
las veces eso implica que se debe usar una declaración select en su lugar.
5.2 La declaración de selección
La sentencia select permite combinar varias ramas de forma clara y sencilla. Dependiendo del
valor de una variable, permite realizar la sentencia
50
Machine Translated by Google
correspondiente a la palabra clave case. Puede haber tantas sucursales como se requiera.
En el siguiente script, queremos mostrar una cadena que corresponda al entero i dado.
yo = 2
seleccione yo
caso 1
disp ("Uno") caso
2
disp (" Dos ") caso
3
disp ("Tres") más
final disp ("Otro")
El script anterior imprime "Dos", como se esperaba.
La rama else se usa si todas las condiciones del caso anterior son falsas.
La instrucción else es opcional, pero se considera una buena práctica de programación.
De hecho, incluso si el programador piensa que el caso asociado no puede suceder, aún puede existir
un error en la lógica, de modo que todas las condiciones sean falsas cuando no deberían. En este caso,
si la instrucción else no interrumpe la ejecución, se ejecutarán las demás instrucciones del script. Esto
puede conducir a resultados inesperados. En el peor de los casos, el script sigue funcionando pero con
resultados inconsistentes.
La depuración de dichos scripts es extremadamente difícil y puede provocar una gran pérdida de tiempo.
Por lo tanto, la declaración else debe incluirse en la mayoría de las secuencias seleccionadas. Para
gestionar estos eventos inesperados, a menudo combinamos una declaración de selección con la función
de error.
La función de error genera un error asociado con el mensaje dado. Cuando se genera un error, la
ejecución se interrumpe y el intérprete sale de todas las funciones. Por lo tanto, la pila de llamadas se
borra y el script se detiene.
En el siguiente script, mostramos un mensaje dependiendo del valor del
variable positiva i. Si esa variable es negativa, generamos un error.
yo = -5;
seleccione yo
caso 1
disp ("Uno")
caso 2
disp (" Dos ") caso
3
disp ("Tres") más
error ( " " )
final
Valor inesperado del parámetro i
El script anterior produce el siguiente resultado.
-->i = -5; -->
selecciona yo
--> caso 1
--> disp (" Uno ") --> caso 2
--> disp ("Dos")
51
Machine Translated by Google
--> caso 3 -->
disp (" Tres ") --> else --> error
("
Valor inesperado del parámetro i" )
Valor inesperado del parámetro i
En la práctica, cuando vemos una declaración select sin el else correspondiente, podemos
preguntarnos si el desarrollador escribió esto a propósito o asumiendo que nunca sucederá.
La mayoría de las veces, esta suposición puede ser discutida.
5.3 La sentencia for
La declaración for permite realizar bucles, es decir, permite realizar una acción determinada
varias veces. La mayoría de las veces, un bucle se realiza sobre valores enteros, que van
desde un valor de índice inicial hasta uno final. Veremos, al final de esta sección, que la
declaración for es de hecho mucho más general, ya que permite recorrer los valores de una
matriz.
En el siguiente script de Scilab, mostramos el valor de i, de 1 a 5.
para i = 1 : 5
disp (i) fin
El script anterior produce el siguiente resultado.
1.
2.
3.
4.
5.
En el ejemplo anterior, el bucle se realiza sobre una matriz de números de coma flotante
que contienen valores enteros. De hecho, usamos el operador de dos puntos ”:” para producir
el vector de valores de índice [1 2 3 4 5]. La siguiente sesión muestra que la declaración 1:5
produce todos los valores enteros requeridos en un vector de fila.
--> i = 1:5
yo =
1.
2.
3.
4.
5.
Destacamos que, en el bucle anterior, la matriz 1:5 es una matriz de dobles.
Por lo tanto, la variable i también es un doble. Este punto se revisará más adelante en esta
sección, cuando consideremos la forma general de bucles for.
Podemos usar una forma más completa del operador de dos puntos para mostrar los
números enteros impares del 1 al 5. Para hacer esto, establecemos el paso del operador de
dos puntos en 2. Esto lo realiza el siguiente script de Scilab.
para i = 1 : 2 : 5
disp (i) fin
El script anterior produce el siguiente resultado.
1.
3.
5.
52
Machine Translated by Google
El operador de dos puntos se puede utilizar para realizar bucles hacia atrás. En el siguiente script,
mostramos los números del 5 al 1.
para i = 5 : - 1 : 1
disp (i) fin
El script anterior produce el siguiente resultado.
5.
4.
3.
2.
1.
De hecho, la declaración 5:-1:1 produce todos los números enteros requeridos.
-->i = 5: -1:1
yo =
5.
4.
3.
2.
1.
La declaración for es mucho más general que lo que hemos usado previamente en esta sección.
De hecho, permite navegar a través de los valores de muchos tipos de datos, incluidas matrices de
filas y listas. Cuando realizamos un bucle for sobre los elementos de una matriz, esta matriz puede
ser una matriz de dobles, cadenas, enteros o polinomios.
En el siguiente ejemplo, realizamos un bucle for sobre los valores dobles de una fila
matriz que contiene (1.5, e, ÿ).
v = [1.5 exp (1) %pi ]; para x = v
terminar
(x) fin
El script anterior produce el siguiente resultado.
1.5
2.7182818
3.1415927
Hacemos hincapié ahora en un punto importante sobre la declaración for. Cada vez que usamos
un bucle for, debemos preguntarnos si una declaración vectorizada podría realizar el mismo cálculo.
Puede haber un factor de rendimiento de 10 a 100 entre declaraciones vectorizadas y un bucle for.
La vectorización permite realizar cálculos rápidos, incluso en un entorno interpretado como Scilab.
Esta es la razón por la cual el ciclo for debe usarse solo cuando no hay otra forma de realizar el
mismo cálculo con funciones vectorizadas.
5.4 La sentencia while
La declaración while permite realizar un bucle mientras una expresión booleana es verdadera.
Al comienzo del ciclo, si la expresión es verdadera, se ejecutan las declaraciones en el cuerpo del
ciclo. Cuando la expresión se vuelve falsa (un evento que debe ocurrir en un momento determinado),
el ciclo finaliza.
En el siguiente script, calculamos la suma de los números i del 1 al 10 con
una declaración de tiempo.
53
Machine Translated by Google
s = 0 yo
=1
mientras que ( yo <= 10 ) s = s
+ yo
yo = yo + 1
final
Al final del algoritmo, los valores de las variables i y s son:
s=
55.
yo =
11
Debe quedar claro que el ejemplo anterior es solo un ejemplo de la instrucción while. Si
realmente quisiéramos calcular la suma de los números del 1 al 10, deberíamos usar la función de
suma, como en la siguiente sesión.
--> suma (1:10)
respuesta =
55.
La declaración while tiene el mismo problema de rendimiento que la declaración for. Esta es la
razón por la cual las declaraciones vectorizadas deben considerarse primero, antes de intentar
diseñar un algoritmo basado en un ciclo while.
5.5 Las sentencias break y continue
La sentencia break permite interrumpir un bucle. Por lo general, usamos esta declaración en bucles
donde, una vez que se cumple alguna condición, los bucles no deben continuar.
En el siguiente ejemplo, usamos la instrucción break para calcular la suma de los números
enteros del 1 al 10. Cuando la variable i es mayor que 10, el bucle se interrumpe.
s=0i=
1 mientras
( %t )
si ( i > 10 ) entonces
descanso
final
s = s + yo
yo = yo + 1
final
Al final del algoritmo, los valores de las variables i y s son:
s=
55.
yo =
11
La sentencia continue permite pasar al siguiente bucle, de modo que las sentencias en el
cuerpo del bucle no se ejecutan esta vez. Cuando se ejecuta la declaración de continuación, Scilab
omite las otras declaraciones y va directamente a la declaración while o for y evalúa el siguiente
bucle.
54
Machine Translated by Google
En el siguiente ejemplo, calculamos la suma s = 1 + 3 + 5 + 7 + 9 = 25. La función módulo(i,2) devuelve
0 si el número i es par. En esta situación, el guión pasa al siguiente bucle.
s=0
yo = 0
mientras (yo < 10)
yo = yo + 1
si (módulo (yo
,
2 ) == 0 ) entonces
Seguir
final
s = s + yo
final
Si se ejecuta el script anterior, los valores finales de las variables i y s son:
-->s
s=
25
--> yo
yo =
10
Como ejemplo de cálculo vectorizado, el algoritmo anterior se puede realizar en una sola llamada de
función. De hecho, el siguiente script usa la función de suma, combinada con el operador de dos puntos ”:” y
produce el mismo resultado.
s = suma (1:2:10);
El script anterior tiene dos ventajas principales sobre el algoritmo basado en while.
1. El cálculo utiliza un lenguaje de nivel superior, que es más fácil de entender
comprensión de los seres humanos.
2. Con matrices grandes, el cálculo basado en la suma será mucho más rápido que el algoritmo basado
en while.
Es por esto que se debe hacer un análisis cuidadoso antes de desarrollar un algoritmo basado en un ciclo
while.
6 funciones
En esta sección, presentamos las funciones de Scilab. Analizamos la forma de definir una nueva función y el
método para cargarla en Scilab. Presentamos cómo crear y cargar una biblioteca, que es una colección de
funciones. También presentamos cómo administrar los argumentos de entrada y salida. Finalmente,
presentamos cómo depurar una función usando la declaración de pausa.
6.1 Resumen
Reunir varios pasos en una función reutilizable es una de las tareas más comunes de un desarrollador de
Scilab. La secuencia de llamada más simple de una función es la siguiente:
outvar = mifuncion ( invar )
55
Machine Translated by Google
donde la siguiente lista presenta las diversas variables utilizadas en la sintaxis:
• myfunction es el nombre de la función,
• invar es el nombre de los argumentos de entrada,
• outvar es el nombre de los argumentos de salida.
Los valores de los argumentos de entrada no son modificados por la función, mientras que los valores
de los argumentos de salida son modificados por la función.
De hecho, ya hemos cumplido varias funciones en este documento. La función del pecado,
en la sentencia y=sin(x), toma el argumento de entrada x y devuelve el resultado en la
argumento de salida y. En el vocabulario de Scilab, los argumentos de entrada se denominan derecho
lado de la mano y los argumentos de salida se llaman el lado de la mano izquierda.
Las funciones pueden tener un número arbitrario de argumentos de entrada y salida de modo que
la sintaxis completa para una función que tiene un número fijo de argumentos es la
siguiendo:
[o1 , ... ,
, ... ,
en ] = mifuncion ( i1
en )
Los argumentos de entrada y salida están separados por comas ”,”. Observe que la entrada
argumentos están rodeados por paréntesis de apertura y cierre, mientras que la salida
los argumentos están rodeados por corchetes de apertura y cierre.
En la siguiente sesión de Scilab, mostramos cómo calcular la descomposición LU
de la matriz de Hilbert. La siguiente sesión muestra cómo crear una matriz con el
función testmatrix, que toma dos argumentos de entrada y devuelve una matriz.
Luego, usamos la función lu, que toma un argumento de entrada y devuelve dos o
tres argumentos dependiendo de las variables de salida proporcionadas. Si el tercer argumento
Se proporciona P, se devuelve la matriz de permutación.
-->A = matriz de prueba ( " " ,2)hila A
=
4.
- 6.
- 6.
12
-- >[LU , U] = lu (A)
=
12
- 6.
2.
0.
L=
- 0.6666667
1.
1.
0.
P] = lu (A)
-- >[L ,U ,
PAG =
1.
0.
1.
0.
tu =
12
- 6.
2.
0.
L=
1.
- 0.6666667
0.
1.
Observe que el comportamiento de la función lu en realidad cambia cuando tres salidas
se proporcionan argumentos: las dos filas de la matriz L se han intercambiado. Más
56
Machine Translated by Google
función
función final
abre una definición de función
cierra una definición de función
argn
número de argumentos de entrada/salida en una llamada de función
números variables de argumentos en una lista de argumentos de entrada
varargin
varargoutnúmeros variables de argumentos en una lista de argumentos de salida
fun2string genera una definición ASCII de una función scilab
get_function_path obtener la ruta del archivo fuente de una función de biblioteca
getd
head_comentarios
funciones de lista
obtener todas las funciones definidas en un directorio
macrovar
variables de función
mostrar los comentarios del encabezado de la función Scilab
propiedades de todas las funciones en el espacio de trabajo
Figura 29: Funciones de Scilab para gestionar funciones.
específicamente, cuando se proporcionan dos argumentos de salida, la descomposición A = LU es
proporcionada (la declaración AL*U permite verificar esto). Cuando tres argumentos de salida
se proporcionan, se realizan permutaciones para que la descomposición PA = LU sea
siempre (la declaración P*AL*U se puede utilizar para comprobar esto). De hecho, cuando dos
se proporcionan argumentos de salida, las permutaciones se aplican en la matriz L. Este
significa que la función lu sabe cuántos argumentos de entrada y salida se le proporcionan y cambia su
algoritmo en consecuencia. No presentaremos en este
documentar cómo proporcionar esta función, es decir, un número variable de entrada o salida
argumentos Pero debemos tener en cuenta que esto es posible en el lenguaje Scilab.
Los comandos provistos por Scilab para administrar funciones se presentan en la figura 29.
En las siguientes secciones, presentaremos algunos de los comandos más utilizados.
6.2 Definición de una función
Para definir una nueva función, usamos las palabras clave function y endfunction de Scilab.
En el siguiente ejemplo, definimos la función myfunction, que toma la entrada
argumento x, lo multiplica por 2 y devuelve el valor en el argumento de salida y.
funcion y = mifuncion ( x )
y=2*x
función final
La función de declaración y = myfunction ( x ) es el encabezado de la función
mientras que el cuerpo de la función está hecho del enunciado y = 2 * x. el cuerpo de un
La función puede contener una, dos o más sentencias.
Hay al menos tres posibilidades para definir la función anterior en Scilab.
• La primera solución es escribir el script directamente en la consola de forma interactiva.
modo. Tenga en cuenta que, una vez que la instrucción "función y = mifunción ( x )"
se ha escrito y se ha escrito la tecla Intro, Scilab crea una nueva línea en
la consola, esperando el cuerpo de la función. Cuando la "función final"
se escribe una declaración en la consola, Scilab vuelve a su edición normal
modo.
57
Machine Translated by Google
• Otra solución está disponible cuando el código fuente de la función se proporciona en un archivo.
Este es el caso más común, ya que las funciones son generalmente bastante largas y
complicadas. Simplemente podemos copiar y pegar la definición de la función en la consola.
Cuando la definición de la función es corta (típicamente, una docena de líneas de código
fuente), esta forma es muy conveniente. Con el editor, esto es muy fácil, gracias a la función
Cargar en Scilab.
• También podemos usar la función exec. Consideremos un sistema Windows donde
la función anterior está escrita en el archivo ”C:\myscripts\examples-functions.sce”.
La siguiente sesión da un ejemplo del uso de exec para cargar la función anterior.
--> exec ( "C :\ misscripts \ ejemplos-funciones . sce " ) --> función y =
mifunción ( x ) --> y = 2 * x --> función final
La función exec ejecuta el contenido del archivo como si estuviera escrito de forma interactiva
en la consola y muestra las diversas declaraciones de Scilab, línea tras línea.
El archivo puede contener una gran cantidad de código fuente, por lo que la salida puede ser
muy larga e inútil. En estas situaciones, agregamos el carácter de punto y coma ”;” al final de
la línea. Esto es lo que realiza la función Ejecutar archivo en Scilab del editor.
--> exec("C:\ myscripts\examples-functions. sce");
Una vez que se define una función, se puede usar como si fuera cualquier otra función de Scilab.
--> exec("C:\ myscripts\examples-functions. sce"); -->y = mifuncion ( 3 )
y = 6.
Observe que la función anterior establece el valor del argumento de salida y, con la instrucción
y=2*x. Esto es obligatorio. Para verlo, definimos en el siguiente script una función que establece la
variable z, pero no el argumento de salida y.
funcion y = mifuncion ( x )
z=2*x
función final
En la siguiente sesión, intentamos usar nuestra función con el argumento de entrada x=1.
--> mifuncion ( 1 )
!- - error 4
Variable indefinida: y en la línea
4 de la función myfunction llamada por:
mi función ( 1 )
De hecho, el intérprete nos dice que la variable de salida y no ha sido definida.
Cuando hacemos un cálculo, a menudo necesitamos más de una función para realizar todos los
pasos del algoritmo. Por ejemplo, considere la situación en la que necesitamos optimizar un sistema.
En este caso, podríamos usar un algoritmo proporcionado por Scilab, por ejemplo, optim. Primero,
definimos la función de costo que se va a optimizar, de acuerdo con el formato esperado por optim. En
segundo lugar, definimos un controlador,
58
Machine Translated by Google
que llama a la función optim con los argumentos requeridos. En este esquema simple se utilizan al menos dos
funciones. En la práctica, un cálculo completo suele requerir una docena de funciones o más. En este caso, podemos
recopilar nuestras funciones en una biblioteca y este es el tema de la siguiente sección.
6.3 Bibliotecas de funciones
Una biblioteca de funciones es una colección de funciones definidas en el lenguaje Scilab y almacenadas en un
conjunto de archivos.
Cuando un conjunto de funciones es simple y no contiene ayuda ni código fuente en un lenguaje compilado
como C/C++ o Fortran, una biblioteca es una forma muy eficiente de proceder. En cambio, cuando diseñamos un
componente de Scilab con pruebas unitarias, páginas de ayuda y scripts de demostración, desarrollamos un módulo.
Desarrollar un módulo es fácil y eficiente, pero requiere un conocimiento más avanzado de Scilab. Además, los
módulos se basan en bibliotecas de funciones, por lo que comprender los primeros permite dominar los segundos.
Los módulos no se describirán en este documento. Aún así, en muchas situaciones prácticas, las bibliotecas de
funciones permiten administrar de manera eficiente colecciones simples de funciones y es por eso que describimos
este sistema aquí.
En esta sección, describimos una biblioteca muy simple y mostramos cómo cargarla automáticamente.
automáticamente en el inicio de Scilab.
Hagamos un breve resumen del proceso de creación y uso de una biblioteca. Nosotros
supongamos que se nos proporciona un conjunto de archivos .sci que contienen funciones.
1. Creamos una versión binaria de los scripts que contienen las funciones. La función genlib genera versiones
binarias de los scripts, así como archivos de indexación adicionales.
2. Cargamos la biblioteca en Scilab. La función lib permite cargar una biblioteca
almacenado en un directorio particular.
Antes de analizar un ejemplo, consideremos algunas reglas generales que deben seguirse cuando diseñamos
una biblioteca de funciones. Estas reglas se revisarán en el siguiente ejemplo.
Los nombres de archivos que contienen definiciones de funciones deben terminar con la extensión .sci. Esto
no es obligatorio, pero ayuda a identificar los scripts de Scilab en un disco duro.
Se pueden almacenar varias funciones en cada archivo .sci, pero solo la primera estará disponible desde fuera
del archivo. De hecho, la primera función del archivo se considera la única función pública, mientras que las otras
funciones son (implícitamente) funciones privadas.
El nombre del archivo .sci debe ser el mismo que el nombre de la primera función del archivo. Por ejemplo, si la
función se llamará myfun, entonces el archivo que contiene esta función debe ser myfun.sci. Esto es obligatorio para
que la función genlib funcione correctamente.
Las funciones que permiten gestionar bibliotecas se presentan en la figura 30.
Ahora daremos un pequeño ejemplo de una biblioteca en particular y daremos algunos detalles sobre cómo
proceder realmente.
Supongamos que usamos un sistema Windows y que el directorio samplelib contiene dos archivos:
59
Machine Translated by Google
biblioteca de compilación genlib a partir de funciones en un directorio dado
definición de biblioteca lib
Figura 30: Comandos de Scilab para administrar funciones.
• C:/samplelib/función1.sci:
función y = función1 ( x )
y = 1 * function1_support ( x ) función de función
final y = function1_support ( x ) y = 3 * x función final
• C:/samplelib/function2.sci:
función y = función2 ( x ) y = 2 * x función final
En la siguiente sesión, generamos los archivos binarios con la función genlib, que toma como primer
argumento una cadena asociada al nombre de la biblioteca, y toma como segundo argumento el
nombre del directorio que contiene los archivos. Tenga en cuenta que solo las funciones function1 y
function2 están disponibles públicamente: la función function1_support se puede usar dentro de la
biblioteca, pero no se puede usar fuera.
" ," C :/ muestralib ") -->
--> genlib (" mibiblioteca
mibiblioteca
mylibrary = Ubicación
de los archivos de funciones: C:\samplelib\. función1 función2
La función genlib genera los siguientes archivos en el directorio ”C:/samplelib”:
• function1.bin: la versión binaria del script function1.sci,
• function2.bin: la versión binaria del script function2.sci,
• lib: una versión binaria de la biblioteca,
• nombres: un archivo de texto que contiene la lista de funciones en la biblioteca.
Los archivos binarios *.bin y el archivo lib son multiplataforma en el sentido de que funcionan igual de
bien en Windows, Linux o Mac.
Una vez que se ha ejecutado la función genlib, las dos funciones están disponibles de inmediato,
como se detalla en el siguiente ejemplo.
--> función1 (3)
respuesta =
9.
--> función2 (3)
respuesta =
6.
60
Machine Translated by Google
Sin embargo, en situaciones prácticas, no generaríamos la biblioteca cada vez que se necesita.
Una vez que la biblioteca esté lista, nos gustaría cargar la biblioteca directamente. Esto se hace con
la función lib, que toma como primer argumento el nombre del directorio que contiene la biblioteca y
devuelve la biblioteca, como en la siguiente sesión.
--> mibiblioteca = lib (" C :\ samplelib \")
respuesta =
Ubicación de los archivos de funciones: C:\samplelib\.
funcion1
funcion2
Si hay muchas bibliotecas, puede ser un inconveniente cargar manualmente todas las bibliotecas
al inicio. En la práctica, la instrucción lib se puede escribir de una vez por todas, en el archivo de inicio
de Scilab, de modo que la biblioteca esté disponible inmediatamente al inicio. El directorio de inicio
asociado con una instalación de Scilab en particular se almacena en la variable SCIHOME, como se
presenta en la siguiente sesión, por ejemplo en Windows.
--> SCIHOME
SCIHOME =
C:\Usuarios\nombre de usuario\AppData\Roaming\Scilab\scilab -5.2.0
En el directorio asociado con la variable SCIHOME, el archivo de inicio es .scilab.
Scilab lee automáticamente el archivo de inicio al inicio. Debe ser un script Scilab regular (puede
contener comentarios válidos). Para que nuestra biblioteca esté disponible al inicio, simplemente
escribimos las siguientes líneas en nuestro archivo .scilab.
// Cargar mi biblioteca favorita. mibiblioteca =
lib (" C :/ muestralib /")
Con este archivo de inicio, las funciones definidas en la biblioteca están disponibles directamente
en el inicio de Scilab.
6.4 Gestión de argumentos de salida
En esta sección, presentamos las diversas formas de administrar los argumentos de salida. Una
función puede tener cero o más argumentos de entrada y/o salida. En el caso más simple, el número
de argumentos de entrada y salida está predefinido y usar esta función es fácil. Pero, como veremos,
incluso una función tan simple puede llamarse de varias formas.
Suponga que la función simplef se define con 2 argumentos de entrada y 2 argumentos de salida,
como sigue.
,
función [ y1 , y2 ] = simplef ( x1
y1 = 2 * x1 y2 = 3
* x2
función final
x2)
De hecho, el número de argumentos de salida de dicha función puede ser 0, 1 o 2.
Cuando no hay ningún argumento de salida, el valor del primer argumento de salida se almacena en
la variable ans. También podemos establecer la variable y1 solamente. Finalmente, podemos usar
todos los argumentos de salida, como se esperaba. La siguiente sesión presenta todas estas llamadas
secuencias.
--> simplef ( 1
,
2)
respuesta =
2.
61
Machine Translated by Google
whereami mostrar el árbol de llamadas de instrucciones actual
where
obtener el árbol de llamadas de instrucciones actual
Figura 31: Comandos de Scilab asociados con la pila de llamadas.
--> y1 = simplef ( 1 y1 = 2.
,
2)
-- >[y1 , y2 ] = simplef ( 1 y2 = 6. y1 = 2.
,
2)
Hemos visto que la forma más básica de definir funciones ya permite gestionar un número variable de
argumentos de salida. Existe una forma aún más flexible de gestionar un número variable de argumentos de
entrada y salida, basada en las variables argn, varargin y varargout. Este tema más avanzado no se detallará
en este documento.
6.5 Niveles en la pila de llamadas
Obviamente, las llamadas a funciones se pueden anidar, es decir, una función f puede llamar a una función g,
que a su vez llama a una función hy así sucesivamente. Cuando se inicia Scilab, las variables que se definen
están en el ámbito global. Cuando estamos en una función que se llama desde el ámbito global, estamos un
nivel más abajo en la pila de llamadas. Cuando se producen llamadas a funciones anidadas, el nivel actual en
la pila de llamadas es igual al número de llamadas anidadas anteriores. Las funciones presentadas en la figura
31 permiten consultar el estado de la pila de llamadas.
En la siguiente sesión, definimos 3 funciones que se llaman entre sí y
usamos la función whereami para mostrar el árbol de llamadas de instrucciones actual.
función y = fmain ( x ) y = 2 * flevel1 ( x )
función final
función y = flevel1 ( x ) y = 2 * flevel2 ( x )
función final función y = flevel2 ( x ) y =
2 * x dondeami ()
función final
Cuando llamamos a la función fmain, se produce el siguiente resultado. Como vemos, se muestran los 3
niveles de la pila de llamadas, asociados a la función correspondiente.
--> fmain (1)
donde llamé en la línea 3 de la macro flevel2 flevel2 llamé en la línea 2
de la macro flevel1 flevel1 llamé en la línea 2 de la macro fmain
respuesta =
62
Machine Translated by Google
8.
En el ejemplo anterior, los distintos niveles de llamada son los siguientes:
• nivel 0: el nivel global,
• nivel -1: el cuerpo de la función fmain,
• level -2 : el cuerpo de la función flevel1,
• level -3 : el cuerpo de la función flevel2.
Estos niveles de llamada se muestran en el indicador de la consola cuando depuramos de forma
interactiva una función con la declaración de pausa o con puntos de interrupción.
6.6 La declaración de devolución
Dentro del cuerpo de una función, la declaración de retorno permite regresar inmediatamente, es
decir, sale inmediatamente de la función actual. Esta declaración se puede utilizar en los casos en
que el resto del algoritmo no es necesario.
La siguiente función calcula la suma de enteros desde istart hasta iend. En situaciones regulares,
utiliza la función de suma para realizar su trabajo. Pero si la variable istart es negativa o si la
condición istart<=iend no se cumple, la variable de salida y se establece en 0 y la función regresa
inmediatamente.
función y = mysum ( istart si ( istart < 0 )
entonces y = 0
,
amigo)
devolver
final
si ( iend < istart ) entonces y = 0 return
final
y = suma ( istart : iend ) función final
La siguiente sesión permite comprobar que la función mysum utiliza correctamente la sentencia
return.
--> misuma ( 1
5)
,
respuesta =
15.
,
--> misuma ( -1
5)
respuesta =
0.
--> misuma ( 2
,
1)
respuesta =
0.
Algunos desarrolladores afirman que usar varias declaraciones de retorno en una función es
generalmente una mala práctica. De hecho, debemos tener en cuenta la mayor dificultad de depurar
una función de este tipo, porque el algoritmo puede abandonar repentinamente el cuerpo de la
función. El usuario puede confundirse acerca de qué causó exactamente que la función regresara.
63
Machine Translated by Google
pausa esperar entrada de usuario interactiva
reanudar reanudar la ejecución y copiar algunas variables locales
cancelar la evaluación de interrupción
Figura 32: Funciones de Scilab para depurar manualmente una función.
Es por esto que, en la práctica, la declaración de devolución debe usarse con cuidado, y
ciertamente no en todas las funciones. La regla a seguir es que la función debe devolver
sólo en su última línea. Aún así, en situaciones particulares, el uso de retorno puede realmente
simplificar en gran medida el algoritmo, mientras que evitar el retorno requeriría escribir una gran cantidad de
código fuente innecesario.
6.7 Funciones de depuración con pausa
En esta sección, presentamos métodos de depuración sencillos que permiten solucionar los errores más sencillos.
errores de una manera conveniente y eficiente. Más específicamente, presentamos la pausa,
reanudar y abortar sentencias, que se presentan en la figura 32.
Una sesión de Scilab suele consistir en la definición de nuevos algoritmos mediante la creación de nuevas
funciones. A menudo sucede que un error de sintaxis o un error en el
algoritmo produce un resultado incorrecto.
Considere el cálculo del problema de la suma de los números enteros desde istart hasta
amigo Nuevamente, este ejemplo simple se elige con fines de demostración, ya que el
La función sum lo realiza directamente.
La siguiente función mysum contiene un error: el segundo argumento "foo" pasó
a la función de suma no tiene significado en este contexto.
function y = mysum ( istart y = sum ( iend :
istart endfunction
,
, amigo)
" Foo
")
La siguiente sesión muestra lo que sucede cuando usamos la función mysum.
10)
,
--> misuma ( 1
!- - error 44
Argumento incorrecto 2.
en línea
2 de la función mysum llamada por:
mi suma ( 1
,
10)
Para encontrar el problema de forma interactiva, colocamos una declaración de pausa dentro del
cuerpo de la función.
,
funcion y = mysum ( istart
pausa
y = suma ( iend : istart endfunction
,
amigo)
" Foo
")
Ahora llamamos a la función mysum nuevamente con los mismos argumentos de entrada.
--> misuma ( 1
Escriba
'-1- >
reanudar
10)
,
'
o
'abortar'
para volver al indicador de nivel estándar.
64
Machine Translated by Google
Ahora estamos ubicados de forma interactiva en el cuerpo de la función mysum. el aviso
”-1->” indica que la pila de llamadas actual está en el nivel -1. Podemos comprobar el valor de
las variables istart y iend simplemente tecleando sus nombres en la consola.
-1- > istart
istart =
1.
-1- > amigo
amigo =
10
Para progresar en nuestra función, podemos copiar y pegar las sentencias y ver
lo que sucede de forma interactiva, como en la siguiente sesión.
-1- >y = suma ( iend : istart y = sum ( iend :
,
istart
" Foo "
)
,
" Foo
")
!- - error 44
Argumento incorrecto 2.
Podemos ver que la llamada a la función suma no se comporta como cabría esperar.
El argumento de entrada "foo" es definitivamente un error: lo eliminamos.
-1- >y = suma ( iend : istart )
y=
0.
Después de la primera revisión, la llamada a la función de suma ahora es sintácticamente correcta. Pero
el resultado sigue siendo erróneo, ya que el resultado esperado en este caso es 55. Vemos que
las variables istart e iend se han intercambiado. Corregimos la llamada a la función y
comprobar que la versión fija se comporta como se esperaba
-1- >y = suma ( istart : iend )
y=
55.
El resultado ahora es correcto. Para volver al nivel cero, ahora usamos el
instrucción abort, que interrumpe la secuencia e inmediatamente vuelve a la
nivel global.
-1- > abortar
-->
El mensaje "-->" confirma que ahora estamos de vuelta en el nivel cero en la pila de llamadas.
Arreglamos la definición de la función, que se convierte en:
,
funcion y = mysum ( istart
pausa
y = suma ( istart : iend )
función final
amigo)
Para verificar nuestra corrección de errores, llamamos a la función nuevamente.
--> misuma ( 1
Escriba
'-1- >
reanudar
10)
,
'
o
'abortar'
para volver al indicador de nivel estándar.
Ahora estamos seguros de nuestro código, por lo que usamos la instrucción resume, que
permite que Scilab ejecute el código como de costumbre.
sesenta y cinco
Machine Translated by Google
--> misum ( 1 -1- >
reanudar
,
10)
respuesta =
55.
El resultado es correcto. Todo lo que tenemos que hacer es eliminar la declaración de pausa de la
definición de la función.
,
función y = mysum ( istart y = sum ( istart :
iend ) endfunction
amigo)
En esta sección, hemos visto que, usadas en combinación, las sentencias pause, resume y
abort son una forma muy efectiva de depurar una función de forma interactiva. De hecho, nuestro
ejemplo es muy simple y el método que presentamos puede parecer demasiado simple para ser
conveniente. Este no es el caso. En la práctica, la declaración de pausa ha demostrado ser una
forma muy rápida de encontrar y corregir errores, incluso en situaciones muy complejas.
7 Trazado
Producir diagramas y gráficos es una tarea muy común para analizar datos y crear informes. Scilab
ofrece muchas formas de crear y personalizar varios tipos de diagramas y gráficos. En esta sección,
presentamos cómo crear gráficos 2D y gráficos de contorno. Luego personalizamos el título y la
leyenda de nuestros gráficos. Finalmente exportamos los gráficos para poder usarlos en un informe.
7.1 Resumen
Scilab puede producir muchos tipos de gráficos 2D y 3D. Puede crear gráficos xy con la función de
gráfico, gráficos de contorno con la función de contorno, gráficos 3D con la función de surf,
histogramas con la función histplot y muchos otros tipos de gráficos.
Las funciones gráficas más utilizadas se presentan en la figura 33.
Para obtener un ejemplo de un gráfico 3D, simplemente podemos escribir la instrucción surf()
en la consola de Scilab.
--> navegar ()
Durante la creación de un gráfico, utilizamos varias funciones para crear los datos o configurar
el gráfico. Las funciones que se presentan en la figura 34 se utilizarán en los ejemplos de esta
sección.
7.2 Gráfico 2D
En esta sección, presentamos cómo producir una gráfica xy simple. Hacemos hincapié en el uso de
funciones vectorizadas, que permiten producir matrices de datos en una llamada de función.
Comenzamos definiendo la función que se va a graficar. La función myquadratic eleva al cuadrado
el argumento de entrada x con el operador ”ˆ”.
función f = myquadratic ( x ) f = x ^2 función final
66
Machine Translated by Google
navegar
trama 2D
por la trama
trama 3D
contorno
dibujo de contorno
Gráfico circular
histograma de histplot circular
bar
gráfico de barras
barh
gráfico de barras horizontales
hist3d
histograma 3D
polarplot trazar coordenadas polares
Matplot Gráfico 2D de una matriz usando colores
Sgrayplot gráfico 2D suave de una superficie usando colores
grayplot Trazado 2D de una superficie usando colores
Figura 33: Funciones gráficas de Scilab
linspace vector espaciado linealmente
fiesta
evalúa una función en una grilla
título de
la leyenda
configurar la leyenda de la trama actual
xtitulo
configurar el título y las leyendas de la trama actual
configurar el título de la trama actual
Figura 34: Funciones de Scilab utilizadas al crear un gráfico.
Podemos usar la función linspace para producir 50 valores en el intervalo
[1, 10].
datos x = espacio lineal ( 1
,
10
, 50);
La variable xdata ahora contiene un vector de fila con 50 entradas, donde el primer valor
es igual a 1 y el último valor es igual a 10. Podemos pasarlo a myquadratic
función y obtener el valor de la función en los puntos dados.
ydata = myquadratic ( xdata );
Esto produce el vector de fila ydata, que contiene 50 entradas. Finalmente usamos el
plot para que los datos se muestren como un gráfico xy.
trazar (xdatos
, ydatos )
La Figura 35 presenta la gráfica xy asociada.
Observe que podríamos haber producido la misma gráfica sin generar el arreglo intermedio ydata. De
hecho, el segundo argumento de entrada de la función plot puede
ser una función, como en la siguiente sesión.
trazar (xdatos
, micuadrática )
Cuando el número de puntos a gestionar es grande, utilizando directamente la función permite
ahorra una cantidad significativa de espacio de memoria, ya que evita generar el intermediario
datos vectoriales.
67
Machine Translated by Google
100
90
80
70
60
50
40
30
20
10
0
1
2
3
4
5
6
7
8
9
10
Figura 35: Un gráfico xy simple.
7.3 Gráficos de contorno
En esta sección, presentamos las gráficas de contorno de una función multivariada y hacemos
uso de la función de contorno. Este tipo de gráficos se usa a menudo en el contexto de la
optimización numérica, ya que permiten dibujar funciones de dos variables de una manera
que hace evidente la ubicación del óptimo.
Supongamos que tenemos la función f con n variables f(x) = f(x1, . . . , xn) y x ÿ R n . Para
un ÿ ÿ R dado, la ecuación
f(x) = ÿ,
(2)
define una superficie en el espacio dimensional (n + 1) R n+1 .
Cuando n = 2, los puntos z = f(x1, x2) representan una superficie en el tridimensional. Esto
espacio (x1, x2, z) ÿ R 3 permite dibujar gráficos de contorno de la función de costo, como
vamos a ver. Sin embargo, para n > 3, estas gráficas no están disponibles. Una posible
solución en este caso es seleccionar dos parámetros significativos y dibujar un gráfico de
contorno con estos parámetros variando (únicamente).
La función de contorno de Scilab permite trazar los contornos de una función f. La función
de contorno tiene la siguiente sintaxis
contorno (x, y, z, nz)
dónde
• x (resp. y) es un vector fila de valores x (resp. y) con tamaño n1 (resp. n2),
• z es una matriz real de tamaño (n1,n2), que contiene los valores de la función o una
Función de Scilab que define la superficie z=f(x,y),
• nz los valores de nivel o el número de niveles.
68
Machine Translated by Google
1.0
1.64
1,45
1,27
1,09
0.8
1.45
1.27
1.09
0.6
0.4
0.2
0,727 0,545
0,364 0,182
0.0
-0.2
-0.4
-0.6
1.09
1.27
1.45
1.64
1.82
-0.8
1.09
1.27
1.45
-1.0
-1.0
-0.8
-0.6
-0.4
-0.2
0.0
0.2
0.4
0.6
0.8
1.0
2
1
Figura 36: Gráfico de contorno de la función f(x1, x2) = x
+x
2
2.
En la siguiente sesión de Scilab, usamos una forma simple de la función de contorno,
donde la función myquadratic se pasa como argumento de entrada. el micuadrático
2
1
la función toma dos argumentos de entrada x1 y x2 y devuelve f(x1, x2) = x
+x
2
2.
La función linspace se usa para generar vectores de datos para que la función sea
analizado en el rango [ÿ1, 1]2 .
,
función f = myquadratic2arg ( x1
f = x1 **2 + x2 **2;
función final
x2)
, 1 , 100);
xdata = linspace ( -1 ydata =
, 1 , 100);
linspace ( -1 contorno ( xdata
, ydata , myquadratic2arg ,
10)
Esto produce el gráfico de contorno presentado en la figura 36.
En la práctica, puede suceder que nuestra función tenga el encabezado z = myfunction
( x ), donde la variable de entrada x es un vector fila. El problema es que solo hay
un solo argumento de entrada, en lugar de los dos argumentos requeridos por el contorno
función. Hay dos posibilidades para solucionar este pequeño problema:
• proporcionar los datos a la función de contorno haciendo dos bucles anidados,
• proporcionar los datos a la función de contorno utilizando feval,
• definir una nueva función que llame a la primera.
Estas tres soluciones se presentan en esta sección. El primer objetivo es dejar que el lector
elegir el método que mejor se adapte a la situación. El segundo objetivo es demostrar que
Los problemas de rendimiento se pueden evitar si se hace un uso constante de las funciones proporcionadas por
Scilab está hecho.
En la siguiente sesión ingenua de Scilab, definimos la función cuadrática myquadratic1arg,
que toma un vector como único argumento de entrada. Luego realizamos dos anidados
69
Machine Translated by Google
1.0
0.8
0.6
0.4
0.7
0.2
0.1
0.3
0.5
0.0
-0.2
-0.4
-0.6
-0.8
-1.0
-1.0
-0.8
-0.6
-0.4
-0.2
0.0
0.2
0.4
Figura 37: Gráfico de contorno de la función f(x1, x2) = x
configurado.
0.6
2
1+x
0.8
1.0
2
2 – Los niveles están explícitamente
bucles para calcular la matriz zdata, que contiene los valores z. Los valores de z son
calculado para todas las combinaciones de puntos (x(i), y(j)) ÿ R
2
, para i = 1, 2, . . . ,
nx
y j = 1, 2, . . . , ny, donde nx y ny son el número de puntos en las coordenadas x e y. Al final, llamamos
a la función de contorno, con la lista de niveles requeridos
(en lugar del número anterior de niveles). Esto permite obtener exactamente los niveles que
desee, en lugar de dejar que Scilab calcule los niveles automáticamente.
función f = myquadratic1arg ( x )
f = x (1)**2 + x (2)**2;
función final
, 1 ,
xdata = espaciolin ( -1 100 );
, 1 ,
ydata = espaciolin ( -1 100 );
esto es malo .
// Precaución ! Dos bucles anidados, para i = 1:
longitud (xdata)
para j = 1: longitud ( ydata )
x = [ xdatos (i ) ydatos (j )]. ';
zdata ( i , j ) = myquadratic1arg ( x );
final
final
zdata
contorno (xdatos
, [0,1 0,3 0,5 0,7])
, ydatos ,
El gráfico de contorno se presenta en la figura 37.
El script anterior funciona perfectamente. Aun así, no es eficiente porque utiliza dos
bucles anidados y esto se debe evitar en Scilab por razones de rendimiento. Otro problema es
que teníamos que almacenar la matriz zdata, que podría consumir mucho espacio de memoria
cuando el número de puntos es grande. Es por esto que este método es para evitar, ya que es
un mal uso de las funciones proporcionadas por Scilab.
En el siguiente script, usamos la función feval, que evalúa una función
en una cuadrícula de valores y devuelve los datos calculados. La grilla generada está hecha
2 . Suponemos aquí que hay
de todas las combinaciones de puntos (x(i), y(j)) ÿ R
70
Machine Translated by Google
no hay posibilidad de modificar la función myquadratic1arg, que toma una entrada
argumento. Por lo tanto, creamos una función intermedia myquadratic3, que toma
2 argumentos de entrada. Una vez hecho esto, pasamos el argumento myquadratic3 al feval
función y generar la matriz zdata.
función f = myquadratic1arg ( x )
f = x (1)**2 + x (2)**2;
función final
función f = myquadratic3 ( x1 f = myquadratic1arg
( [ x1 x2 ]
función final
,
,
xdata = espaciolin ( -1 100 );
, 11 ,
ydata = espaciolin ( -1 100 );
zdata = feval ( xdata , ydata , myquadratic3 );
contorno (xdata, ydata, zdata [0.1 0.3 0.5 0.7])
x2)
,
)
,
El guión anterior produce, por supuesto, exactamente la misma trama que antes. Este
El método también debe evitarse cuando sea posible, ya que requiere almacenar la matriz zdata,
que tiene un tamaño de 100 × 100.
Finalmente, hay una tercera forma de crear la trama. En la siguiente sesión de Scilab,
usamos la misma función intermedia myquadratic3 que antes, pero la pasamos
directamente a la función de contorno.
función f = myquadratic1arg ( x )
f = x (1)**2 + x (2)**2;
función final
, x2)
función f = myquadratic3 ( x1 f = myquadratic1arg
)
( [ x1 x2 ]
función final
, 1 , 100);
xdata = linspace ( -1 ydata =
, 1 , 100);
linspace ( -1 contorno ( xdata
, ydata , myquadratic3 ,
[0,1 0,3 0,5 0,7])
El guión anterior produce, por supuesto, exactamente la misma trama que antes. los
La principal ventaja es que no producimos la matriz zdata.
Hemos resumido brevemente cómo producir gráficos 2D simples. ahora estamos interesados
en la configuración de la trama, de modo que los títulos, ejes y leyendas correspondan a
nuestros datos.
7.4 Títulos, ejes y leyendas
En esta sección, presentamos las características gráficas de Scilab que permiten configurar el
título, ejes y leyendas de un gráfico xy.
En el siguiente ejemplo, definimos una función cuadrática y la representamos con el
función de trama.
función f = micuadrática ( x )
f = x.^2
función final
xdata = espaciolin ( 1 50 );
ydata = myquadratic ( xdata );
trazar (xdatos, ydatos)
,
10
,
Ahora tenemos el gráfico que se presenta en la figura 35.
71
Machine Translated by Google
Mi título
100
90
80
70
60
50
eje
Y
40
30
20
10
0
1
2
4
3
5
7
6
8
9
10
eje x
Figura 38: La gráfica xy de una función cuadrática – Esta es la misma gráfica que en la figura 35,
con título y ejes xy configurados.
El sistema de gráficos Scilab se basa en controladores de gráficos. Los identificadores de gráficos
proporcionan un acceso orientado a objetos a los campos de una entidad gráfica. El diseño de gráficos
se descompone en subobjetos como la línea asociada a la curva, la x y
y ejes, el título, las leyendas, etc. Cada objeto se puede descomponer a su vez
en otros objetos si es necesario. Cada objeto gráfico está asociado con una colección.
de propiedades, como el ancho o el color de la línea de la curva, por ejemplo. Estas
las propiedades se pueden consultar y configurar simplemente obteniendo o configurando sus valores,
como cualquier otra variable de Scilab. La gestión de los identificadores es fácil y muy eficiente.
Pero la mayoría de las configuraciones básicas de gráficos se pueden realizar mediante simples llamadas a funciones y, en
En esta sección, nos centraremos en estas características básicas.
En el siguiente script, usamos la función de título para configurar el título
de nuestra parcela.
título ( "
Mi título " );
Es posible que también queramos configurar los ejes de nuestra trama. Para este propósito, utilizamos
la función xtitle en el siguiente script.
xtítulo (
"
"
Mi título
,
" eje x
"
,
"Eje Y
");
La Figura 38 presenta la trama producida.
Puede suceder que queramos comparar dos conjuntos de datos en el mismo gráfico 2D,
es decir, un conjunto de datos x y dos conjuntos de datos y. En el siguiente script, definimos
las dos funciones f(x) = x
2
2
y f(x) = 2x
y grafique los datos en el mismo gráfico xy.
Además, usamos las opciones ”+-” y ”o-” de la función de trazado, para que podamos
2
2.
distinguir las dos curvas f(x) = x
y f(x) = 2x
función f = micuadrática ( x )
f=x^2
función final
función f = myquadratic2 ( x )
72
Machine Translated by Google
Mi título
200
x^2
2x^2
180
160
140
120
100
eje
Y
80
60
40
20
0
1
2
3
4
5
7
6
8
9
10
eje x
Figura 39: El gráfico xy de dos funciones cuadráticas – Hemos configurado la leyenda
2
para que podamos distinguir las dos funciones f(x) = x
y f(x) = 2x
2.
f = 2 * x^2
función final
, 10 ,
xdata = espaciolin ( 1 50 );
ydata = myquadratic ( xdata );
parcela (xdatos "+ -", ydata
)
,
ydata2 = myquadratic2 ( xdata );
trama (xdatos "o -" ) , ydata2 , xtitulo
"
"
" eje x
(
,
Mi título
"
,
"Eje Y
");
Además, debemos configurar una leyenda para saber qué curva está asociada a f(x) = x
2
y qué curva está asociada con f(x) = 2x
2.
Para esto
propósito, usamos la función de leyenda para imprimir la leyenda asociada con
cada curva.
leyenda ("x ^2"
,
"2x^2");
La Figura 39 presenta la gráfica xy producida.
Ahora sabemos cómo crear un gráfico y cómo configurarlo. Si la trama
es lo suficientemente interesante, puede valer la pena ponerlo en un informe. Para hacerlo, podemos
exporte el gráfico a un archivo, que es el tema de la siguiente sección.
7.5 Exportar
En esta sección, presentamos formas de exportar gráficos a archivos, ya sea de forma interactiva o
automáticamente con las funciones de Scilab.
Scilab puede exportar cualquier gráfico a los formatos vectoriales y de mapa de bits presentados
en la figura 40. Una vez que se produce un gráfico, podemos exportar su contenido a un archivo, usando
interactivamente el menú Archivo > Exportar a... de la ventana gráfica. Entonces podemos establecer
el nombre del archivo y su tipo.
73
Machine Translated by Google
vectorial
xs2png
exportar a PNG
xs2pdf
exportar a PDF
xs2svg
exportar a SVG
xs2eps
exportar a PostScript Encapsulado
xs2ps
xs2emf
exportar a Postscript
exportar a EMF (solo para Windows)
mapa de bits
xs2fig
exportar a FIG
xs2gif
exportar a GIF
xs2jpg
exportar a JPG
xs2bmp
exportar a BMP
xs2ppm
exportar a PPM
Figura 40: Funciones de exportación.
Alternativamente, podemos usar las funciones xs2*, presentadas en la figura 40. Todas estas
Las funciones se basan en la misma secuencia de llamada:
,
xs2png ( número_ventana
Nombre del archivo )
donde window_number es el número de la ventana de gráficos y filename es el
nombre del archivo a exportar. Por ejemplo, la siguiente sesión exporta el gráfico que
está en la ventana gráfica número 0, que es la ventana gráfica predeterminada, en la
archivo foo.png.
xs2png ( 0
,
"
foo png
")
Si queremos producir documentos de mayor calidad, los formatos vectoriales deben ser
preferido. Por ejemplo, los documentos LATEX pueden usar gráficos Scilab exportados a PDF
archivos para mejorar su legibilidad, sea cual sea el tamaño del documento.
8 Notas y referencias
Hay una serie de temas que no se han presentado en este documento. Nosotros
Espero que el documento actual sea un buen punto de partida para usar Scilab para que
aprender sobre estos temas específicos no debería ser un problema. Ya hemos mencionado una serie
de otras fuentes de documentación para este propósito al principio.
de este documento.
Los lectores franceses pueden estar interesados en [5], donde se da una buena introducción sobre
cómo crear e interactuar con una biblioteca existente, cómo usar Scilab para calcular la
solución de una Ecuación Diferencial Ordinaria, cómo usar Scicos y muchos otros
asignaturas. El mismo contenido se presenta en inglés en [3]. Los lectores ingleses deben ser
interesado por [4], que da una visión más profunda de Scicos. Estos libros son de gran
interés, pero son bastante obsoletos ya que fueron escritos principalmente para versiones anteriores de
Scilab.
Se pueden obtener lecturas adicionales en la cita web de Scilab [6], en la sección de documentación.
74
Machine Translated by Google
9 Agradecimientos
Quisiera agradecer a Claude Gomez, Vincent Couvert, Allan Cornet y Serge Steer que me
permitieron compartir sus comentarios sobre este documento. También agradezco a Julie Paul
y Sylvestre Ledru que me ayudaron durante la redacción de este documento.
También se agradece a Artem Glebov por corregir este documento.
75
Machine Translated by Google
10 respuestas a los ejercicios
10.1 Respuestas para la sección 1.7
Respuesta al ejercicio 1.1 (Instalación de Scilab) Instalemos la versión actual de Scilab en su sistema: en el momento en que se
escribe este documento, esta es Scilab v5.2. Instalar Scilab es muy fácil, ya que se proporcionan binarios. La Figura 41 presenta
los primeros pasos necesarios para instalar Scilab v5.1.1 en Windows.
Respuesta al ejercicio 1.2 (Ayuda en línea: derivada) La función derivada permite calcular la derivada numérica de una función.
El propósito de este ejercicio es encontrar la página de ayuda correspondiente, por varios medios. Abrimos el navegador de
ayuda desde la consola, en el ? > Menú del navegador de ayuda. Ahora seleccionamos el panel de búsqueda a la izquierda y
escribimos derivada, luego presionamos la tecla <Enter>. Se muestran todas las páginas que contienen la palabra derivada. La
primera es la página de ayuda que estamos buscando. También podemos utilizar la ayuda proporcionada en el sitio web de Scilab
http://www.scilab.org/product/man
Usamos la herramienta de búsqueda de nuestro navegador web favorito y buscamos la palabra derivada. Encontramos
sucesivamente las funciones: diff, bsplin3val, derivada, derivat y dlgamma. La página buscada es la siguiente:
http://www.scilab.org/product/man/derivative.html
Finalmente usamos la consola para encontrar la ayuda.
ayuda derivada La Figura
42 presenta la página de ayuda para la derivada.
10.2 Respuestas para la sección 2.6
Respuesta al ejercicio 2.1 (La consola) Escriba la siguiente afirmación en la consola.
átomos
Ahora escriba en la tecla <Tab>. ¿Lo que sucede? Vemos que se despliegan todas las funciones cuyo nombre comienza con
las letras ”átomos”, como se presenta en la figura 43. Ahora teclee la letra ”I”, y teclee de nuevo en <Tab>. Lo que sucede ?
Vemos que se despliegan todas las funciones cuyo nombre comienza con las letras ”atomsI”, tal como se presenta en la figura
44.
Respuesta al Ejercicio 2.2 (Usando exec) La variable SCI contiene el nombre del directorio de la instalación actual de Scilab. La
declaración SCI+"/módulos" crea una cadena que es la concatenación del nombre del directorio Scilab y la cadena "/módulos",
como se muestra en la siguiente sesión.
--> SCI+" / módulos
"
respuesta =
C :/ PROGRA ~1/ SCILAB ~1.0 - B / módulos
Por lo tanto, cuando ejecutamos la instrucción ls(SCI+"/modules"), Scilab muestra la lista de archivos en el subdirectorio de
módulos de Scilab.
--> ls ( SCI +" / módulos " )
respuesta =
! xpad! !
xcos! !
herramientas_windows!
[...]
!
!!!!!
76
Machine Translated by Google
Figura 41: Primeros pasos durante la instalación de Scilab v5.1.1 bajo Windows.
77
Machine Translated by Google
Figura 42: Página de ayuda para la función derivada.
Figura 43: Uso de la finalización para navegar por las funciones de ATOMS.
Figura 44: Uso de la finalización para navegar por las funciones de ATOMS.
78
Machine Translated by Google
Figura 45: El contorno de demostraciónf.dem.sce.
Ejecutar el script de demostración contourf.dem.sce produce el gráfico que se presenta en la figura 45.
La diferencia entre las dos afirmaciones.
exec ( SCI +"/ módulos / gráficos / demos /2 d_3d_plots / contornof . dem . sce ") exec ( SCI +"/ módulos /
gráficos / demos /2 d_3d_plots / contornof . dem . sce " );
es que el segundo termina con un punto y coma ”;”. Usamos este operador para que Scilab no muestre el
contenido del archivo cuando se ejecuta el script, lo cual es conveniente cuando el script contiene muchas líneas.
10.3 Respuestas para la sección 3.13
Respuesta al Ejercicio 3.1 (Precedencia de operadores) El orden de las operaciones cuando se aplican a una
expresión matemática se llama precedencia. Por ejemplo, cuando la expresión 2 × 3 + 4, es equivalente a la
expresión (2 × 3) + 4. La siguiente sesión muestra que la precedencia de los operadores de Scilab es la misma
que la de los operadores matemáticos habituales.
-- >2 * 3 + 4
respuesta =
10.
-- >2 + 3 * 4
respuesta =
14
-- >2 / 3 + 4
respuesta =
4.6666667
-- >2 + 3 / 4
respuesta =
2.75
Respuesta al Ejercicio 3.2 (Paréntesis) Cuando la precedencia de los operadores no permite calcular el resultado
que queremos, se pueden utilizar paréntesis para forzar el orden de las operaciones. En Scilab, podemos usar
los corchetes habituales ”(” y ”)”.
79
Machine Translated by Google
-- >2 * (3 + 4)
respuesta =
14
- - >(2 + 3) * 4
respuesta =
20
- - >(2 + 3) / 4
respuesta =
1.25
-- >3 / (2 + 4)
respuesta =
0.5
Respuesta al Ejercicio 3.3 (Exponentes) Cuando queremos definir constantes con exponentes, como la constante 1.23456789 × 1010,
usamos la letra ”d” para definir el exponente, como en la siguiente sesión.
- - >1.23456789 d10
respuesta =
1.235 D +10
Alternativamente, podemos usar la letra "e", como en la siguiente sesión que calcula las constantes 1.23456789 × 1010 y 1.23456789 ×
10ÿ5 .
- - >1.23456789 e10
respuesta =
1.235 D +10 - >1.23456789 e -5
respuesta =
0.0000123
Respuesta al ejercicio 3.4 (Funciones) La raíz cuadrada se comporta exactamente como se esperaba matemáticamente
para argumentos positivos.
--> sqrt (4)
respuesta =
2.
--> sqrt (9)
respuesta =
3.
Para argumentos negativos x, Scilab devuelve y como la solución compleja de la ecuación x
2
= y.
--> sqrt (-1)
respuesta =
i
--> sqrt (-2)
respuesta =
1.4142136 yo
La función exp es la función exponencial, donde la base e es la constante de Euler. El logaritmo es el logaritmo natural, que es la función
inversa de la función exponencial.
--> exp (1)
respuesta =
2.7182818
--> registro ( exp (2))
respuesta =
80
Machine Translated by Google
2.
--> exp (registro (2))
respuesta =
2.
La función log10 es el logaritmo en base 10. Observe que si x es un número entero, entonces log10(x) es el número de
dígitos decimales de x.
- - >10^2
respuesta =
100.
--> log10 (10^2)
respuesta =
2.
- - >10^ log10 (2)
respuesta =
2.
La función de signo devuelve el signo de su argumento y devuelve cero cuando x es cero.
--> signo (2)
respuesta =
1.
--> signo (-2)
respuesta =
- 1. -> signo (0)
respuesta =
0.
Respuesta al ejercicio 3.5 (Trigonometría) La siguiente sesión es un ejemplo del uso de las funciones cos y sen.
--> porque (0)
respuesta =
1.
--> pecado (0)
respuesta =
0.
Debido a la precisión limitada de los números de coma flotante, el resultado de una función trigonométrica (como
cualquier otra función) está sujeto a redondeo. En la siguiente sesión, la identidad matemática sen(ÿ) = 0 se aproxima
en el mejor de los casos, dada la precisión de la máquina asociada con las variables dobles.
--> coseno ( %pi )
respuesta =
- 1. -> pecado ( %pi )
respuesta =
1.225 D -16 -> coseno ( %pi /4) - sen ( %pi /4)
respuesta =
1.110 D-16
81
Machine Translated by Google
10.4 Respuestas a la sección 4.18
Respuesta al Ejercicio 4.1 (Más uno) Creamos el vector (x1 + 1, x2 + 1, x3 + 1, x4 + 1) con la siguiente x. La
siguiente sesión realiza el cálculo y utiliza el operador de suma habitual "+". En este caso, el escalar 1 se suma a
cada elemento del vector x.
-->x = 1:4; -->y =
x + 1 y = 2.
3.
4.
5.
Respuesta al Ejercicio 4.2 (Multiplicación vectorizada) Creamos el vector (x1y1, x2y2, x3y3, x4y4) con las siguientes x
e y. La siguiente sesión realiza el cálculo y utiliza la operación de multiplicación por elementos ”.*”.
-->x = 1:4; -->y =
5:8; -->z = x .* y
z=
5.
12
21
32.
Respuesta al ejercicio 4.3 (Vectorizado invertido) Vamos a crear el vector después de
1
x1
,
1
x2
,
1
x3
,
1
x4
. los
que la sesión realice el cálculo y utilice la operación de división por elementos ”./”.
-->x = 1:4; -->y =
1 ./x
y = 1.
0.5
0.3333333
0.25
La siguiente sesión no calcula lo que queremos, sino que calcula la solución y de la ecuación xy = 1.
-->y = 1 / x // ¡Esto no es lo que queremos aquí!
y=
0.0333333
0.0666667
0.1
0.1333333
Respuesta al ejercicio 4.4 (División vectorizada) Vamos a crear el vector después de que
x1
y1
,
x2
y2
,
x3
y3
,
x4
y4
la sesión realice el cálculo y utilice la operación de división por elementos ”./”.
-->x = 12*(6:9); -->y = 1:4;
-->z = x ./ y
z=
72.
42.
32.
27
2
x234.
2 , 3,
, x2
Respuesta al ejercicio 4.5 (Elevación al cuadrado vectorizada) Vamos a crear el vector x con x =1 1,
2,
La
, x2
4
siguiente sesión realiza el cálculo y usa la operación de elevación al cuadrado ”.ˆ”.
-->x = 1:4; -->y =
x .^2 y = 1.
4.
9.
dieciséis.
82
. los
Machine Translated by Google
Respuesta al ejercicio 4.6 (Seno vectorizado) Creamos el vector (sin(x1), sin(x2), . . . , sin(x10))
con x ÿ [0, ÿ]. La siguiente sesión realiza el cálculo y utiliza la función linspace.
-->x = espacio lineal (0 , %pi ,10);
-->y = sen (x)
y=
columna 1 a 6
0.
0.3420201
0.6427876
0.8660254
0.9848078
columna 7 a 10
0.8660254
0.6427876
0.3420201
1.225D-16
0.9848078
Respuesta al ejercicio 4.7 (Función vectorizada) Calculemos los valores de y = f(x) de la
función f definida por la ecuación
f(x) = log10 (r/10x + 10x )
con r = 2.220.10ÿ16 para x ÿ [ÿ16, 0]. La siguiente sesión realiza el cálculo y utiliza
el operador de división por elementos ”./”.
r = 2.220 D-16;
x = espacio lineal ( -16 ,0 ,10);
y = log10 (r ./10.^ x + 10.^ x );
Esta función aparece en el cálculo del paso óptimo a utilizar en una derivada numérica. Muestra que el paso
óptimo para usar con una diferencia finita de orden directo es igual a
h=raíz cuadrada(%eps).
Referencias
[1] Atlas: software de álgebra lineal ajustado automáticamente. http://atlas-de-matemáticas.
sourceforge.net.
[2] Cecill y el software libre. http://www.cecil.info.
[3] C Literas, J.-P. Canciller, F. Delebecque, C. Gómez, M. Goursat,
R. Nikoukhah y S. Steer. Ingeniería y Computación Científica con Scilab.
Birkhauser Boston, 1999.
[4] Stephen L. Campbell, Jean-Philippe Chancelier y Ramine Nikoukhah. Modificación
Aprendizaje y Simulación en Scilab/Scicos. Springer, 2006.
[5] J.-P. Chancelier, F. Delebecque, C. Gómez, M. Goursat,
R. Nikoukhah y
´
S. Steer. Introducción `a Scilab, Deuxi`eme Edition . Springer, 2007.
[6] El Consorcio Scilab. Scilab. http://www.scilab.org.
[7] Intel.
Biblioteca del núcleo matemático de Intel. http://software.intel.com/en-us/
intel-mkl/.
[8] Silvestre Ledru. Diferentes modos de ejecución de scilab. http://wiki.scilab.
org/Different_execution_modes_of_Scilab.
83
(3)
Machine Translated by Google
[9] Cleve Moler. Computación numérica con matlab.
[10] Proyecto Flexdock. Hogar del proyecto Flexdock. https://flexdock.dev.java.net/.
84
Machine Translated by Google
Índice
biblioteca
ˆ, 20
', 39
39 ,.'
de funciones, 56
.. , 21
// , 21
: , 33
sombrero, 20
entero, 24
Intel, 6
; , 20
SCIHOME , 58
contorno ,
disp , 11
lado izquierdo, 53
biblioteca, 56
sesenta y cinco
linux, 7
, 55
fiesta , 67
Mac OS, 7
función
, 52 , 54
genlib , 7 56
matriz, 28
ayuda , 56 lib
módulos, 56
ejecutivo
MKL, 6
,
pronto, 11
linspace , 63 6464
,
,
tamaño parcela
operador de comillas ('), 39
, 30
lado derecho, 53
matriz de prueba , 33
título
, 69
punto y coma,
xtitulo
, 69
SCIHOME , 18
20 forma, 28
cadena, 26
%i , 23
% pi , 22
Y,
transponer, 39
26
nombre variable, 20
lote, 18
ventanas, 6
booleano, 23
dos puntos (:) operador,
33 comentario, 18
, número
21
complejo, 23 conjugado,
39 consola, 11 línea de
continuación, 21
acoplamiento, 14
puntos, 21
funciones elementales, 21 por
elementos, 39
Flexdock, 14
pedernal, 25
85
Descargar