Introducción A SciLab PDF
Introducción A SciLab PDF
Introducción A SciLab PDF
Introducción a
SCILAB
1 INTRODUCCIÓN 1
2 GENERALIDADES 3
2.1 Primeros pasos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Operaciones y funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Otros temas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4 Complejos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5 Polinomios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.6 Lista de algunas herramientas . . . . . . . . . . . . . . . . . . . . . . . . 11
3 VECTORES Y MATRICES 13
3.1 Creacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 Notacion y operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.3 Funciones elementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.4 Solucion de sistemas de ecuaciones . . . . . . . . . . . . . . . . . . . . . 20
3.5 Otras funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4 PROGRAMAS 22
4.1 Guiones (scripts) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2 Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.3 Carpeta actual o por defecto . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.4 Comparaciones y operadores logicos . . . . . . . . . . . . . . . . . . . . . 27
4.5 Ordenes y control de ujo . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.5.1 if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
ii
ÍNDICE GENERAL iii
4.5.2 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.5.3 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.5.4 select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.5.5 Otras ordenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.6 Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.6.1 Calculo numerico del gradiente . . . . . . . . . . . . . . . . . . . 33
4.6.2 Matriz escalonada reducida por las . . . . . . . . . . . . . . . . . 34
4.6.3 Aproximacion polinomial por m nimos cuadrados . . . . . . . . . 37
4.6.4 Factores primos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.7 Miscelanea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5 GRÁFICAS 43
5.1 Dos dimensiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2 Tres dimensiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3 Otras funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.4 Creacion de un archivo Postscript . . . . . . . . . . . . . . . . . . . . . . 49
6 MÉTODOS NUMÉRICOS 50
6.1 Sistemas de ecuaciones lineales . . . . . . . . . . . . . . . . . . . . . . . . 50
6.2 Solucion por m nimos cuadrados . . . . . . . . . . . . . . . . . . . . . . . 51
6.3 Una ecuacion no lineal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.4 Sistema de ecuaciones no lineales . . . . . . . . . . . . . . . . . . . . . . 53
6.5 Integracion numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
6.6 Derivacion numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.7 Interpolacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.8 Aproximacion por m nimos cuadrados . . . . . . . . . . . . . . . . . . . . 56
6.9 Ecuaciones diferenciales ordinarias . . . . . . . . . . . . . . . . . . . . . . 58
6.10 Sistema de ecuaciones diferenciales . . . . . . . . . . . . . . . . . . . . . 58
7 OPTIMIZACIÓN 60
7.1 Optimizacion lineal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.1.1 Desigualdades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
iv ÍNDICE GENERAL
INTRODUCCIÓN
Este documento es una peque~ na introduccion a Scilab. Esta lejos de ser exhaustivo con
respecto a los temas, es decir, muchos de los temas y posibilidades de Scilab no son
tratados aqu . Ademas, tampoco es exhaustivo con respecto al contenido de cada tema,
solo estan algunos aspectos de cada tema.
El autor estara muy agradecido por los comentarios, sugerencias y correcciones enviados
a:
[email protected] o [email protected]
Scilab fue desarrollado en el INRIA, Institut National de Recherche en Informatique et
Automatique, un excelente instituto frances de investigacion. Posteriormente colaboro
la escuela de ingenieros ENPC, Ecole Nationale de Ponts et Chaussees.
Actualmente hay un gran consorcio con empresas como Renault, Peugeot-Citroen, CEA
Commissariat a l’Energie Atomique, CNES Centre National d’Etudes spatiales, Dassault
Aviation, EDF Electricite de France, Thales...
Sus principales caracter sticas son:
• interactivo
• programable
1
2 CAPÍTULO 1. INTRODUCCIÓN
All se encuentra informacion general, manuales, FAQs (frequent asked questions), ref-
erencias sobre reportes, diferencias con Matlab, lista de errores, ... All se puede \bajar"
la version binaria o las fuentes para las diferentes plataformas.
Un libro bastante completo sobre el tema es:
Gomez C. ed.,
Engineering and Scientific Computing with Scilab,
Birkhauser, Boston, 1999.
Otros libros son:
• Yger A., Théorie et analyse du signal : Cours et initiation pratique via MATLAB
et SCILAB (1 decembre 1999) Ellipses, Paris, 1999.
• Urroz G., Numerical and Statistical Methods With Scilab for Science and Engi-
neering, vol. 1, 2, Booksurge, 2001.
• Gomez C., Bunks C. et al., Integrated Scientific Computing with SciLab, Birkhauser,
Boston, 1998
La utilizacion es igual para las diferentes plataformas, pero obviamente hay algunas
diferencias intr nsecas al usar una u otra plataforma. Este peque~no manual se re ere
principalmente a la version 3.0 para Linux y para Windows (la ultima, a la fecha de
hoy: 1 de abril del 2005).
Deseo agradecer a todos los que tuvieron que ver con la creacion y actualizacion de
Scilab. Realmente es una herramienta de uso libre muy poderosa. Me ha sido muy util
para mi trabajo personal y para mis clases en la Universidad.
Tambien deseo manifestar mi agradecimiento a todas las personas que de una u otra
forma me han ayudado a corregir, modi car, actualizar y mejorar este documento, en
particular, a Manuel Mej a.
Capı́tulo 2
GENERALIDADES
-------------------------------------------
Scilab-3.0
Startup execution:
loading initial environment
-->
A partir de ese momento se puede escribir al frente de --> las ordenes de Scilab.
Estas deben ser acabadas oprimiendo la tecla Enter , denominada tambien Intro o
simplemente ←−| .
3
4 CAPÍTULO 2. GENERALIDADES
t =
3.5
-->
ans =
8.
Las asignaciones pueden incluir operaciones con variables ya de nidas, por ejemplo
x = t+T
Si se da la orden
t = 2*t
se utiliza el antiguo valor de t para la operacion, pero, despues de la orden, t queda
valiendo 7.
Si se quiere conocer el valor de una variable ya de nida, basta con digitar el nombre de
la variable y oprimir Enter.
Es posible volver a repetir facilmente una orden dada anteriormente a Scilab. Utilizando
las teclas correspondientes a las echas hacia arriba y hacia abajo, se obtiene una orden
anterior y se activa oprimiendo ←−| . Por ejemplo al repetir varias veces la orden
x = (x+3/x)/2
√
se obtiene una aproximacion muy buena de 3.
Tambien es posible, por medio de las echas (hacia arriba y hacia abajo), buscar una
orden anterior para editarla y enseguida activarla.
6 CAPÍTULO 2. GENERALIDADES
En una misma l nea de Scilab puede haber varias ordenes. Estas deben estar separadas
por coma o por punto y coma. Por ejemplo,
t1 = 2, t2 = 3; dt = t2-t1
Otra funcion matematica, esta ya con dos parametros de entrada, es modulo. Sus dos
parametros deben ser enteros. El resultado es el residuo de la division entera.
modulo(17,5)
da como resultado 2.
Para tener informacion mas detallada sobre alguna funcion basta con digitar help y a
continuacion el nombre de la funcion o de la orden. Por ejemplo
help floor
Obviamente se requiere que la funcion floor exista. Si no se conoce el nombre de la
funcion, pero se desea buscar sobre un tema, se debe utilizar apropos. Por ejemplo:
apropos polynomial
da informacion sobre las funciones que tienen que ver con polinomios. En cambio,
help polynomial
informa que no hay manual para polynomial.
Ademas de estas funciones elementales, Scilab tiene muchas mas funciones como las
funciones de Bessel, la funcion gama, ... Mediante la barra de menu, con la opcion
Help seguida de Help Dialog se obtiene un catalogo resumido de las herramientas
de Scilab.
La lista de funciones elementales de Scilab es la siguiente:
2.4 Complejos
Scilab maneja de manera sencilla los numeros complejos. Estos pueden ser de nidos de
varias maneras. Por ejemplo, suponiendo que r vale −5, las dos ordenes siguientes
a = 3 + 4*r*%i
b = sqrt(-4)
de nen dos variables, a = 3 − 20i, b = 2i.
Para las operaciones con numeros complejos (suma, resta, multiplicacion, ...) se
utilizan exactamente los mismos s mbolos + - * / ** ^.
Las funciones real, imag y conj permiten obtener la parte real, la parte imaginaria
y el conjugado de un complejo. Si se utiliza la funcion abs con un complejo, se obtiene
la magnitud o modulo de el.
Las funciones de Scilab usadas para funciones reales elementales que tienen generaliza-
ciones en complejos, se pueden usar tambien para los complejos, por ejemplo, sin,
10 CAPÍTULO 2. GENERALIDADES
r =
3.853738 - 27.016813i
2.5 Polinomios
Un polinomio se puede de nir de dos maneras: por sus coe cientes o por sus ra ces. Es
necesario ademas indicar la variable simbolica para el polinomio. La orden
p = poly([2 3 5 7], "x", "coeff")
de ne en la variable p el polinomio 2 + 3x + 5x2 + 7x3 . La orden
q = poly([2 3 5], "x", "roots")
de ne en la variable q el polinomio −30+31x−10x2 +x3 cuyas ra ces son exactamente
2, 3 y 5. Escribir q = poly([2 3 5], "x") produce exactamente el mismo resultado,
o sea, "roots" es el tipo de de nicion por defecto.
La doble comilla " puede ser reemplazada por la comilla sencilla ’. Mas aun, se
puede reemplazar ’coeff’ por ’c’ y ’roots’ por ’r’ . Es l cito escribir
r = poly([6 7 8], ’y’, ’c’) .
La funcion roots calcula las ra ces de un polinomio, sean estas reales o complejas. Por
ejemplo
roots(p)
Con polinomios se pueden hacer sumas, multiplicaciones, restas, multiplicacion por un
numero. Deben ser polinomios en la misma variable. Por ejemplo:
v = p + q + p*q - 3.1*q
Tambien se puede elevar un polinomio a una potencia, por ejemplo,
r = p^3
La funcion coeff tiene dos parametros, el primero es el polinomio y el segundo la
potencia. La siguiente orden asigna a la variable k el valor −10, el coe ciente de x 2
en el polinomio q.
k = coeff(q, 2)
Si se utiliza simplemente
c = coeff(q)
2.6. LISTA DE ALGUNAS HERRAMIENTAS 11
se obtendran todos los coe cientes. La variable c sera un vector (ver cap tulo siguiente
sobre matrices y vectores).
Si se utiliza p = poly(a,’x’), donde a es una matriz cuadrada (ver cap tulo sigu-
iente sobre matrices y vectores), se obtiene el polinomio caracter stico de de la matriz
a.
Para evaluar un polinomio p en un valor t se usa
horner(p, t)
Por ejemplo horner(q, 1) dara como resultado −8. Si q es un polinomio, es l cito
utilizar la orden
r = horner(p, q)
para obtener p(q(x)).
• Optimizacion
• Procesamiento de se~
nales
• Simulacion
• Funciones de distribucion
• Control robusto
VECTORES Y MATRICES
En Scilab no hay vectores como tales, los vectores se deben asimilar a matrices de una
sola la o vectores la (tama~ no 1 × n) o a matrices de una sola columna o vectores
columna (tama~no n × 1).
3.1 Creación
La matriz
11 12 13 14 15
21 22 23 24 25
31 32 33 34 35
se puede de nir por medio de
a = [ 11 12 13 14 15; 21 22 23 24 25; 31 32 33 34 35]
o tambien por medio de
a = [ 11,12,13,14,15; 21,22,23,24,25; 31,32,33,34,35]
o por
a = [ 11 12 13 14 15
21 22 23 24 25
31 32 33 34 35]
a =
13
14 CAPÍTULO 3. VECTORES Y MATRICES
La de nicion de la matriz se hace por las. Los elementos de una misma la se separan
por medio de espacios en blanco o por medio de comas. Una la se separa de la siguiente
por medio de punto y coma o por medio de cambio de l nea.
Scilab permite crear rapidamente algunos tipos especiales de matrices:
ones(4,5) es una matriz de unos de tama~
no 4 × 5
zeros(4,5) es una matriz de ceros de tama~
no 4 × 5
rand(20,30) es una matriz aleatoria de tama~
no 20 × 30
eye(4,4) es la matriz identidad de orden 4
Algunas veces es util, especialmente para gra cas de funciones (tema que se vera en un
cap tulo posterior), crear vectores con elementos igualmente espaciados, por ejemplo
x = [1 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6]
Esto tambien se puede hacer mas facilmente as :
x = 1:0.2:2.6
Los valores 1.0, 0.2 y 2.6 corresponden respectivamente al l mite inferior, al incremento
y al l mite superior. Si no se especi ca incremento se supone que es uno. Escribir
y = 2:9 es equivalente a y = 2:1:9. Cuando se desea una columna basta con utilizar
el operador de trasposicion, por ejemplo, z = (1:0.2:2.6)’
x =
! 2. 5. 7. 11. !
1 1 1
eC = I + C + C 2 + C 3 + C 4 + · · ·
2 6 24
• diag(c) produce un vector columna con los elementos diagonales de la matriz
cuadrada c.
• diag(x) produce una matriz diagonal con los elementos del vector ( la o columna)
x.
• m = mean(a, ’c’) : m es un vector columna que contiene los promedios las las
de a.
max |xi |.
1≤i≤n
m X
n
!1/2
X
a2ij .
i=1 j=1
• Por medio de tril se puede obtener la parte triangular inferior (low) de una
matriz cuadrada. Por ejemplo,
a = [1 2 3; 4 5 6; 7 8 9]; L = tril(a)
produce el resultado
L =
! 1. 0. 0. !
! 4. 5. 0. !
! 7. 8. 9. !
A = QR
P A = LU
PROGRAMAS
En Scilab hay dos tipos de programas: los guiones o libretos (scripts) y las funciones.
Un guion es simplemente una secuencia de ordenes de Scilab. No tiene parametros
(\argumentos") de entrada ni de salida. En cambio una funcion s los tiene.
Por otro lado, las variables de nidas en un guion son globales, es decir, despues del
llamado del guion estas variables siguen existiendo. En cambio en una funcion, las
variables de nidas dentro de la funcion dejan de existir una vez nalizada la ejecucion
de la funcion, son variables locales.
22
4.1. GUIONES (SCRIPTS) 23
n = 100;
A = rand(n,n);
x0 = rand(n,1);
b = A*x0;
x = A\b;
residuo = norm(x-x0)
Sea c:\estad\ensayo02.sce el archivo que de ne los datos y lleva a cabo este pro-
ceso. Su contenido puede ser:
24 CAPÍTULO 4. PROGRAMAS
Las l neas que empiezan por // son l neas de comentarios (como en C++).
Obviamente para activar este otro archivo se necesita dar la orden
exec c:\estad\ensayo02.sce
De manera natural aparece la pregunta: ¿Cómo hacer el mismo proceso con otro sistema
de ecuaciones sin tener que cambiar el archivo? Las funciones son la respuesta.
4.2 Funciones
En un archivo ASCII puede haber varias funciones. Generalmente el nombre de los
archivos de funciones tienen la extension .sci. El esquema general de una funcion es
el siguiente:
function [res1, res2, ...] = nombrefuncion(par1, par2, ...)
...
...
endfunction
El signi cado de res1 es resultado 1 o tambien parametro de salida 1. El signi cado
de par2 es parametro de entrada 2 o simplemente parametro 2. Cuando la funcion
tiene un unico resultado, el esquema puede ser simplemente:
function result = nombrefuncion(par1, par2, ...)
...
...
endfunction
El siguiente archivo llamado c:\misci\misfunc.sci tiene varias funciones
endfunction
//--------------------------------------------------------
function [x, y] = polarCart(r, t)
// Conversion de coordenadas polares a cartesianas.
x = r*cos(t)
y = r*sin(t)
endfunction
//--------------------------------------------------------
function [x, y] = polarCartGr(r, t)
// Conversion de coordenadas polares a cartesianas,
// el angulo esta dado en grados.
[x, y] = polarCart(r, t*%pi/180)
endfunction
//--------------------------------------------------------
function fx = f(x)
fx = x(1)^2 + x(2)^2
endfunction
Cuando una funcion produce mas de un resultado, tambien se puede utilizar asig-
nando menos de los resultados previstos. Por ejemplo, la utilizacion completa de
polarCartGr puede ser
[a, b] = polarCartGr(3,30)
lo cual produce el resultado
b =
26 CAPÍTULO 4. PROGRAMAS
1.5
a =
2.5980762
En cambio, la orden
c = polarCartGr(3,30)
produce el resultado
c =
2.5980762
Otra caracter stica de las funciones es que una funcion puede llamar una o varias fun-
ciones. Observese que la funcion polarCartGr utiliza la funcion polarCart.
En los ejemplos anteriores de funciones, hay simplemente una secuencia de ordenes que
siempre se repite de la misma manera. Con mucha frecuencia esto no es as . Normal-
mente dentro de una funcion, dependiendo de los datos o de resultados intermedios, hay
que tomar algunas decisiones, repetir un proceso, abortar un proceso, ... Esto se logra
mediante los operadores relacionales, los operadores logicos y las estructuras de control.
Esto se vera en secciones posteriores de este mismo cap tulo.
ans =
C:\WINDOWS\Escritorio
ans =
/home/h
4.4. COMPARACIONES Y OPERADORES LÓGICOS 27
Esto quiere decir que si un archivo de funciones o un archivo tipo guion estan ubicados
all , no es necesario, al utilizar getf o exec, escribir la ubicacion completa del archivo,
basta dar el nombre del archivo. Por ejemplo, si el archivo ejemplo4.sce esta en la
carpeta C:\WINDOWS\Escritorio, no es necesario, dar la orden
exec \WINDOWS\Escritorio\ejemplo4.sce
Basta digitar
exec ejemplo4.sce
Para decir a Scilab que cambie la carpeta por defecto, se usa la orden chdir, por
ejemplo,
chdir ’c:\algebra\matrices\’
• if
• select y case
• for
• while
4.5.1 if
4.5.2 for
La estructura for tiene la siguiente forma:
for var = lim1:incr:lim2
...
...
end
Esto quiere decir que la variable var empieza en el l mite inferior lim1, despues va
incrementar el valor en el incremento incr (puede ser negativo). Si el incremento es
1, este se puede suprimir. A continuacion algunos ejemplos.
for i = 2:3:14
...
...
end
for j = 2:-3:-10
...
...
end
for k = 2:8
...
...
end
Una estructura for puede estar anidada dentro de otro for o dentro de un if.
4.5.3 while
La forma general es:
while condición
...
...
end
Por ejemplo
e = 1;
while e+1 > 1
e = e/2;
end
30 CAPÍTULO 4. PROGRAMAS
4.5.4 select
...
...
end
Por ejemplo
select indic
case 0, a = b;
case 1
a = b*b;
b = 1;
case 3
a = max(a,b);
b = a*a;
else
a = 0;
b = 0;
end
indic = 0
maxcd = 0
if round(a) ~= a | round(b) ~= b
return
end
if a < 1 | b < 1
return
32 CAPÍTULO 4. PROGRAMAS
end
if a < b
t = a
a = b
b = t
end
indic = 1
while 1 == 1
r = modulo(a, b)
if r == 0
maxcd = b
return
end
a = b
b = r
end
endfunction
En el ejemplo anterior, el ultimo return esta anidado en un solo bucle y despues acaba
la funcion, luego se podr a cambiar por un break. La condicion del while siempre
es cierta, luego la salida del bucle se obtiene siempre en la mitad del cuerpo del while.
En una funcion no es necesario el punto y coma despues de una orden, pues de todas
maneras Scilab no muestra el resultado de la asignacion (en Matlab si es necesario el
punto y coma). Si de nitivamente, en una funcion, se desea mostrar en pantalla algunos
valores intermedios se debe hacer por medio de disp o por medio de printf. Por
ejemplo, despues del calculo de r se puede utilizar la orden
disp(a, b, r)
Observe que primero escribe el valor de r, despues el de b y nalmente el de a.
La orden printf es una emulacion de la orden del mismo nombre del lenguaje C. Por
ejemplo se podr a utilizar la orden
printf(’ a = %3d b = %3d r = %3d\n’, a, b, r)
Esta emulacion utiliza una comilla en lugar de la comilla doble. El s mbolo \n se
utiliza para cambio de l nea.
Otras ordenes que se pueden utilizar para escritura son:
fprintf
print
write
4.6. EJEMPLOS 33
4.6 Ejemplos
Los siguientes ejemplos, son simplemente casos que pretenden ilustrar la manera de
programar en Scilab. En ellos se busca mas la claridad que la e ciencia numerica.
//--------------------------------------------------------
function fx = f(x)
fx = 3*x(1)^2 + 5*x(2)
endfunction
//--------------------------------------------------------
function g = gradf(x)
// gradiente de la funcion f en el punto x
//********
h = 0.001
//********
h2 = 2*h
n = max(size(x))
g = zeros(n,1)
for i =1:n
xi = x(i)
x(i) = xi+h
f1 = f(x)
x(i) = xi-h
f2 = f(x)
x(i) = xi
g(i) = (f1-f2)/h2
end
endfunction
Habiendo cargado, mediante getf ..., el archivo que contiene estas dos funciones, su
uso se puede hacer mediante ordenes semejantes a:
34 CAPÍTULO 4. PROGRAMAS
//--------------------------------------------------------
function fx = func1(x)
fx = 3*x(1)^2 + 5*x(2)
endfunction
//--------------------------------------------------------
function fx = func2(x)
fx = 3*x(1) + 5*x(2)^3
endfunction
//--------------------------------------------------------
function g = grad(funcion, x)
// gradiente de funcion en el punto x
//********
h = 0.001
//********
h2 = 2*h
n = max(size(x))
g = zeros(n,1)
for i =1:n
xi = x(i)
x(i) = xi+h
f1 = funcion(x)
x(i) = xi-h
f2 = funcion(x)
x(i) = xi
g(i) = (f1-f2)/h2
end
endfunction
//--------------------------------------------------------
Algebra Lineal es que se hace pivoteo parcial, es decir, se busca que el pivote sea lo mas
grande posible en valor absoluto con el n de disminuir los errores de redondeo. Si la
posicion del pivote es (i, j), entonces se busca el mayor valor absoluto en las posiciones
(i, j), (i + 1, j), ..., (m, j) y se intercambia la la i con la la del mayor valor absoluto.
Esta funcion merf permite escribir en pantalla resultados parciales de los calculos
mediante la funcion escrMatr que a su vez llama la funcion escrVect.
En merf se utiliza argn(2) que indica el numero de parametros en el llamado a
la funcion y permite de nir los dos ultimos por defecto. El llamado merf(A) es
equivalente a merf(A, 1.0e-12, 0) . El llamado merf(A, 1.0e-7) es equivalente a
merf(A, 1.0e-7, 0). Para una matriz cualquiera, la orden norm(rref(a)-merf(a))
debe producir un valor muy cercano a cero.
//*********************
formato = ’%10.4f’
numNumerosPorLinea = 5
//*********************
nnl = numNumerosPorLinea
if argn(2) == 2
printf(’%s :\n’, titulo)
end
[m, n] = size(A)
for i=1:m
escrVect(A(i,:))
end
endfunction
//--------------------------------------------------
function a = merf(A, eps0, IRP)
if argn(2) == 1
eps0 = 1.0e-12
IRP = 0
end
if argn(2) == 2
IRP = 0
end
[m, n] = size(a)
eps0 = eps0*max(abs(A))
a = A
i = 1
j = 1
if IRP == 1
printf(’interc. filas %d y %d\n’, i, imax)
escrMatr(a)
end
end
aij0 = a(i,j)
a(i,j+1:n) = a(i,j+1:n)/a(i,j)
a(i,j) = 1
if IRP == 1
printf(’dividir fila %d por el pivote: %f\n’, i, aij0)
escrMatr(a)
end
for k = 1:m
if k ~= i
a(k,j+1:n) = a(k,j+1:n) - a(k,j)*a(i,j+1:n)
a(k,j) = 0.0
end
end
if IRP == 1
printf(’buscar ceros en la columna %d\n’, j)
escrMatr(a)
end
i = i+1
else
a(i:m,j) = zeros(m+1-i,1)
end
j = j+1
end
endfunction
resolver (AT A) c = AT y,
donde,
T
c = c0 c1 c2 ... cn ,
p(x) = c0 + c1 x + c2 x2 + · · · + cn xn ,
y~ = Ac.
x = x(:)
y = y(:)
[m, nx ] = size(x)
[my, ny ] = size(y)
if nx > 1 | ny > 1
printf(’x, y deben ser vectores.\n’)
return
end
if m <> my
4.6. EJEMPLOS 39
ind = 1
A = zeros(m,n+1)
for i=1:m
A(i,1) = 1
xi = x(i)
xij = 1
for j =1:n
xij = xij*xi
A(i,j+1) = xij
end
end
if m == n+1
c = A\y
else
c = (A’*A)\(A’*y)
end
p = poly(c, ’x’, ’c’)
yy = A*c
endfunction
40 CAPÍTULO 4. PROGRAMAS
p = 0
indic = 0
if n < 2
printf(’PRIMERDIV: n < 2.\n’), return
end
if int(n) <> n
printf(’PRIMERDIV: n no es entero.\n’), return
end
ind = 1
n1 = floor(sqrt(n))
for p =2:n1
if modulo(n, p) == 0, return, end
end
p = n
endfunction
//--------------------------------------------------------
function [p, indic] = factores(n)
// Construccion del vector fila p con los factores
// primos del entero n >= 2.
// El producto de los elementos de p sera n.
// indic valdra 0 si n es un dato malo,
// 1 si el proceso se realizo bien.
p = []
indic = 0
4.7. MISCELÁNEA ’FACTORES:9e8.916.695A6 Tf 361.049e8.9924( )Tj -1. ..\n’),10 0 9.123.1 0 0 cretur10
42 CAPÍTULO 4. PROGRAMAS
x = [ -2 -1.0e-10 -1.0e-20 4]
y = [ 3 3 3 3]
res = ( x <= y )
x = [ -2 -1.0e-10 -1.0e-20 4 ]
res = ( abs(x) >= 1.0e-16 )
x = [ -2 -1.0e-10 -1.0e-20 4 ]
p = find( abs(x) >= 1.0e-16 )
GRÁFICAS
a = -2; b = 3;
x = a:0.01:b;
y = sin(x);
plot2d(x, y)
1.0
0.8
0.6
0.4
0.2
0
−0.2
−0.4
−0.6
−0.8
−1.0
−2 −1 0 1 2 3
43
44 CAPÍTULO 5. GRÁFICAS
Obviamente los vectores x, y tienen el mismo tama~ no. Los valores de x se tomaron
con un espaciamiento de 0.01. Esto hace que la gra ca se vea, no solo continua sino
tambien suave. Si el espaciamiento es muy grande, por ejemplo,
a = -2; b = 3;
x = a:0.5:b;
y = sin(x);
plot2d(x, y)
dara una gra ca continua pero poligonal y no suave. De hecho siempre Scilab hace l neas
poligonales, pero si el espaciamiento es muy peque~
no la l nea poligonal se confunde con
una curva suave. En resumen, el espaciamiento debe ser peque~ no, pero es ino cioso
hacerlo muy peque~ no.
Las ordenes siguientes permiten obtener la gra ca de una parabola:
a = -2; b = 3;
x = a:0.05:b;
y = 0.5*x.*x - 2;
plot2d(x, y)
En una sesion de Scilab, la primera vez que se hace una gra ca, esta aparece inmedia-
tamente en la pantalla. Cuando se da la orden para una segunda gra ca, esta es creada
pero no aparece automaticamente en la pantalla. Es necesario, mediante un clic, activar
la ventana de la gra ca.
Muy posiblemente despues de la segunda orden plot2d, en la gra ca apareceran las dos
\curvas" superpuestas. Para limpiar la ventana gra ca se utiliza xbasc(). Observe la
diferencia entre los dos grupos de ordenes siguientes:
plot2d(x,sin(x))
plot2d(x,cos(x))
plot2d(x,sin(x))
xbasc(), plot2d(x,cos(x))
plot2d(x, [y z] )
cuyo efecto es tener en la misma gura las gra cas producidas por las ordenes plot2d(x,y)
y plot2d(x,z) . Por ejemplo,
x = (-2:0.05:3)’; y = sin(x); z = cos(x); plot2d(x, [y z sin(2*x)])
En este caso Scilab asigna colores diferentes a cada una de las curvas. Para conocer
la correspondencia entre colores y curvas se pueden colocar letreros (\legend") para las
curvas. Se utiliza la opcion leg separando los letreros por medio de @.
plot2d(x, [y z sin(2*x)], leg="sen(x)@cos(x)@sen(2x)" )
Despues de haber hecho una gra ca, se le pueden agregar letreros. Se usa xtitle , que
tiene 3 parametros, todos los tres deben ser cadenas. El primero para el letrero general,
el segundo para el eje horizontal y el tercero para el eje vertical. Por ejemplo
xtitle("Funciones trigonometricas", "x", "")
En resumen, una de las formas de utilizar plot2d es plot2d(x, a), donde x es
un vector columna y a es una matriz con el mismo numero de las que x. En la
gura habra tantas gra cas como columnas tenga la matriz a.
Una forma mas general es plot2d(u, v), donde u y v son matrices del mismo
tama~no, de m las y n columnas. Entonces en la misma gura apareceran la gra ca
de la primera columna de u con la primera columna de v, la gra ca de la segunda
columna de u con la segunda columna de v, etc. En la gura producida por el siguiente
ejemplo esta la gra ca de seno entre 0 y 3.14 y la gra ca de la tangente entre −1 y 1.
n = 100;
a = 0; b = 3.14;
h = (b-a)/n;
x1 = (a:h:b)’;
y = sin(x1);
a = -1; b = 1;
h = (b-a)/n;
x2 = (a:h:b)’;
z = tan(x2);
plot2d([x1 x2], [y z]);
function fx = func4(x)
fx = sin(x)-tan(x)
46 CAPÍTULO 5. GRÁFICAS
endfunction
y que se ha cargado el archivo donde esta de nida, mediante getf ... Entonces se
puede obtener la gra ca mediante
u = (-1:0.01:1)’;
fplot2d(u, func4)
t = (-1:0.01:1.2)’;
deff("[y] = func4b(x)", "y = x.*x + 2.5")
fplot2d(t, func4b)
Algunas veces se desea, no obtener la curva, sino dibujar los puntos, sin que haya
\continuidad", o sea, que los puntos no esten unidos por un segmento de recta. Una
forma de hacerlo es mediante un argumento adicional, el estilo. Las siguientes ordenes
muestran un ejemplo.
xbasc();
x = (-3.2:0.2:3.2)’;
y = sin(x);
tipo = -1;
plot2d( x, y, tipo)
xbasc();
x = (-3.2:0.2:3.2)’;
plot2d( [x x], [sin(x) cos(x)], [-1 -2] )
5.2. TRES DIMENSIONES 47
u = (-2:0.05:2)’;
v = (-3:0.1:3)’;
m = size(u,1); n = size(v,1);
w = zeros(m,n);
for i=1:m
for j = 1:n
w(i,j) = 5*u(i)^2 - v(j)^2;
end
end
plot3d(u, v, w);
De manera analoga a dos dimensiones, es posible gra car por medio de fplot3d una
funcion f de nida por medio de una funcion de Scilab. Basta con dar dos vectores, uno
con las coordenadas de la primera variable y otro con las coordenadas de la segunda
variable.
Supongamos que se ha de nido la siguiente funcion
y que se ha cargado el archivo donde esta de nida, mediante getf ... Entonces se
puede obtener la gra ca mediante
u = (-4:0.05:4)’;
v = (-5:0.05:3)’;
fplot3d(u, v, func5)
u = (-2:0.05:2)’;
v = (-3:0.1:3)’;
m = size(u,1); n = size(v,1);
w = zeros(m,n);
for i=1:m
for j = 1:n
w(i,j) = 5*u(i)^2 + v(j)^2;
end
end
contour(u, v, w, 5);
Tambien, mediante fcontour, se pueden obtener curvas de nivel de una funcion de nida
en una funcion de Scilab. Su uso es analogo al de fplot3d pero con un parametro adi-
cional que indica el numero de curvas de nivel. Por ejemplo:
u = (-4:0.2:4)’;
v = (-4:0.2:5)’;
fcontour(u, v, func5, 7)
MÉTODOS NUMÉRICOS
y = zeros(n,1);
x = zeros(n,1);
u = chol(a);
y(1) = b(1)/u(1,1);
for i=2:n
y(i) = ( b(i) - u(1:i-1,i)’*y(1:i-1) )/u(i,i);
end
x(n) = y(n)/u(n,n);
for i=n-1:-1:1
x(i) = ( y(i) - u(i,i+1:n)*x(i+1:n) )/u(i,i);
end
50
6.2. SOLUCIÓN POR MÍNIMOS CUADRADOS 51
u = chol(a);
y = (u’\b);
x = u\y;
Por ejemplo, con n = 1500, estas tres ordenes duran 15.12 segundos.
Una matriz dispersa (sparse) es aquella que tiene muchos ceros y muy pocos elementos
no nulos. Si
−8 0 0 0 1.12
−2 5 0.5 0 0
A=
0 0 10 3.14 0
0 0 0 4 −1
0 0 0 0 20
ij = [1 1; 1 5; 2 1 ; 2 2; 2 3;3 3; 3 4; 4 4; 4 5; 5 5]
v = [-8 1.12 -2 5 0.5 10 3.14 4 -1 20]’
A = sparse(ij, v)
Ax = b,
Por ejemplo,
A = [1 2; 3 4; 5 6]
b = [3 7 11.1]’
f (x) = 0,
donde f es una funcion de variable y valor real, se utiliza fsolve. Por ejemplo para
resolver
x − ex
− cos(x) + 0.1 = 0,
1 + x2
es necesario de nir una funcion de Scilab donde este f y despues utilizar fsolve.
function fx = func156(x)
fx = ( x - exp(x) )/( 1 + x*x ) - cos(x) + 0.1
endfunction
Despues de haber cargado esta funcion, se utiliza fsolve dandole como parametros, la
aproximacion inicial y la funcion:
r = fsolve(0, func156)
Con otra aproximacion inicial podr a dar otra ra z. Un parametro opcional, que puede
acelerar la obtencion de la solucion, es otra funcion de Scilab donde este de nida la
derivada.
6.4. SISTEMA DE ECUACIONES NO LINEALES 53
x21 + x1 x2 + x3 − 3 = 0 ,
2x1 + 3x2 x3 − 5 = 0 ,
(x1 + x2 + x3 )2 − 10x3 + 1 = 0 .
La funcion f debe estar de nida en una funcion de Scilab, donde, dado un vector
columna x, calcule el vector columna f (x). Una vez escrita la funcion y cargado el
archivo donde esta f , se utiliza fsolve . Para el ejemplo anterior la funcion puede ser
function fx = f3(x)
n = size(x,1)
fx = zeros(n,1)
fx(1) = x(1)^2 + x(1)*x(2) + x(3) - 3
fx(2) = 2*x(1) + 3*x(2)*x(3) - 5
fx(3) = (x(1) + x(2) + x(3))^2 - 10*x(3) + 1
endfunction
function J = jacf3(x)
t = 2*(x(1)+x(2)+x(3))
J = [ 2*x(1)+x(2) x(1) 1
54 CAPÍTULO 6. MÉTODOS NUMÉRICOS
2 3*x(3) 3*x(2)
t t t-10 ]
endfunction
se utiliza intg . Para eso es necesario de nir en Scilab la funcion que se va a integrar.
Puede ser, directamente en el ambiente Scilab:
deff(’[y] = f53(x)’, ’y = exp(-x*x)’)
I = intg(0.1, 0.5, f53)
Tambien se puede de nir una funcion en un archivo .sci
function fx = f57(x)
fx = exp(-x*x)
endfunction
function fx = func90(x)
// funcion de Rosenbrock
t1 = x(2)-x(1)*x(1)
t2 = 1-x(1)
fx = 10*t1*t1 + t2*t2 + 4
endfunction
entonces la orden
derivative(func90, [3 4]’)
da como resultado un vector la con el gradiente de f en x = (3, 4). El segundo
parametro, el punto x, debe ser un vector columna.
Si se tiene una funcion f : Rn → Rm , entonces f (x) = ( f1 (x), f2 (x), ..., fm (x) ), donde
fi : Rn → R . Por ejemplo,
function Fx = func157(x)
Fx = zeros(4,1);
Fx(1) = x(1)^2 + x(1)*x(2) + x(3) - 3;
Fx(2) = 2*x(1) + 3*x(2)*x(3) - 5;
Fx(3) = ( x(1) + x(2) + x(3) )^2 - 10*x(3) + 1;
Fx(4) = 10*( x(1) + x(2) + x(3) - 3.3 );
endfunction
entonces la orden
derivative(func157, [3 4 5]’)
da como resultado la matriz jacobiana de la funcion f (de nida en f157 ) evaluada en
el punto x = (3, 4, 5). El segundo parametro, el punto x, debe ser un vector columna.
La matriz jacobiana es de tama~ no m × n (en este ejemplo: 4 × 3 ). En la la i esta el
gradiente de fi .
56 CAPÍTULO 6. MÉTODOS NUMÉRICOS
6.7 Interpolación
Cuando hay m puntos (x1 , y1 ), (x2 , y2 ), ..., (xm , ym ) se desea obtener la funcion inter-
polante, una funcion que pase por esos puntos, con el objetivo de evaluarla en otros
valores x intermedios.
La funcion interpln permite hacer interpolacion lineal. Tiene dos parametros, el
primero es una matriz de dos las. La primera la tiene los valores xi . Deben estar en
orden creciente. La segunda la tiene los valores yi . El segundo parametro es un vector
donde estan los valores x en los que se desea evaluar la funcion interpolante (af n por
trozos).
x = [.4trozos
p8 p8
rozos).
rozos).
(a Td )Tj 14.0395 0 Td (p6trozos).)Tj /R27 117
6.8. APROXIMACIÓN POR MÍNIMOS CUADRADOS 57
A = zeros(m, n+1);
for i=0:n
A(:,i+1) = x.^i;
end
cf = A\y;
y 0 = f (x, y),
y(x0 ) = y0 .
Por ejemplo,
x+y
y0 = +4,
x2 + y 2
y(2) = 3.
x0 = 2
y0 = 3
t = [2 2.1 2.2 2.5 2.9]’
yt = ode(y0, x0, t, func158)
y 0 = f (x, y),
y(x0 ) = y0 .
6.10. SISTEMA DE ECUACIONES DIFERENCIALES 59
2y1
y10 = + x3 y2 ,
x
3
y20 = − y2
x
y1 (1) = −1
y2 (1) = 1.
se utiliza la misma funcion ode , pero con los parametros de dimension adecuada.
x0 = 1
y0 = [-1 1]’
t = (1:0.2:2)’
yt = ode(y0, x0, t, func43)
OPTIMIZACIÓN
min z = cT x
Ai· x = bi , i = 1, ..., m0
(7.1)
Ai· x ≤ bi , i = m0 + 1, ..., m
u ≤ x ≤ v.
Obviamente, siempre se puede pasar de una forma a otra sin di cultad. Para el caso de
Scilab, todos los problemas deben ser de minimizacion y las desigualdades, si las hay,
diferentes de las restricciones de caja (u ≤ x ≤ v), deben ser de la forma
ai1 x1 + ai1 x2 + · · · + ai1 xn ≤ bi .
La matriz A es de tama~ no m × n; los vectores c, u, v ∈ Rn×1 , b ∈ Rm×1 (todos son
vectores columna). Las igualdades, si las hay, deben estar antes de las desigualdades.
Frecuentemente, en los problemas de OL, todas las variables deben ser no negativas. En
Scilab esto se debe considerar como restricciones de caja o como restricciones usuales.
7.1.1 Desigualdades
El problema mas sencillo para resolver por medio de linpro es el siguiente:
min cT x
60
7.1. OPTIMIZACIÓN LINEAL 61
Ax ≤ b.
min cT x
62 CAPÍTULO 7. OPTIMIZACIÓN
Ax ≤ b
u ≤ x ≤ v.
Es interesante observar que como no hay restricciones superiores de caja, entonces se uti-
liza un vector \vac o". En el problema (7.2) la restriccion x1 ≤ 300 se puede considerar
como una restriccion de caja.
x1 ≤ 300
x ≥ 0.
x1 + 2x2 ≤ 580
x1 ≤ 300
x ≥ 0,
se resuelve mediante:
1
min q(x) = xT Hx+cT x
2
Ai· x = bi , i = 1, ..., m0
Ai· x ≤ bi , i = m0 + 1, ..., m
u ≤ x ≤ v.
La matriz H debe ser simetrica. Se usa la funcion quapro . Su llamado y uso son muy
semejantes a los de la funcion linpro.
[x, lg, qx ] = quapro(H, c, A, b, u, v, m0)
Los casos de desigualdades y, desigualdades y restricciones de caja, son completamente
analogos a los de OL.
Consideremos el siguiente problema:
Entonces:
2 0 −6
H= , c= .
0 2 −8
Su solucion se puede obtener mediante las ordenes
H = [ 2 0; 0 2];
c = [-6; -8];
A = [ 1 2; 3 1];
b = [ 3 ; 4];
[x, lagr, qx ] = quapro(H, c, A, b, zeros(2,1), [])
Para su solucion en Scilab se usa la funcion optim. Se necesita haber de nido previ-
amente una funcion en Scilab donde se calcule f (x) y el gradiente f 0 (x). Esta funcion
que por el momento llamaremos f_obj debe tener la siguiente forma
[fx, gr, ind2] = f_obj(x, ind1)
Parametros de entrada:
x: punto donde se va a evaluar f (x);
si ind1 = 2, se evalua f (x);
si ind1 = 3, se evalua f 0 (x);
si ind1 = 4, se evaluan f (x) y f 0 (x).
Parametros de salida:
fx: valor f (x);
gr: gradiente f 0 (x);
si ind2 < 0, no se puede evaluar f (x);
si ind2 = 0, se interrumpe la optimizacion.
Consideremos dos problemas, el primero esta dado por la llamada funcion de Rosenbrock.
Las soluciones de estos problemas son x = (1, 1) y x = (3, 4).
min f (x1 , x2 ) = 10(x2 − x21 )2 + (1 − x1 )2 ,
min f (x1 , x2 ) = (x1 − 3)2 + (x2 − 4)2 .
getf c:\...\func.sci
[fxopt, xopt] = optim(rosenbr, [5; 6])
[fxopt, xopt] = optim(ensayo, [0; 0])
u = [3; 2];
v = [5; 10];
x0 = [0; 0];
[fx, x] = optim(rosenbr, ’b’, u, v, x0)
El parametro ’b’ (bound ) indica que los dos vectores columna siguientes son las cotas
de caja. Tambien es posible escoger el criterio de parada, para ello se usa el parametro
’ar’ . Ver la ayuda de la funcion optim.
Por ejemplo,
f (x1 , x2 , x3 ) = (x21 + x1 x2 + x3 − 3, 2x1 + 3x2 x3 − 5, (x1 + x2 + x3 )2 − 10x3 + 1, 10(x1 +
x2 + x3 ) − 3.3).
La solucion se hace mediante leastsq . De manera analoga al caso de sistemas de
ecuaciones no lineales, es necesario escribir una funcion de Scilab donde se de ne f
(dado un vector columna x calcula el vector columna f (x) ). Por ejemplo
function fx = fmc(x)
m = 4;
7.4. MÍNIMOS CUADRADOS NO LINEALES 67
fx = zeros(m,1);
fx(1) = x(1)^2+x(1)*x(2)+x(3)-3;
fx(2) = 2*x(1)+3*x(2)*x(3)-5;
fx(3) = (x(1)+x(2)+x(3))^2-10*x(3)+1;
fx(4) = 10*(x(1)+x(2)+x(3)-3.3);
endfunction
function D = derfmc(x)
t = 2*(x(1)+x(2)+x(3));
D = [ 2*x(1)+x(2) x(1) 1
2 3*x(3) 3*x(2)
t t t-10
10 10 10 ];
endfunction
u = [1.2 0 1.1]’;
v = [10 10 10]’;
[fx, x] = leastsq(fmc, ’b’, u, v, [4 5 6]’)
π, 9 arcotangente hiperbolica, 7
’b’, 66 asignacion, 3
’c’, 10 asin, 6
’coeff’, 10 asinh, 6
’e’, 9 atan, 6
’gc’, 65 atanh, 7
’nd’, 65 ayuda, 8
’qn’, 65
’r’, 10 ’b’, 66
’roots’, 10 backslash, 20
’v’, 9 barra de menu, 8, 23
(:), 15 break, 31
.sce, 22
.sci, 24 C, 32
\, 20 c, 10
%, 9 C++, 24
timer, 50 carpeta
actual, 26
abort, 31 por defecto, 26
abs, 6, 9 case, 30
acos, 6 ceil, 7, 8
acosh, 6 chdir, 27
aleatorio, 7 chol, 19
algoritmo de Euclides, 31 Cholesky, 19, 50
anidamiento, 29 coeff, 10
ans, 5 coe ciente, 10
apropos, 8 columna, 13, 14
aproximacion polinomial por comentarios, 24
m nimos cuadrados, 37 comparaciones, 27
aproximacion por m nimos cuadrados, 56 complejos, 9
archivo Postscript, 49 conj, 9
arcocoseno, 6 conjugado, 9
arcocoseno hiperbolico, 6 constantes prede nidas, 9
arcoseno, 6 contour, 48
arcoseno hiperbolico, 6 control de ujo, 27
arcotangente, 6 cos, 7
69
70 ÍNDICE ANALÍTICO
r, 10 st deviation, 18
ra z de una matriz, 16 stacksize, 48
raiz cuadrada, 7 submatriz, 14
rand, 7, 14 sum, 18
rango, 16 suma, 6, 9, 10
rank, 16 de elementos de ..., 18
real, 9 de matrices, 15
reales, 4 suprimir
redondeo, 7, 8 una columna, 16
residuo entero, 7, 8 una componente, 16
resta, 6, 9, 10 una la, 16
de matrices, 15 SVD, 20
restricciones de caja, 61, 62, 66, 67 svd, 20
return, 31, 32
tama~no de una matriz, 19
roots, 10
tan, 7
Rosenbrock, 64
tangente, 7
round, 7, 8 tangente hiperbolica, 7
rref, 17 tanh, 7
then, 28, 30
sce, 22
tiempo, 50
sci, 24 transpuesta de una matriz, 15
script, véase guion tril, 19
select, 30 triu, 19
semidef, 68
seno, 7 valor absoluto, 6, 9
seno hiperbolico, 7 valores propios, 19
seudoinversa, 20 variable, 3
seudosolucion, 23 variables
sin, 7 globales, 22
sinh, 7 locales, 22
sistema de ecuaciones diferenciales, 58 vector columna, 13, 15
sistema de ecuaciones no lineales, 53 vector la, 15
sistemas de ecuaciones lineales, 50 vectores, 13
size, 19 vectores propios , 19
solucion de sistemas de ecuaciones, 20
while, 29
solucion por m nimos
who, 23
cuadrados, 21, 23
who, 4
sort, 17
Windows, 2
sparse, 51
write, 32
sparse, 51 www, 1
spec, 19
spline, 56, 57 Xfig, 49
sqrt, 7 xtitle, 45
74 ÍNDICE ANALÍTICO
y, 27
zeros, 14