Scilab una alternativa libre para el cálculo numérico
1. Scilab una alternativa
libre para el cálculo
numérico (1ra parte)
Scilab es un entorno de trabajo para realizar cálculos numéricos especialmente
destinados a ingenierías. El programa contiene cientos de funciones matemáticas
dando la posibilidad de añadir las propias, si las escribimos en lenguajes como C o
Fortran. Las funciones se pueden mostrar gráficamente en 2D e incluso animarse en
tres dimensiones. También permite crear simulaciones ODE y DAE.
realizar experimentos que contribuyan
a la ciencia y a la investigación.
✔ Hacer uso de funcionalidades ya
implementadas, en lugar de
desarrollarlas desde cero
✔ Reusar procedimientos y funciones
realizadas por otros profesionales.
✔ .....
Antecedentes Es así que dentro del mundo matemático,
hoy en día contamos con una amplia
Hoy en día la mayoría de los centros de variedad de aplicaciones software tanto
formación superior y Universidades, tratan de comerciales como libres; un fenómeno que
fomentar la investigación entre sus destaca actualmente es el uso del software
profesionales y alumnado, pero muchas libre, que al margen de proveer soluciones
veces esta tarea se ve limitada por la falta de iguales o mejores a sus similares dentro el
herramientas e instrumentos que permitan ámbito comercial de pago, permite fomentar
encarar este proceso. Una de estas directamente el trabajo en comunidad,
herramientas y/o instrumentos la conforman estudia detalle de soluciones existentes
las aplicaciones software, cuyo objetivo (tener a disposición el código de la
principal es la automatización de tareas aplicación), su libre distribución y la
morosas y álgidas que muchas veces las colaboración dentro los proyectos existentes,
personas deben realizar. aspecto que se convierte en fundamental al
Para los profesionales y estudiantes dentro el momento de encarar una investigación.
mundo académico y de la investigación, es
fundamental contar con herramientas que le
permitan:
Introducción
✔ Convertir la teoría en práctica Scilab es un software matemático, con un
lenguaje de programación de alto nivel, para
✔ Realizar tareas de forma automática cálculo científico, interactivo de libre uso y
✔ Realizar cálculos matemáticos de disponible en múltiples sistemas operativos.
forma más cómoda, sencilla, rápida y Scilab contiene numerosas herramientas,
confiable. entre las que destacan: gráficos 2-D y 3-D,
✔ Valerse de estas herramientas para animación, álgebra lineal, matrices dispersas,
2. Polinomios y funciones racionales, ✔ Resolución de sistemas de
Simulación: programas de resolución de ecuaciones lineales y ecuaciones
sistemas de ecuaciones diferenciales diferenciales
(explícitas e implícitas), Xcos: simulador por
✔ Creación y definición de funciones
diagramas en bloque de sistemas dinámicos
propias
híbridos, Control clásico, robusto,
optimización LMI, Optimización diferenciable ✔ Creación y utilización de funciones
y no diferenciable, Tratamiento de señales, destinadas a aplicaciones específicas
Grafos y redes, Scilab paralelo empleando denominados “Toolboxes”, con
PVM, Estadísticas, Creación de GUIs, aplicación al Control, Optimización,
Interfaz con el cálculo simbólico (Maple, Redes Neurales, etc.
MuPAD), Interfaz con TCL/TK.
Otra de sus ventajas es que se pueden Funciones incluidas
agregar numerosas herramientas o
toolboxes, hechas por los usuarios como ✔ Entrada/Salida
Grocer una herramienta para Econometría u ✔ Gráficas
Open FEM (Una caja de Herramientas para
Elementos Finitos), hecha por INRIA. ✔ Manejo de matrices
✔ Álgebra lineal
Requerimientos ✔ Ecuaciones no lineales
Para su instalación se puede hacer uso del ✔ Ecuaciones diferenciales
gestor de paquetes propio de cada ✔ Optimización
distribución:
✔ Estadística
✔ YUM, para CentOs, Fedora
✔ Funciones financieras
✔ apt-get, para Debian, Ubuntu
✔ Conjuntos
Manejo de polinomios
Características ✔
✔ Teoría de control
✔ Se basa en un lenguaje orientado al
cálculo numérico simple y fácilmente ✔ Procesado de señales
asimilable ✔ Procesado de imágenes
✔ Proporciona una consola para el uso ✔ Procesado de audio
del interprete de forma interactiva
✔ Compatible con la mayoría las
instrucciones de Matlab Modos de trabajo
✔ Puede extenderse mediante el uso de En Scilab existen dos formas de trabajar:
procedimientos y funciones por medio ✔ Modo interactivo: Ejecución de
de módulos dinámicos cualquier expresión, programa o
✔ Capacidad de ser utilizado en función Scilab dentro del entorno. El
archivos script modo interactivo puede arrancarse en
modo ventana o en modo texto
✔ Es multiplataforma
✔ Modo ventana: $ scilab
✔ Generación de gráficos en dos y tres
dimensiones ✔ Modo texto: $ scilab -nw
✔ Operaciones matriciales ✔ Modo bash: Ejecución de un fichero
sin necesidad de entrar en el entorno
✔ Operaciones con polinomios y del programa.
funciones de transferencia
4. -->2|2
Operaciones ans =
T
Operación Descripción
+ Adición suma Comparación entre vectores
-->[2 4 6 8] <= [5 2 7 8]
– Sustracción resta ans =
T F T T
* Multiplicación
Comparación entre matrices
' Traspuesta
-->[1 3; 5 7] <= [5 2; 6 7]
ans =
^ Potenciación T F
T T
División-izquierda
/ División-derecha Variables
En Scilab, las variables no son declaradas:
.* Producto elemento a su tipo y su tamaño cambian de forma
elemento dinámica de acuerdo con los valores que le
son asignados. Así, una misma variable
./ y . División elemento a puede ser utilizada para almacenar en
elemento distintos tiempos un valor de tipo distinto. Las
variables se crean automáticamente al
.^ Elevar a una potencia
asignarles un contenido.
elemento a elemento
Es importante comprender que el uso de
== ~= (ó mayúsculas y minúsculas en el nombre de
<>) una variable hace que esta sea distinta una
<> de la otra.
Operadores de comparación
<= En Scilab es importante determinar que
variables tenemos a disposición en un
>= determinado instante, eliminar variables, etc;
para esto podemos hacer uso de los
& siguientes comandos utiles para la gestión de
| Operadores lógicos variables.
~
Función Descripción
Comparación de escalares who lista las variables actuales
-->2>5
ans = whos como el anterior, pero más
F detallado
clear elimina todas las variables
-->2&2 que existan en ese
ans = momento
T
clear a b c elimina las variables a, b y
c (atención: sin comas!)
browsevar() abre, en ventana aparte, un
5. “ojeador” de la memoria de date() Devuelve la Fecha actual
trabajo de Scilab: permite
“ver” el contenido y
características de las Funciones
variables e, incluso, editar
su valor. Scilab por defecto incluye una amplia
variedad de funciones, entre las más
utilizadas podemos destacar:
Formatos
Por defecto, Scilab muestra los números en Función Descripción
formato variable con 10 dígitos. Se puede
modificar esto mediante el comando format sqrt(x) raiz cuadrada de x
abs(x) módulo de x
Función Descripción
conj(z) complejo conjugado de z
format(14) 14 dígitos
real(z) parte real de z
format(‘e’) formato científico o
exponencial, coma flotante imag(z) parte imaginaria de z
format(‘v’) formato variable (por exp(x) exponencial de x
defecto)
log(x) logaritmo natural de x
format(‘v’,20) formato variable con 20
dígitos log10(x) logaritmo decimal de x
format(‘e’,15) formato científico con 15 rat(x) aprox. Racional de x
dígitos
modulo(x,y) resto de dividir x por y
floor(x) valor entero más próximo
Algunos utilitarios hacia -∞
Dentro de Scilab muchas veces tenemos la
necesidad de incluir ficheros o variables de ceil(x) valor entero más próximo
sistema, para esto están disponibles algunos hacia +∞
comandos utilitarios, como:
sin(x) seno
cos(x) coseno
Función Descripción
tan(x) tangente
ls Lista de ficheros del directorio
actual (como Unix) asin(x) arco seno
dir Lista de ficheros del directorio acos(x) arco coseno
(de otra forma)
atan(x) arco tangente (devuelve un
pwd Devuelve el nombre y path del ángulo entre -90 y 90
directorio actual grados)
cd Para cambiar de directorio sinh(x) seno hiperbólico
clc Limpia la ventana de comandos cosh(x) coseno hiperbólico
6. lu(A) factorización LU de la matriz A
tanh(x) tangente hiperbólica chol(A) factorización de Cholesky de la
matriz A
asinh(x) arco seno hiperbólico
qr(A) factorización QR de la matriz A
acosh(x) arco coseno hiperbólico
atanh(x) arco tangente hiperbólica Algunos ejemplos de estas operaciones la
mostramos a continuación:
Algunas funciones -->x=[2 6 4 8 12 10]
x =
estadísticas y matemáticas 2. 6. 4. 8. 12. 10.
Función Descripción
-->max(x)
max() Valor máximo de un vector ans =
12.
min() Valor mínimo de un vector
-->min(x)
sum() La suma de los elementos de ans =
2.
un vector
prod() Producto de los elementos de -->median(x)
un vector ans =
7.
median() La media de un vector
-->gsort(x)
std() Desviación estándar de un ans =
12. 10. 8. 6. 4. 2.
vector
gsort() Ordena los elementos de un ->m
vector m =
1. 2. 3.
4. 5. 6.
size(A) Devuelve, en un vector fila, las 7. 8. 9.
dimensiones de la matriz A
size(A,'r') Número de filas/columnas de -->length(m)
ans =
la matriz A 9.
size(A,'c')
length(A) Devuelve un escalar con el -->size(m)
número de elementos de la ans =
matriz A: si A es una vector, 3. 3.
length(A) es su longitud; si A
es una matriz length(A) es el -->size(m,'r')
producto de sus dimensiones ans =
3.
det(A) Determinante de la matriz
cuadrada A -->size(m,'c')
ans =
rank(A) Rango de la matriz 3.
inv(A) Inversa de la matriz A
7. -->rank(m)
ans =
e,f,n) logarítmicamente espaciados
2. desde 10^e hasta 10^f, es
decir
Algunas funciones logspace( Como el anterior, pero se
matriciales e,f) asume n=50
Función Descripción
Nota: Scilab brinda la posibilidad de poder
diag(v) Si v es un vector, diag(v) es crear nuestras propias funciones y ponerlas
una matriz cuadrada de ceros disponibles dentro de nuestras aplicaciones.
con diagonal principal = v
Algunos ejemplos de estas operaciones la
diag(A) Si A es una matriz, diag(A) es mostramos a continuación:
un vector = diagonal principal
de A -->v=[1 2 3]
v =
1. 2. 3.
diag(A,k) Si A es una matriz y k es un
entero, diag(A,k) es un vector
= k-ésima sub o super -->diag(v)
ans =
diagonal de A (según sea k<0 1. 0. 0.
ó k>0) 0. 2. 0.
0. 0. 3.
tril(A) Triangular inferior de A
triu(A) Triangular superior de A -->w=[4 5 6]
w =
zeros(n,m) matriz nxm con todas sus 4. 5. 6.
componentes iguales a cero
-->w'
ones(n,m) matriz nxm con todas sus ans =
componentes iguales a uno 4.
5.
6.
eye(n,m) matriz unidad: matriz nxm con
diagonal principal =1 y el
resto de las componentes =0 -->m=[1 2 3;4 5 6;7 8 9]
m =
1. 2. 3.
matrix(A,n Re-dimensiona una matriz: si 4. 5. 6.
,m) A es una matriz hxk, 7. 8. 9.
matrix(A,n,m) es otra matriz
con los mismos elementos
-->m'
que A, pero de dimensiones ans =
nxm (tiene que ser h*k=n*m) 1. 4. 7.
2. 5. 8.
linspace(a Si a y b son números reales y 3. 6. 9.
,b,n) n un número entero, genera
una partición regular del -->mat=[v;w;0 1 0]
intervalo [a,b] con n nodos (n- mat =
1 subintervalos) 1. 2. 3.
4. 5. 6.
0. 1. 0.
linspace(a Como el anterior, pero se
,b) asume n=100
logspace( Vector con n elementos
8. -->zeros(m) precedidos de un punto deben entenderse en
ans =
0. 0. 0.
el sentido de que la operación se efectúa
0. 0. 0. elemento a elemento.
0. 0. 0.
-->ones(w) Función Descripción
ans =
1. 1. 1. A+B (A-B) matriz de elementos aij + bij
( aij - bij ) (si dimensiones
-->size(m) iguales)
ans =
3. 3. A*B producto matricial de A y B
(si dimensiones
-->v adecuadas)
v =
1. 2. 3. A^k matriz A elevada a la
-->diag(v)
potencia k
ans =
1. 0. 0. A+k matriz de elementos aij + k
0. 2. 0.
0. 0. 3. A-k matriz de elementos aij - k
-->m k*A matriz de elementos k * aij
m =
1. 2. 3. A/k =(1/k)*A matriz de elementos aij / k
4. 5. 6.
7. 8. 9.
A^k matriz A elevada a la
-->diag(m) potencia k: si k entero>0,
ans = A^k=A*A*...*A
1.
5. si k entero <0, A^k=
9. (inv(A))^(-k)
si no, A^k se calcula por
-->m diagonalización
m =
1. 2. 3.
4. 5. 6. k./A matriz de elementos k / aij
7. 8. 9.
A.^k matriz de elementos ( aij ) ^
k
-->tril(m)
ans =
1. 0. 0. k.^A matriz de elementos k ^
4. 5. 0. ( aij)
7. 8. 9.
A.*B matriz de elementos aij * bij
-->triu(m) (si dimensiones iguales)
ans =
1. 2. 3. A./B matriz de elementos aij / bij
0. 5. 6. (si dimensiones iguales)
0. 0. 9.
A.^B matriz de elementos aij ^ bij
Operaciones matriciales (si dimensiones iguales)
Los operadores aritméticos representan las
correspondientes operaciones matriciales
siempre que tengan sentido. Cuando van
9. Algunos ejemplos de estas operaciones la -->a
a =
mostramos a continuación: 1. 2.
3. 4.
-->a=[1 2;3 4]
a =
1. 2. -->a+y
3. 4. ans =
3. 4.
-->det(a) 5. 6.
ans =
- 2.
-->a*y
ans =
-->a 2. 4.
a = 6. 8.
1. 2.
3. 4.
-->a^y
ans =
-->prod(a)
7. 10.
ans =
15. 22.
24.
-->sum(a) -->a.^y
ans = ans =
10. 1. 4.
9. 16.
-->b=[-2 -4;-6 -8]
b =
- 2. - 4.
Funciones para operar con
- 6. - 8. matrices
-->abs(b)
ans =
2. 4.
Función Descripción
6. 8.
sum(A) suma de las componentes
de la matriz A
-->a
a = sum(A,1) es un vector fila (row)
1. 2. conteniendo la suma de
sum(a;'r')
3. 4. elementos de cada columna
de A
-->a+a
ans = sum(A,2) es un vector columna
2. 4. conteniendo la suma de
6. 8. sum(a;'c')
elementos de cada fila de A
-->a*a trace(A) traza de A : sum(diag(A))
ans =
7. 10. prod(A) producto de las
15. 22.
componentes de la matriz A
prod(A,1) es un vector fila (row)
-->y=2 conteniendo el producto los
y = prod(A,'r')
2.
elementos de cada columna
de A
prod(A,2) es un vector columna
10. prod(A,'c') conteniendo el producto de Función Descripción
elementos de cada fila de A
v(i) Si v es un vector es vi
max(A) máximo de las componentes
de la matriz A A(i,j) Si A es una matriz, es aij
max(A,'r')
máximos de columnas y filas A(k) Si A es una matriz, es el k-
max(A,'c')
respectivamente ésimo elemento de A, en el
orden en que está almacenada
mean(A) media de las componentes en la memoria (por columnas)
de la matriz A medias de
mean(A,'r')
columnas y filas
mean(A,'c') respectivamente Pero Scilab posee un buen número de
facilidades para designar globalmente un
norm(v) norma euclídea del vector v conjunto de elementos de una matriz o
norm(v,2) vector, consecutivos o no. Algunos ejemplos
de ello:
norm(v,p) norma-p del vector v: -->A(2:3,1:2)
sum(abs(v).^p)^(1/p) // elementos de la fila 2 a la 3 y de las
columnas 1 a la 2
norm(v,'inf') norma infinito del vector v: -->A(:,2)
max(abs(v)) // representa la segunda columna de A
norm(v,
%inf) -->A(:,2:$)
// representa las columnas desde 2 hasta
norm(A) máximo autovalor de la la última
matriz A
norm(A,2) -->A(:)
// representa todos los elementos de A,
norm(A,1) norma-1 del matriz A: en una sola columna
máximo entre las sumas de
sus columnas: Interacción con lenguajes de
max(sum(abs(A),'r'))
programación
norm(A,'inf') norma infinito de la matriz A: Una de las grandes virtudes de Scilab es
máximo entre las sumas de brindar la posibilidad de ser utilizado desde
norm(A,
sus filas: una aplicación desarrollada en lenguajes de
%inf)
max(sum(abs(A),'c')) programación como: Python, Perl, C, C++;
cualidad que hace que se pueda reutilizar
esta poderosa herramienta desde el
desarrollo de nuestras propias aplicaciones.
Manipulación de los
elementos de una matriz
Referencias
Scilab permite una amplia manipulación de
los elementos de una matriz, algunos [1] http://www.scilab.org/
ejemplos de ello los mostramos a
continuación:
11. Autores
Pilar Castel Diaz Esteban Saavedra López
Centro de Investigación en Física y Presidente de la Fundación AtixLibre (Bolivia)
Matemáticas (ES) Activista de Software Libre en Bolivia
pilar.castel.diaz@gmail.com jesaavedra@opentelematics.org
esteban.saavedra@atixlibre.org
http://jesaavedra.opentelematics.org
http://www.atixlibre.org