Professional Documents
Culture Documents
Manual de Scilab
Pg -1-
1. Operaciones Bsicas 1.1. Operaciones con matrices y vectores 1.1.1. Introduccin de matrices desde el teclado 1.1.2. Operaciones con matrices 1.1.3. Tipos de datos 1.1.3.1. Nmeros reales de doble precisin 1.1.3.2. Nmeros Complejos 1.1.3.3. Cadenas de caracteres 1.1.3.4. Otras formas de definir matrices 1.1.3.4.1 Tipos de matrices predefinidos 1.1.3.4.2 Formacin de una matriz a partir de otras 1.1.3.4.3 Direccionamiento de vectores y matrices a partir de vectores 1.1.3.4.4 Operador <<Dos Puntos>> (:) 1.1.3.4.5 Definicin de matrices y vectores desde fichero 1.1.3.5. Operadores Relacionales 1.1.3.6. Operadores Lgicos 1.2. Funciones de Librera 1.2.1 Caractersticas Generales de las funciones de librera 1.2.2. Funciones matemticas elementales que operan de modo escalar 1.2.3. Funciones que actan sobre matrices 1.2.3.1 Funciones elementales 1.2.3.2 Funciones Especiales 1.2.3.3 Funciones de Factorizacin y/o Descomposicin Matricial 1.3. Ms sobre operadores relacionales con vectores y matrices 1.4. Otras funciones que actan sobre vectores y matrices
Pg -2-
2. Otros tipos de datos de Scilab 2.1. Cadenas de caracteres 2.2 Hipermatrices (arrays de ms de dos dimensiones) 2.2.1 Definicin de Hipermatrices 2.3 Estructuras 2.3.1 Creacin de Estructuras 2.3.2 Funciones para operar con Estructuras 2.4 Vectores o matrices de celdas (Cell Array) 2.4.1 Creacin de vectores y matrices de Celdas 3. Programacin en Scilab 3.1. Bifurcaciones y bucles 3.1.1. Sentencia IF 3.1.2. Sentencia SELECT 3.1.3. Sentencia FOR 3.1.4. Sentencia WHILE 3.1.5. Sentencia BREAK y CONTINUE 3.2 Ficheros *.m 3.2.1 Ficheros de Comandos (SCRIPTS) 3.2.2 Definicin de Funciones 4. Grficos bidimensionales 4.1 Funciones grficas 2D elementales 4.1.1 Funcin PLOT 4.1.2 Estilos de Lnea y Marcadores para PLOT 4.1.3 Funcin PLOT2D 4.1.4 Comando SUBPLOT 4.1.5 Control de los Ejes 4.2 Control de ventanas grficas 4.3 Otras funciones grficas 2-D
Pg -3-
Manual de Iniciacin de Scilab 5. Grficos tridimensionales 5.1 Tipos de funciones grficas tridimensionales 5.1.1 Dibujo de lneas: Funcin PARAM3D 5.1.2 Dibujo de mallados: Funciones PLOT3D, PLOT3D2, PLOT3D3 5.1.3 Dibujo de lneas de contorno: Funcin CONTOUR 6. Otros aspectos de Scilab 6.1 Guardar variables y estados de una sesin: Comandos save y load 6.2 Guardar sesin: Comando diary 6.3 Medida de tiempos y de esfuerzo de clculo 6.4. Funciones de funcin
Pg -4-
1. Operaciones Bsicas
! ! !
Pg -5-
Manual de Iniciacin de Scilab A partir de este momento la matriz a est disponible para hacer cualquier tipo de operacin con ella (adems de valores numricos, en la definicin de una matriz o vector se pueden utilizar expresiones y funciones matemticas). Por ejemplo, una sencilla operacin con a es hallar su matriz transpuesta. En Scilab, el apstrofo (') es el smbolo de transposicin matricial. Para calcular a (transpuesta de a) basta teclear lo siguiente (se aade a continuacin la respuesta del programa):
-->a' ans =
! ! !
1. 2. 1.
3. 4. 2.
5. ! 3. ! 1. !
Como el resultado de la operacin no ha sido asignado a ninguna otra matriz, Scilab utiliza un nombre de variable por defecto (ans, de answer), que contiene el resultado de la ltima operacin. La variable ans puede ser utilizada como operando en la siguiente expresin que se introduzca. Tambin podra haberse asignado el resultado a otra matriz llamada b. Ahora vamos a definir una matriz b conjugada para hacer operaciones bsicas con estas 2 matrices:
-->b=a' b =
! ! !
1. 2. 1.
3. 4. 2.
5. ! 3. ! 1. !
Pg -6-
Comenzamos con las operaciones ms bsicas que podemos encontrar, la suma y la resta de matrices:
-->a+b ans =
! ! !
2. 5. 6.
5. 8. 5.
6. ! 5. ! 2. !
-->a-b ans =
! ! !
0. 1. 4.
- 1. 0. 1.
- 4. ! - 1. ! 0. !
Si realizamos la multiplicacin de matrices con el operando * tendremos que tener cuidado con que el nmero de columnas de la primera matriz debe coincidir con el nmero de filas de la segunda:
-->a*b ans =
! ! !
6. 13. 12.
Pg -7-
Tambin podemos utilizar una multiplicacin elemento a elemento, que aunque no tiene demasiado sentido como multiplicacin de matrices, si que es muy utilizable en el caso de que la matriz no sea ms que un conjunto ordenado de valores.
-->a.*b ans =
! ! !
1. 6. 5.
6. 16. 6.
5. ! 6. ! 1. !
A continuacin vamos a definir una nueva matriz a a partir de una funcin que genera valores aleatorios entre 0 y 1.
-->rand(2,2) ans =
! !
0.2113249 0.7560439
0.0002211 ! 0.3303271 !
! - 2. ! 7.
1. - 4. 7.
- 4.9E-16 ! 1. - 2. ! !
! - 11.
Pg -8-
! ! !
1. 0. 0.
0. 1. 0.
0. ! 0. ! 1. !
Si los valores no son exactos podemos utilizar el comando round() ya que debido a los errores de aproximacin en los clculos podemos encontrar valores como -4.9E-16 que representa un valor extremadamente pequeo.
-->d=round(d) d =
! - 2. ! 7.
1. - 4. 7.
0. ! 1. ! - 2. !
! - 11.
Si queremos comentar las lneas de cdigo que ejecutamos, a continuacin de la operacin podemos poner un comentario anteponiendo el carcter //
-->d=inv(a) //es necesario que la matriz sea cuadrada
Pg -9-
10.
15.
20. !
! ! !
Podemos observar, podemos definir vectores fila y vectores columna, con slo hacer la traspuesta del vector en la definicin. Tambin podemos definir un vector columna como si hicieramos una matriz de 1xn Como podemos ver, no hemos obtenido resultado tras realizar la operacin; esto es debido a que hemos puesto un ; al final de la lnea de comando, esto hace que no salga por pantalla lo que hemos ejecutado, cosa que resulta muy til cuando las matrices/vectores son de un nmero muy grande (100, 1000, ) y por lo tanto, difciles de manejar visualmente. En Scilab se accede a los elementos de un vector poniendo el ndice entre parntesis (por ejemplo x(3) x(i)). Los elementos de las matrices se acceden poniendo los dos ndices entre parntesis, separados por una coma (por ejemplo A(1,2) A(i,j)). Las matrices se almacenan por columnas (aunque se introduzcan por filas, como se ha dicho antes), y teniendo en cuenta esto puede accederse a cualquier elemento de una matriz con un slo subndice. Por ejemplo, si A es una matriz (3x3) se obtiene el mismo valor escribiendo A(1,2) que escribiendo A(4).
Pg -10-
.* producto elemento a elemento ./ y .\ divisin elemento a elemento .^ elevar a una potencia elemento a elemento Estos operadores se aplican tambin a las variables o valores escalares, aunque con algunas diferencias. Todos estos operadores son coherentes con las correspondientes operaciones matriciales: no se puede por ejemplo sumar matrices que no sean del mismo tamao. Si los operadores no se usan de modo correcto se obtiene un mensaje de error. Vase el siguiente ejemplo de tres ecuaciones formadas por una recta que no pasa por el origen y los dos ejes de coordenadas:
Pg -11-
! ! !
1. 1. 0.
2. ! 0. ! 1. !
-->x=A\b, resto=A*x-b x =
! !
0.33333 ! 0.66667 ! =
resto
Pg -12-
! ! !
1. 3. 5.
2. 4. 3.
1. ! 2. ! 1. !
-->b b =
! ! !
1. 2. 1.
3. 4. 2.
5. ! 3. ! 1. !
-->a/b ans =
0.
0. 7. 24.
1. - 9.
! !
! - 2. ! - 7.
- 36. !
-->a\b ans =
! ! !
0. 0. 1.
- 2. 7. - 9.
- 7.
24. ! - 36. !
Pg -13-
! ! !
1. 1.5 5.
0.66667 1. 1.5
0.2
0.66667 ! 1. !
-->a.\b ans =
! ! !
1. 0.66667 0.2
1.5 1. 0.66667
5.
1.5 ! 1. !
Pg -14-
Inf
Pg -15-
As pues, para Scilab el infinito se representa como %inf. Scilab tiene tambin una representacin especial para los resultados que no estn definidos como nmeros, que se representa como Not a Number (%nan):
-->%nan ans =
Nan
Los NaN se propagan al realizar con ellos cualquier operacin aritmtica, en el sentido de que, por ejemplo, cualquier nmero sumado a un NaN da otro NaN. Scilab tiene esto en cuenta. Algo parecido sucede con los Inf.
-->%nan*1 ans =
Nan
-->%nan*%nan ans =
Nan
-->%nan*%inf ans =
Nan
Pg -16-
Podemos encontrar 3 variables predefinidas por Scilab que nos dan los valores mximos y mnimos de este tipo de datos: eps devuelve la diferencia entre 1.0 y el nmero de coma flotante
inmediatamente superior. Da una idea de la precisin o nmero de cifras almacenadas. En un PC, eps vale 2.2204e-016. realmin devuelve el nmero ms pequeo con que se puede trabajar
(1.7977e+308)
Pg -17-
Como podemos ver, la definicin se hace con el % como en todas las constantes prefijadas por el sistema , y que es necesario el uso del operador * para multiplicarlo por un escalar.
-->// j no se considera como variable imaginaria
-->a=[1+%i,2+3*%i;%i,%i + 4] a =
! !
1. + i i
2. + 3.i ! 4. + i !
! !
1. + i i
2. + 3.i ! 4. + i !
Es importante advertir que el operador de matriz transpuesta (), aplicado a matrices complejas, produce la matriz transpuesta conjugada. El operador punto y apstrofo (.) que calcula simplemente la matriz transpuesta.
-->a' ans =
! !
1. - i 2. - 3.i
- i 4. - i
! !
-->a.' ans =
! !
1. + i 2. + 3.i
i 4. + i
! !
Pg -18-
cadena de caracteres
Debido a que para su uso es necesario un conocimiento previo de las funciones orientadas a matrices, postpondr otras explicaciones hasta que se hayan explicado estas, al igual que con los strings, se postpone la explicacin de hipermatrices, structs y cell arrays. Ya han aparecido algunos ejemplos de variables y expresiones matriciales. Ahora se va a tratar de generalizar un poco lo visto hasta ahora. Una variable es un nombre que se da a una entidad numrica, que puede ser una matriz, un vector o un escalar. El valor de esa variable, e incluso el tipo de entidad numrica que representa, puede cambiar a lo largo de una sesin de SCILAB o a lo largo de la ejecucin de un programa. La forma ms normal de cambiar el valor de una variable es colocndola a la izquierda del operador de asignacin (=). Una expresin de SCILAB puede tener las dos formas siguientes: primero, asignando su resultado a una variable,
variable = expresin
y segundo evaluando simplemente el resultado del siguiente modo, expresin en cuyo caso el resultado se asigna automticamente a una variable interna de SCILAB llamada ans (de answer) que almacena el ltimo resultado obtenido. Se considera por
Pg -19-
Manual de Iniciacin de Scilab defecto que una expresin termina cuando se pulsa intro. Si se desea que una expresin contine en la lnea siguiente, hay que introducir tres puntos (...) antes de pulsar intro. Tambin se pueden incluir varias expresiones en una misma lnea separndolas por comas (,) o puntos y comas (;). Si una expresin termina en punto y coma (;) su resultado se calcula, pero no se escribe en pantalla. Esta posibilidad es muy interesante, tanto para evitar la escritura de resultados intermedios, como para evitar la impresin de grandes cantidades de nmeros cuando se trabaja con matrices de gran tamao. A semejanza de Fortran, SCILAB distingue entre maysculas y minsculas en los nombres de variables; adems no hace falta declarar las variables que se vayan a utilizar. Esto hace que se deba tener especial cuidado con no utilizar nombres errneos en las variables, porque no se recibir ningn aviso del ordenador. Cuando se quiere tener una relacin de las variables que se han utilizado en una sesin de trabajo se puede utilizar el comando who. Existe otro comando llamado whos que proporciona adems informacin sobre el tamao, la cantidad de memoria ocupada y el carcter real o complejo de cada variable. El comando clear tiene varias formas posibles: clear sin argumentos, clear elimina todas las variables creadas previamente (excepto las variables globales). clear A, b borra las variables indicadas.
Pg -20-
! !
1. 0.
0. ! 1. !
! ! !
0. 0. 0.
0. 0. 0.
0. 0. 0.
0. 0. 0.
0. ! 0. ! 0. !
Pg -21-
! ! !
1. 1. 1.
1. 1. 1.
1. 1. 1.
1. ! 1. ! 1. !
column 1 to 5
1.
1.1111111
1.2222222
1.3333333
1.4444444 !
column
6 to 10
1.5555556
1.6666667
1.7777778
1.8888889
2. !
logspace(d1,d2,n)
genera
un
vector
con
valores
espaciados
logartmicamente entre 10^d1 y 10^d2. Si d2 es pi, los puntos se generan entre 10^d1 y pi. rand(3,3) forma una matriz de nmeros aleatorios entre 0 y 1, podemos dar diferentes posibilidades para cambiar la distribucin estadstica de la que partir. Poly(a,x,flag) : construye un polinomio que puede ser el conjunto de coeficientes de a, si por flag introducimos coeff y las raices del polinomio definido por a si introducimos roots.
Pg -22-
2 1 + 2s + s
A continuacin se describen algunas de las funciones que crean una nueva matriz a partir de otra o de otras, comenzando por dos funciones auxiliares: [m,n]=size(A) devuelve el nmero de filas y de columnas de la matriz A. Si la matriz es cuadrada basta recoger el primer valor de retorno
-->a=[1 2 1;3 2 5;6 7 5];
-->[m,n]=size(a)
-->m = 3 m =
3.
Pg -23-
-->n = 3 n =
3.
-->n=length(x) n =
100001.
zeros(size(A)) forma una matriz de ceros del mismo tamao que una matriz A previamente creada.
-->size(a) ans =
3.
3. !
-->zeros(size(a)) ans =
0.
0. !
ones(size(A)) dem con unos A=diag(x) forma una matriz diagonal A cuyos elementos diagonales son los elementos de un vector ya existente x. x=diag(A) forma un vector x a partir de los elementos de la diagonal de una matriz ya existente A.
-->diag(a) ans =
! ! !
1. ! 2. ! 5. !
Pg -24-
Manual de Iniciacin de Scilab diag(diag(A)) crea una matriz diagonal a partir de la diagonal de la matriz A.
-->diag(diag(a)) ans =
! ! !
1. 0. 0.
0. 2. 0.
0. ! 0. ! 5. !
triu(A) forma una matriz triangular superior a partir de una matriz A (no tiene por qu ser cuadrada).
-->s=poly(0,'s');
-->triu([s,s;s,1]) ans =
! ! !
! !
-->triu([1/s,1/s;1/s,1]) ans =
! ! ! ! ! ! !
1 z
1 z
! ! ! !
0 1
1 1
! ! !
Pg -25-
Un caso especialmente interesante es el de crear una nueva matriz componiendo como submatrices otras matrices definidas previamente. A modo de ejemplo, vamos a realizar la matriz generadora de un cdigo ortogonal con M=2:
-->a=[%f %f;%f %t];
-->a a =
! F F ! ! F T ! -->b=~a b =
! T T ! ! T F ! -->h2=[a a;a b] h2 =
! F F F F ! ! F T F T ! ! F F T T ! ! F T T F !
Pg -26-
-->a=rand(3,4) a =
! ! !
-->b=[1 3 6 11] b =
1.
3.
6.
11. !
-->a(b) ans =
! ! ! !
Pg -27-
Podemos ver que hemos obtenido las posiciones 1, 3, 6 y 11 de la matriz a, que debemos contar teniendo en cuenta que la matriz se recorre por columnas y no por filas. Si queremos ver un elemento concreto de la matriz, podemos ejecutar lo siguiente:
-->a(3,2) ans =
0.6283918
-->a(6) ans =
0.6283918
Creamos esta nueva matriz a para que sea ms fcil seguir los valores:
-->a=rand(4,4)*10 a =
! ! ! !
3.616361
2.3207479
6.5251349
3.12642 !
Pg -28-
5.4425732
8.8338878
2.1460079
5.6642488 !
! ! ! !
Pg -29-
1.
2.
3.
4.
5.
6.
7.
8.
9.
10. !
En cierta forma se podra decir que el operador (:) representa un rango: en este caso, los nmeros enteros entre el 1 y el 10. Por defecto el incremento es 1, pero este operador puede tambin utilizarse con otros valores enteros y reales, positivos o negativos. En este caso el incremento va entre el valor inferior y el superior, pero podemos hacer que el incremento sea negativo, o que se haga con un incremento mayor o menor:
-->x=x(5:-1:1) x =
6.
7.
8.
9.
10. !
Pg -30-
Pg -31-
Manual de Iniciacin de Scilab tengan un significado especial. Al igual que en C, si una comparacin se cumple el resultado es T (true), mientras que si no se cumple es F (false). La diferencia con C est en que cuando los operadores relacionales de Scilab se aplican a dos matrices o vectores del mismo tamao, la comparacin se realiza elemento a elemento, y el resultado es otra matriz de unos y ceros del mismo tamao, que recoge el resultado de cada comparacin entre elementos.
-->a=1;b=2;
-->a<b ans =
-->a~=b ans =
-->a>=b ans =
Pg -32-
-->c=a&b c =
-->d=a|b d =
Pg -33-
function y=prueba(x)
y=x+3;
endfunction
-->getf("prueba.sci")
-->prueba(1) ans =
4.
Pg -34-
Manual de Iniciacin de Scilab Podemos ver que esta funcin es solamente la funcin de una recta, cuya pendiente es de 45 y desplazada 3 unidades. y : es el valor de retorno. prueba : es el nombre de la funcin. x : es el argumento de entrada. Una caracterstica de SCILAB es que las funciones que no tienen argumentos no llevan parntesis, por lo que a simple vista no siempre son fciles de distinguir de las simples variables. La manera de cargar una funcin es mediante el comando getf ,este comando tiene como entrada el nombre de la funcin, con la direccin que posee en el sistema de archivos. Ejemplo:
//function sin argumentos de entrada
function hello
endfunction
Pg -35-
Otra forma de definir una funcin es hacerlo en la propia lnea de comandos del programa, de manera que podemos definir rpidamente una funcin que puntualmente vamos a utilizar es con el comando deff: -->deff('[x]=mifuncion(y,z)','x=y+z') -->a=mifuncion(23,43) a = 66. De este modo, hemos definido la funcin x = y + z y podemos utilizarla mientras no cerremos el programa (Nota: las funciones pueden ser redefinidas, as que debemos tener cuidado con el nombre que le ponemos a la funcin definida con deff). Podemos encontrar gran variedad de tipos de funcin segn lo que resuelvan: 1.- Funciones matemticas elementales. 2.- Funciones especiales. 3.- Funciones matriciales elementales. 4.- Funciones matriciales especficas. 5.- Funciones para la descomposicin y/o factorizacin de matrices. 6.- Funciones para anlisis estadstico de datos. 7.- Funciones para anlisis de polinomios. 8.- Funciones para integracin de ecuaciones diferenciales ordinarias. 9.- Resolucin de ecuaciones no-lineales y optimizacin. 10.- Integracin numrica. 11.- Funciones para procesamiento de seal.
Los argumentos actuales de estas funciones pueden ser expresiones y tambin llamadas a otra funcin.
Pg -36-
-->a=[1 1; 2 3];
-->[autovectores,autovalores]=spec(a) autovalores =
! !
3.7320508 0 =
0.2679492 !
autovectores
! !
0.3437238 0.9390708
- 0.8068982 ! 0.5906905 !
la funcin spec() calcula los valores y vectores propios de la matriz cuadrada A. Los vectores propios se devuelven como columnas de la matriz autovectores, mientras que los valores propios son los elementos de la matriz diagonal autovalores.
o
Las operaciones de suma y/o resta de una matriz con un escalar consisten en sumar y/o restar el escalar a todos los elementos de la matriz.
Recurdese que tecleando help nombre_funcion se obtiene de inmediato informacin sobre la funcin de ese nombre.
Pg -37-
Pg -38-
Manual de Iniciacin de Scilab o lcm(x) : mnimo comn mltiplo o real(x) : partes reales o imag(x) : partes imaginarias o abs(x) : valores absolutos
! ! !
1. + i 2. + 2.i 4. + i
1. + 4.i ! 4. + 3.i ! 1. + i !
-->b=a' b =
! ! !
1. - i 2. - 2.i 1. - 4.i
4. - i
3. - 4.i ! 1. - i !
! ! !
1. + i 2. + 2.i 1. + 4.i
4. + i
3. + 4.i ! 1. + i !
Pg -39-
Manual de Iniciacin de Scilab o v = poly(A) devuelve un vector v con los coeficientes del polinomio caracterstico de la matriz cuadrada A
-->x=[1 2 3]; -->v=poly(x,'v') v =
- 6 + 11v - 6v + v -->v=poly(a,'v') v =
real part
2 14 - 36v - 5v
o t = trace(A) devuelve la traza t (suma de los elementos de la diagonal) de una matriz cuadrada A
-->t=trace(c) t =
5. + 5.i
Pg -40-
Manual de Iniciacin de Scilab o [m,n] = size(A) devuelve el nmero de filas m y de columnas n de una matriz rectangular A
-->[m,n]=size(c) n =
3. m =
3.
3.
3. !
Pg -41-
column 1 to 2
! !
! - 0.6899399 + 0.3500422i
column 3
! ! !
Pg -42-
! ! !
-->[l,u]=lu(a) u =
! ! ! l
0.7560439 0. 0. =
0.6653811 0.6281972 0.
! ! !
1. 0.0002925 0.4369153
0. 1. 0.8898959
0. ! 0. ! 1. !
1.4624031
! - 0.6031884 ! 0.4312322
Pg -43-
Manual de Iniciacin de Scilab o d = det(A) devuelve el determinante d de la matriz cuadrada A. Equivale a d=det(L)*det(U) -->d=det(a) d =
- 0.4809171 -->e=det(l),f=det(u),g=e*f e =
1. f =
- 0.4809171 g =
- 0.4809171 o E = rref(A) reduccin a forma de escaln (mediante la eliminacin de Gauss con pivotamiento por columnas) de una matriz rectangular A. Slo se utiliza la diagonal y la parte triangular superior de A. El resultado es una matriz triangular superior tal que A = U'*U. o c = rcond(A) devuelve una estimacin del recproco de la condicin numrica de la matriz A basada en la norma sub-1. Si el resultado es prximo a 1 la matriz A est bien condicionada; si es prximo a 0 no lo est. Funciones basadas en el clculo de valores y vectores propios:
o [X,D] = spec(A) valores propios (diagonal de D) y vectores propios (columnas de X) de una matriz cuadrada A. Con frecuencia el resultado es complejo (si A no es simtrica). o [X,D] = spec(A,B) valores propios (diagonal de D) y vectores propios (columnas de X) de dos matrices cuadradas A y B (Ax = Bx).
Pg -44-
o [Q,R] = qr(A) descomposicin QR de una matriz rectangular. Se utiliza para sistemas con ms ecuaciones que incgnitas.
-->a=[1 1 1 1;1 1 2 4; 1 2 1 2; 1 2 2 3];
-->[q,r]=qr(a) r =
! - 2. ! ! ! q 0. 0. 0. =
- 3. 1. 0. 0.
- 3. 1.110D-16 - 1. 0.
- 5.
8.882D-16 ! - 2. - 1. ! !
o B = null(A) devuelve una base ortonormal del subespacio nulo (kernel, o conjunto de vectores x tales que Ax = 0) de la matriz rectangular A. o Q = orth(A) las columnas de Q son una base ortonormal del espacio vectorial de columnas de A. El nmero de columnas de Q es el rango de A .
-->q=orth(a) q =
Pg -45-
-->b=pinv(a) b =
! !
0.1 0.1
0.2 ! 0.2 !
o r = rank(A) calcula el rango r de una matriz rectangular A o nor = norm(A) calcula la norma sub-2 de una matriz (el mayor valor singular) o nor = norm(A,2) lo mismo que la anterior, podemos hacer la norma sub-i de la matriz o vector
Clculo del rango, normas y condicin numrica: Existen varias formas de realizar estos clculos, con distintos niveles de esfuerzo de clculo y de precisin en el resultado. El rango se calcula implcitamente (sin que el usuario lo pida) al ejecutar las funciones rref(A), orth(A), null(A) y pinv(A). Normas de vectores:
norm(x,p) norma sub-p, es decir sum(abs(x)^p)^(1/p). norm(x) norma eucldea; equivale al mdulo o norm(x,2). norm(x,%inf) norma sub-, es decir max(abs(x)). norm(x,1) norma sub-1, es decir sum(abs(x)).
-->x=rand(1,4) x =
0.5608486
0.6623569
0.7263507
0.1985144 !
-->norm(x,2) ans =
1.1490262
Pg -46-
0.9502447
mtlb_find(A) cuando esta funcin se aplica a una matriz la considera como un vector con una columna detrs de otra, de la 1 a la ltima.
Pg -47-
exist(var) comprueba si la variable var existe isnan() chequea si hay valores NaN, devolviendo una matriz de unos y ceros
1.
2.
3.
4.
Nan
Inf
6. !
-->isnan(x) ans =
! F F F F T F F !
ans
isinf() chequea si hay valores Inf, devolviendo una matriz de unos y ceros
=
-->isinf(x)
! F F F F F T F !
issparse() chequea si una matriz es dispersa (sparse, es decir, con un gran nmero de elementos cero)
Pg -48-
Scilab
Pg -49-
Manual de Iniciacin de Scilab convstr convierte los caracteres de mayscula a minscula o viceversa emptystr devuelve una string vaca grep busca un string dentro de un vector de strings. justify justifica el array length nos da la longitud del objeto part - extraction de una parte del string str2code convierte valores tipo caracter en integer strcat Concatenacin de strings strindex busca la posicin de un caracter o string en una string. string - conversion a string de una matriz
-->string(rand(2,2)) ans =
!0.2113249 0.0002211 ! ! !
!0.7560439 0.3303271 !
-->deff('y=mymacro(x)','y=x+1')
Pg -50-
-->[out,in,text]=string(mymacro) text =
[] in =
x out =
Result is 123.356
Pg -51-
ans(:,:,1) =
0.31106 0.48694
0.70197 0.45170
ans(:,:,2) =
0.017063 0.234682
0.261818 0.340703
2.3. Estructuras
Una estructura (struct) es una agrupacin de datos de tipo diferente bajo un mismo nombre. Estos datos se llaman miembros (members) o campos (fields). Una estructura es un nuevo tipo de dato, del que luego se pueden crear muchas variables (objetos o instances). Por ejemplo, la estructura alumno puede contener los campos nombre (una cadena de caracteres) y carnet (un nmero).
Pg -52-
-->alumno.apellido='escucha';
-->alumno alumno =
Tambin puede crearse la estructura por medio de la funcin struct(), como por ejemplo,
Scilab permite, adems, aadir un nuevo campo a una estructura en cualquier momento. La siguiente sentencia aade el campo edad a todos los elementos del vector alumno.
-->alumno.edad=23 alumno =
Como hemos visto desde un inicio, Scilab trabaja con matrices, por lo tanto, todo lo que veamos para un elemento es extrapolable a una matriz, vector o conjunto de estos, por lo tanto, podemos hacer matrices de structs al igual que hemos hecho structs de vectores/matrices.
Pg -53-
Pg -54-
-->vc(1,2)={'segundo'};
-->vc(2,1)={'tercero'};
-->vc(2,2)={'cuarto'} vc =
!primero ! !tercero
segundo
! !
cuarto
Otra nomenclatura alternativa y similar, que tambin utiliza llaves se trata de crear el cell array antes y luego irlo llenando.
-->v=cell(2,2) v =
!{} ! !{}
{}
! !
{}
Pg -55-
-->v(1).entries={'uno'} v =
! ! ! ! ! ! !
El gran problema de esta estructura es que slo est implementada para strings y no para datos.
Pg -56-
3. Programacin en Scilab
Este es uno de los puntos flojos de todo este tipo de herramientas de clculo numrico, ya que no existen grandes posibilidades de programacin, aunque s las formas de programacin bsicas.
Los bucles nos permiten realizar varias iteraciones de un mismo proceso, o sea, realizar una misma operacin sobre distintos elementos. Podemos encontrar varios tipos de bucles: while do-until for Adems de las sentencias break y continue utilizadas dentro de los bucles para salir del proceso.
Pg -57-
3.1.1. Sentencia IF
Esta sentencia nos sirve para hacer bifurcaciones, podemos hacer 3 usos diferentes de ella:
if (condition)
end
Utilizando la expresin else con la que conseguiremos hacer uso de una expresin u otra si es consecuentemente true o false.
Utilizando la expression elseif con la que se pueden anidar bifurcaciones (aunque es mejor usar la sentencia switch)
Pg -58-
Una observacin muy importante: la condicin del if puede ser una condicin matricial, del tipo A==B, donde A y B son matrices del mismo tamao. Para que se considere que la condicin se cumple, es necesario que sean iguales dos a dos todos los elementos de las matrices A y B. Basta que haya dos elementos diferentes para que las matrices no sean iguales, y por tanto las sentencias del if no se ejecuten. Anlogamente, una condicin en la forma A=B exige que todos los elementos sean diferentes dos a dos. Bastara que hubiera dos elementos iguales para que la condicin no se cumpliese. En resumen:
if A==B exige que todos los elementos sean iguales dos a dos if A=B exige que todos los elementos sean diferentes dos a dos
Pg -59-
select expr0, case expr1 then instructions1, case expr2 then instructions2, ... case exprn then instructionsn, [else instructions], end
Al principio se evala la expr0, cuyo resultado debe ser un nmero escalar o una cadena de caracteres. Este resultado se compara con las expri, y se ejecuta el bloque de sentencias que corresponda con ese resultado. Si ninguno es igual a expr0 se ejecutan las sentencias correspondientes a else.
Pg -60-
Pg -61-
Manual de Iniciacin de Scilab funciones permiten extender las posibilidades de SCILAB. Las funciones definidas en ficheros *.sci se caracterizan porque la primera lnea (que no sea un comentario) comienza por la palabra function, seguida por los valores de retorno (entre corchetes [ ] y separados por comas, si hay ms de uno), el signo igual (=) y el nombre de la funcin, seguido de los argumentos (entre parntesis y separados por comas). Recurdese que un fichero *.sci puede llamar a otros ficheros *.sci, e incluso puede llamarse a s mismo de forma recursiva. Los ficheros de comandos se pueden llamar tambin desde funciones, en cuyo caso las variables que se crean pertenecen a espacio de trabajo de la funcin. El espacio de trabajo de una funcin es independiente del espacio de trabajo base y del espacio de trabajo de las dems funciones. Esto implica por ejemplo que no puede haber colisiones entre nombres de variables aunque varias funciones tengan una variable llamada A, en realidad se trata de variables completamente distintas (a no ser que A haya sido declarada como variable global).
Pg -62-
Manual de Iniciacin de Scilab El comando mtlb_echo hace que se impriman los comandos que estn en un script a medida que van siendo ejecutados. Este comando tiene varias formas: mtlb_echo on activa el echo en todos los ficheros script mtlb_echo off desactiva el echo mtlb_echo file on donde 'file' es el nombre de un fichero de funcin, activa el echo en esa funcin mtlb_echo file off desactiva el echo en la funcin mtlb_echo file pasa de on a off y viceversa mtlb_echo on all activa el echo en todas las funciones mtlb_echo off all desactiva el echo de todas las funciones
donde name es el nombre de la funcin. Entre corchetes y separados por comas van los valores de retorno (siempre que haya ms de uno), y entre parntesis tambin separados por comas los argumentos. Puede haber funciones sin valor de retorno y tambin sin argumentos. Recurdese que los argumentos son los datos de la funcin y los valores de retorno sus resultados, decir que los argumentos de entrada son por valor y no pueden ser modificados, por lo que si queremos modificarlos debemos utilizarlos a su vez como salida. Si no hay valores de retorno se omiten los corchetes y el signo igual (=); si slo hay un valor de retorno no hace falta poner corchetes. Tampoco hace falta poner parntesis si no hay argumentos. Las variables definidas dentro de una funcin son variables locales, en el sentido de que son inaccesibles desde otras partes del programa y en el de que no interfieren con
Pg -63-
Manual de Iniciacin de Scilab variables del mismo nombre definidas en otras funciones o partes del programa. Se puede decir que pertenecen al propio espacio de trabajo de la funcin y no son vistas desde otros espacios de trabajo. Para que la funcin tenga acceso a variables que no han sido pasadas como argumentos es necesario declarar dichas variables como variables globales, tanto en el programa principal como en las distintas funciones que deben acceder a su valor. Dentro de la funcin, los valores de retorno deben ser calculados en algn sitio.De todas formas, no hace falta calcular siempre todos los posibles valores de retorno de la funcin, sino slo los que el usuario espera obtener en la sentencia de llamada a la funcin. En cualquier funcin existen dos variables definidas de modo automtico, llamadas varargin y varargout, que representan respectivamente el nmero de argumentos y el nmero de valores de retorno con los que la funcin ha sido llamada. Dentro de la funcin, estas variables pueden ser utilizadas como el programador desee. La ejecucin de una funcin termina cuando se llega a su ltima sentencia ejecutable. Si se quiere forzar el que una funcin termine de ejecutarse se puede utilizar la sentencia return, que devuelve inmediatamente el control al entorno de llamada.
Pg -64-
4. Grficos bidimensionales
A estas alturas, despus de ver cmo funciona este programa, a nadie le puede resultar extrao que los grficos 2-D de Scilab estn fundamentalmente orientados a la representacin grfica de vectores (y matrices). En el caso ms sencillo los argumentos bsicos de la funcin plot van a ser vectores. Cuando una matriz aparezca como argumento, se considerar como un conjunto de vectores columna (en algunos casos tambin de vectores fila). Scilab utiliza un tipo especial de ventanas para realizar las operaciones grficas. Ciertos comandos abren una ventana nueva y otros dibujan sobre la ventana activa, bien sustituyendo lo que hubiera en ella, bien aadiendo nuevos elementos grficos a un dibujo anterior. Todo esto se ver con ms detalle en las siguientes secciones.
con escalas lineales sobre ambos ejes, est orientado a la compatibilidad con MatLab. plot2d() crea un grfico con escala lineal o logartmica, segn las
opciones que la opcin que le demos. En lo sucesivo se har referencia casi exclusiva a la primera de estas funciones (plot). Plot2d se utiliza de un modo similar. Existen adems otras funciones orientadas a aadir ttulos al grfico, a cada uno de los ejes, a dibujar una cuadrcula auxiliar, a introducir texto, etc. Estas funciones son las siguientes:
Pg -65-
Manual de Iniciacin de Scilab title('ttulo') aade un ttulo al dibujo legend() define rtulos para las distintas lneas o ejes utilizados en la
figura. Para ms detalle, consultar el Help xgrid activa la inclusin de una cuadrcula en el dibujo. Con
Los dos grupos de funciones anteriores no actan de la misma forma. As, la funcin plot dibuja una nueva figura en la ventana activa (en todo momento Scilab tiene una ventana activa de entre todos las ventanas grficas abiertas), o abre una nueva figura si no hay ninguna abierta, sustituyendo cualquier cosa que hubiera dibujada anteriormente en esa ventana. Ahora se deben ejecutar los comandos siguientes: ->xgrid
-->x=0:0.1:10;
-->y=sin(x);
-->plot2d(x,y)
Pg -66-
Manual de Iniciacin de Scilab Ms adelante se ver que con la funcin hold pueden aadirse grficos a una figura ya existente respetando su contenido.
-->x=[1 3 2 4 5 3],plot(x)
El resultado de este comando es que se abre una ventana. Por defecto, los distintos puntos del grfico se unen con una lnea continua. Tambin por defecto, el color que se utiliza para la primera lnea es el azul. Cuando a la funcin plot() se le pasa un nico vector real como argumento, dicha funcin dibuja en ordenadas el valor de los n elementos del vector frente a los ndices 1, 2, ... n del mismo en abscisas. Ms adelante se ver que si el vector es complejo, el funcionamiento es bastante diferente. En la pantalla de su ordenador se habr visto que Scilab utiliza por defecto color blanco para el fondo de la pantalla y otros colores ms oscuros para los ejes y las grficas.
Pg -67-
Manual de Iniciacin de Scilab Una segunda forma de utilizar la funcin plot() es con dos vectores como argumentos. En este caso los elementos del segundo vector se representan en ordenadas frente a los valores del primero, que se representan en abscisas. Vase por ejemplo cmo se puede dibujar un cuadriltero de esta forma (obsrvese que para dibujar un polgono cerrado el ltimo punto debe coincidir con el primero):
La funcin plot() permite tambin dibujar mltiples curvas introduciendo varias parejas de vectores como argumentos. En este caso, cada uno de los segundos vectores se dibujan en ordenadas como funcin de los valores del primer vector de la pareja, que se representan en abscisas. Obsrvese bien cmo se dibujan el seno y el coseno en el siguiente ejemplo:
-->x=0:%pi/25:6*%pi;
-->y=sin(x); z=cos(x);
-->plot(x,y,x,z)
Ahora se va a ver lo que pasa con los vectores complejos. Si se pasan a plot() varios vectores complejos como argumentos, Scilab simplemente representa las partes reales y desprecia las partes imaginarias.
-->a=rand(3,3)+rand(3,3)*%i; -->plot(a)
Pg -68-
Como ya se ha dicho, si se incluye ms de un vector complejo como argumento, se ignoran las partes imaginarias. El comando plot puede utilizarse tambin con matrices como argumentos. Vanse algunos ejemplos sencillos: plot(A) dibuja una lnea por cada columna de A en ordenadas,
frente al ndice de los elementos en abscisas plot(x,A) dibuja las columnas (o filas) de A en ordenadas frente al
vector x en abscisas. Las dimensiones de A y x deben ser coherentes: si la matriz A es cuadrada se dibujan las columnas, pero si no lo es y la dimensin de las filas coincide con la de x, se dibujan las filas plot(A,x) anlogo al anterior, pero dibujando las columnas (o filas)
de A en abscisas, frente al valor de x en ordenadas plot(A,B) dibuja las columnas de B en ordenadas frente a las
columnas de A en abscisas, dos a dos. Las dimensiones deben coincidir. Se puede obtener una excelente y breve descripcin de la funcin plot() con el comando help plot. La descripcin que se acaba de presentar se completar en la siguiente seccin, en donde se ver cmo elegir los colores y los tipos de lnea.
Pg -69-
Pg -70-
Pg -71-
-->subplot(2,2,1), plot(x,y)
-->subplot(2,2,2), plot(x,z)
-->subplot(2,2,3), plot(x,w)
-->subplot(2,2,4), plot(x,v)
Se puede practicar con este ejemplo aadiendo ttulos a cada subplot, as como rtulos para los ejes. Se puede intentar tambin cambiar los tipos de lnea.
Pg -72-
a=get("current_axes") . Por defecto, Scilab ajusta la escala de cada uno de los ejes de modo que vare entre el mnimo y el mximo valor de los vectores a representar. Este es el llamado modo "auto", o modo automtico. Ahora tenemos en la variable a las propiedades de los ejes, modificando a que es un struct, podemos modificar los ejes del grfico.
Pg -73-
2d plotting
plot2d2 : dibuja un diagrama de escalera plot2d3 : dibuja un diagrama de barras plot2d4 : diagrama de flechas fplot2d : dibuja una funcin contour2d : dibuja curvas de nivel en 2 dimensiones fcontour2d : dibuja curvas de nivel en 2 dimensionesa partir de una funcin. grayplot : dibuja una superficie con colores fgrayplot : idem a partir de una funcin errbar : dibuja un diagrama de errores histplot : dibuja un histograma
Pg -74-
-->x=rand(100,1);
-->plot2d(x)
-->plot2d3(x)
Pg -75-
5. Grficos tridimensionales
SCILAB tiene posibilidades de realizar varios tipos de grficos 3D. La primera forma de grfico 3D es la funcin plot3d. Esta funcin dibuja una superficie en 3 dimensiones. -->t=[0:0.3:2*%pi]';
-->z=sin(t)*cos(t');
-->plot3d(t,t,z)
Ahora se ver cmo se representa una funcin de dos variables. Para ello se va a definir una funcin de este tipo en un fichero llamado test3d.sce. La frmula ser la siguiente: function z=test3d(x,y) z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ... - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
1/3*exp(-(x+1).^2
y.^2);
Pg -76-
-->u = linspace(-%pi/2,%pi/2,40);
-->v = linspace(0,2*%pi,20);
-->X = cos(u)'*cos(v);
-->Y = cos(u)'*sin(v);
-->Z = sin(u)'*ones(v);
-->plot3d2(X,Y,Z);
Pg -77-
Estos son unos ejemplos de las posibilidades que Scilab ofrece para el uso de grficos 3-D.
-->param3d(x,y,z);
que dibuja una lnea que une los puntos (x(1), y(1), z(1)), (x(2), y(2), z(2)), etc. y la proyecta sobre un plano para poderla representar en la pantalla. Al igual que en el caso plano, se puede incluir una cadena de 1, 2 3 caracteres para determinar el color, los markers, y el tipo de lnea, tambin se pueden utilizar tres matrices X, Y y Z del mismo tamao:
-->param3d(X,Y,Z)
en cuyo caso se dibujan tantas lneas como columnas tienen estas 3 matrices, cada una de las cuales est definida por las 3 columnas homlogas de dichas matrices. A continuacin se va a realizar un ejemplo sencillo consistente en dibujar un cubo. Para ello se crear una matriz que contenga las aristas correspondientes, definidas mediante los vrtices del cubo como una lnea poligonal continua (obsrvese que algunas aristas se dibujan dos veces). La matriz A cuyas columnas son las coordenadas de los vrtices, y cuyas filas son las coordenadas x, y y z de los mismos: Pg -78-
-->param3d(A(1,:)',A(2,:)',A(3,:)')
-->clf
Pg -79-
-->v = linspace(0,2*%pi,20);
-->X = cos(u)'*cos(v);
-->Y = cos(u)'*sin(v);
-->Z = sin(u)'*ones(v);
-->plot3d2(X,Y,Z);
Se habr podido comprobar que la funcin plot3d2 dibuja en perspectiva una funcin en base a una retcula de lneas de colores, rodeando cuadrilteros del color de fondo, con eliminacin de lneas ocultas. Ejectese ahora el comando:
-->plot3d2(X,Y,Z) En vez de lneas aparece ahora una superficie faceteada (aunque no es fcilmente visible, pero de manera terica es as). El color de las facetas depende tambin del valor de la funcin.
Pg -80-
-->t=%pi*[-10:10]/10;
-->deff("[z]=surf(x,y)","z=sin(x)*cos(y)"); z=feval(t,t,surf);
-->rect=[-%pi,%pi,-%pi,%pi,-1,1];
-->contour(t,t,z,10,35,45," ",[0,1,0],rect)
Pg -81-
Si no se indica ningn nombre de variable, se guardan todas las variables creadas en esa sesin.
Pg -82-
octave:32>diary filename
Pg -83-
Lo que se va a hacer es calcular la integral definida de esta funcin entre dos valores de la abscisa x. Calculamos el rea comprendida bajo la funcin entre los puntos 0 y 1 (obsrvese que el nombre de la funcin a integrar se pasa entre apstrofos, como cadena de caracteres):
-->integrate('prueba(x)','x',0,%pi) ans = 23.16678
Pg -84-