Slides Octave

download Slides Octave

of 44

Transcript of Slides Octave

QFII

Uso de octave y gnuplot en Qu micaV ctor Luaa n(con la colaboracin de Alberto Otero y J. M. Recio) o

Departamento de Qu mica F sica y Anal tica, Universidad de Oviedo

c V. Luaa 2003-2010 n

(1)

A. Gnuplot y octave

Introduccin o

Apndice A. GNUplot y octave eGNUPlot es un programa de dibujo 2D y 3D distribuido gratuitamente como cdigo libre. Produce o de modo muy sencillo grcas de funciones y datos experimentales. El usuario dispone de un control a preciso del aspecto del dibujo y de un enorme nmero de formatos de salida. Proporciona adems u a una herramienta simple y eciente para realizar un ajuste de m nimos cuadrados de una funcin no o lineal a una coleccin de datos experimentales. En conjunto se trata de una poderosa herramienta o que merece la pena conocer y dominar. Octave es un lenguaje de programacin diseado para facilitar el acceso a tcnicas muy avanzadas o n e de tratamiento de matrices y vectores con un esfuerzo m nimo. Preparado para ser usado interactivamente como si se tratara de una calculadora muy sosticada, el lenguaje incorpora rutinas para hacer integrales denidas, resolver sistemas lineales, encontrar valores y vectores propios, resolver ecuaciones diferenciales, etc. Con muy poco esfuerzo de aprendizaje el alumno estar rpidamente capacitado para abordar problemas del curso que ser esencialmente intratables a a an sin el uso de un ordenador.

c V. Luaa 2003-2010 n

(439)

A. Gnuplot y octave

GNUPlot: instalacin y primeros dibujos. o

GNUPlot: instalacin y primeros dibujos. oFuente y ejecutables estn disponibles en http://www.gnuplot.info. a Uso interactivo y no interactivo: Un dibujo sencillo se puede crear interactivamente. Las ordenes de dibujo de la sesin interactiva se pueden recuperar y modicar con los cursores. o Una vez tengamos un dibujo listo, podemos archivar el conjunto completo de instrucciones necesarias para repetirlo con: save "dibujo.gnu" . Podemos recuperar un archivo anterior en una nueva sesin interactiva: load "dibujo.gnu" . o Tambin podemos hacer que gnuplot ejecute el dibujo denido en un archivo: e gnuplot dibujo.gnu desde una terminal. abriendo dibujo.gnu con gnuplot en un entorno de escritorio. Con un poco de prctica, el archivo de rdenes se crea a mano, y ste llega a ser el modo a o e ms eciente de trabajar cuando se domina el programa o cuando se quiere controlar con gran a detalle el aspecto del dibujo. El programa permite consultar interactivamente la documentacin: help orden . o Hay un extenso manual y un gran nmero de dibujos de ejemplo en http://www.gnuplot.info. u La libreta de problemas de qu mica f sica cuenta con un buen nmero de grcos explicados u a detalladamente: http://www.uniovi.es/qcg/d-qf2/Problemas.pdf.(440)

c V. Luaa 2003-2010 n

A. Gnuplot y octave

GNUPlot: instalacin y primeros dibujos. o

1

plot sin ( x ) , x * sin ( x )

15 10 5 0 5 10 15 15 10 5 0 5

sin(x) x*sin(x)

1

plot [0:2* pi ] sin ( x ) , x * sin ( x )

1 2 3

set samples 201 set xrange [ -5* pi : 5* pi ] plot sin ( x ) , x * sin ( x )

10

15

1 2 3 4 5 6 7 8

set isosamples 51 ,51 set grid xtics ytics ztics set view 41 ,343 set xrange [0:360] set yrange [0:360] radian ( x ) = x * pi / 180 f (x , y ) = sin ( radian ( x ))* sin ( radian ( y )) splot f (x , y ) with pm3d

f(x,y) 1 0.8 0.6 0.4 0.2 0 0.2 0.4 0.6 0.8 1 350 300 250 200 150 100 50 0 0 1 0.8 0.6 0.4 0.2 0 0.2 0.4 0.6 0.8 1

300 350 200 250 150 50 100

c V. Luaa 2003-2010 n

(441)

A. Gnuplot y octave

GNUPlot: instalacin y primeros dibujos. o

Dibujos de curvas y supercies: Tipo 1D 2D orden plot f(x), ... splot f(x,y), ... dibujo y = f (x) z = f (x, y)

Dibujos paramtricos (se activan con set parametric y se desactivan con unset parametric ): e Tipo 1D 2D orden plot x(t),y(t), ... splot x(u,v),y(u,v),z(u,v) ... dibujo r(t) = [x(t), y(t)] r(u, v) = [x(u, v), y(u, v), z(u, v)]

Una orden plot ms completa: a plot [ < definiciones > ,] [ < rango >] [ < iteracion >] { < funcion > | " < archivo . dat > " [ modificadores ]} [ axes < ejes >] [ < titulo >] [ with < estilo >] [ , ...] [opcional] {obligatorio} uno | u otro

c V. Luaa 2003-2010 n

(442)

A. Gnuplot y octave

GNUPlot: instalacin y primeros dibujos. o

Ajustes de m nimos cuadrados empleando gnuplot:25 f(x) datos.dat using 1:2

20

500 Archivo datos.dat: 520 ... 1000

0.1831564 0.3916390 ... 0.001234115

10

5

0 500

600

700

800

900

1000

1 2 3 4 5 6 7 8

# F u n c i o n de a j u s t e : suma de d o s g a u s i a n a s f ( x ) = A1 * exp ( -(( x - m1 )/ s1 )**2) + A2 * exp ( -(( x - m2 )/ s2 )**2) # A j u s t e no l i n e a l de minimos c u a d r a d o s m1 = 650; m2 = 750; s1 = 20; s2 = 5; A1 = 10; A2 = 20; fit f ( x ) datos . dat using 1:2 via m1 , s1 , A1 , m2 , s2 , A2 # D i b u j o de l o s d a t o s y l a f u n c i o n , p a r a c o m p r o b a r set style line 2 lt 3 lw 1 pt 2 ps 2.0 plot f ( x ) , datos . dat using 1:2 ls 2

c V. Luaa 2003-2010 n

(443)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Octave: instalacin y primeros pasos. oFuente y ejecutables estn disponibles en http://www.octave.org. Un extenso nmero de librer a u as adicionales estn disponibles en http://octave.sourceforge.net. a Octave sirve como una calculadora cient ca avanzada que sabe trabajar con vectores, matrices, nmeros complejos, resolver sistemas lineales, ecuaciones diferenciales, etc. En los clculos ms u a a sencillos usaremos octave interactivamente, escribiendo rdenes y viendo inmediatamente los o resultados. Para tareas ms complicadas es mejor programar previamente el trabajo y editar un a archivo con las rdenes para octave. Los archivos con programas octave llevan el apellido .m . o

Ayuda integrada:

Octave incorpora su propia documentacin: help orden . o

La asignacin es la instruccin bsica de octave: o o a1

variable = operacion Se realiza la operacin y el resultado se almacena en la variable para poder ser usado o posteriormente. No debe entenderse como una igualdad matemtica. La asignacin x = x+1 a o es perfectamente vlida (aumenta en 1 el valor anterior de x). a Los nombres de variable comienzan por una letra, seguida de letras, d gitos decimales, y algunos s mbolos como . Ej.: pepe, x 123. Maysculas y minsculas son s u u mbolos diferentes. Una operacin puede contener: nmeros, variables, operaciones aritmticas, funciones, . . . o u ec V. Luaa 2003-2010 n

(444)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Nmeros en formato de coma otante: uEjemplo: Equivale: +1.234e-73 +1,234 1073 123 123 123. 123,0 -.12 0,12 1e10 1 1010 .14d+23 0,14 10+23

IEEE 754 Doble precision (64 bits)

63

52

0

Signo: 1 bit Exponente: 11 bits Mantisa: 52 bits realmax Reales negativos

realmax: 1.797... 10 realmin: 2.225 ... 10 , precision: unas 16 cifras decimales (1 + eps) 1 realmin +realmin Reales positivos 0 eps: 2.220 ... 1016

308

308

realmax

Infc V. Luaa 2003-2010 n

0

+Inf(445)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Operaciones aritmticas (escalares): eOperaciones: + (suma), (resta), (multiplicacin), / (divisin), ^ (potencia). o o o No hay producto impl cito: es 2*x , no 2x . Ejemplos: 2*pi/3 , 3/2 + 12 * sin(pi/3/2) + 5 . Precedencia: (de mayor a menor) ( ) signo y / + y . De izquierda a derecha () en caso de igual precedencia. En caso de duda, usar parntesis: ( ) . e Ejemplos: 2**3**4 ((23 )4 ), pi/2/3 (/6), pi/(2/3) (3/2).

Algunas funciones intr nsecas:sin(x), cos(x), tan(x) asin(x), . . . atan2(x,y) log(x), log10(x) abs(x), exp(x), sqrt(x) arctan(x/y) Ojo: ln x y log[10]x |x|, ex , x x en radianes ceil(z) floor(z) fix(z) round(z) rem(x,y) menor entero no inferior mayor entero no superior parte entera entero ms prximo a o resto de la divisin entera o(446)

c V. Luaa 2003-2010 n

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Denir vectores y matrices: Rango: inicio:fin (de 1 en 1) inicio:salto:fin . o Ejemplo: 1:10, 0:pi/10:pi, 3:-0.1:0. Tambin: linspace(inicio, fin, num) , logspace(inicio, fin, num) . e Vector la: [e1, e2, e3, ...] . Ejemplo: [12.3, pi/3, 12**2, sin(pi/6)]. Vector columna: [e1; e2; e3; ...] . Ejemplo: [1; 2; 3]. Matriz: [e11, e12, e13, ...; e21, e22, e23, ...; ...] . !1 4 7 2 5 8 3 6 9

Ejemplo: [1, 2, 3; 4, 5, 6; 7, 8, 9] produce

.

Las funciones intr nsecas (sin, cos, exp, ...) pueden recibir un vector o matriz como argumento y devolver un vector o matriz como resultado. Ejemplo: y = sin(0 : pi/12 : 2*pi). Transponer las en columnas: x transpose(x) . o Podemos componer una matriz juntando vectores la o columna: Si c1=[1;2;3] y c2=[4;5;6] examina [c1,c2] y [c1;c2] (prueba otras posibilidades).c V. Luaa 2003-2010 n

(447)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Controlar el resultado de una operacin: o Si una operacin naliza con punto y coma ( operacion; ) no se imprime su resultado. o Varias asignaciones pueden escribirse como una sla orden separamos por punto y coma. o Ejemplo: x = 0:pi/6:2*pi; y = sin(x); z = log(y); format permite controlar el aspecto de los resultados de una operacin. Esto no o afecta a la precisin interna de los clculos. o a format short; pi produce 3.1416. format long; pi produce 3.14159265358979. Consultar otras opciones: help format. El resultado ms reciente de una operacin que no haya sido asignado expl a o citamente a una variable se puede recuperar de la variable por defecto ans . Ejemplo: pi/3; pi/6; pi/8 produce ans = 0.39270. diary on comienza a guardar las rdenes y resultados que se produzcan en un chero o llamado diary en el directorio de trabajo. diary off naliza el archivo de rdenes y resultados. o diary fichero establece cherocomo cuaderno de bitcora y lo activa. a disp(X) imprime en la pantalla el valor de X.(448)

c V. Luaa 2003-2010 n

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Tablas de valores de una o varias funciones:1. Rejilla de valores de la variable independiente: A mano: x = [0, pi/6, pi/4, pi/3, pi]; Un rango: x = xini : dx : xfin;

x = linspace(xini, xfin, n);

2. Evaluamos las funciones: y = sin(x); z = cos(x); . . . Pueden ser funciones propias, pero deben estar preparadas para recibir y devolver un vector. 3. disp([x; y; z]) producex1 y1 z1 x2 y2 z2 x3 y3 z3 x1 x2 x3 y1 y2 y3 z1 z2 z3 t1 t2 t3

4.

disp([x, y, z, t]) produce

5. printf(%8.3f %12.6f %12.6f\n, [x; y1; y2]) permite controlar el formato de cada columna.

c V. Luaa 2003-2010 n

(449)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Dibujo de una o varias funciones de una variable:Dibujo de ejemplo 1

1 2 3 4 5 6 7 8 9 10

x = linspace (0 , pi , 101); y1 = sin ( x ); y2 = cos ( x ); y3 = sin ( x ) .* cos ( x ); xlabel ( abscisa ) ylabel ( ordenada ) title ( Dibujo de ejemplo ) grid plot (x , y1 , x , y2 , x , y3 ) print ( dibujo1 . eps , - depsc2 )

line 1 line 2 line 3

0.5

ordenada

0

-0.5

-1 0 0.5 1 1.5 abscisa 2 2.5 3 3.5

Tambin produce el mismo dibujo: plot(x, [y1; y2; y3]) . e Otros estilos de dibujo 2D: semilogx, semilogy, loglog, polar, bar, pie, hist, stem, stairs, . . . Dibujos 3D: plot3, meshgrid, contour, . . . Mirar tambin: axis, legend, text, replot, subplot, gure. e Agregar dibujos sobre uno previo: hold on , hold off . Varios dibujos en una pgina: a subplot(rows,cols,index) . Volcar un dibujo a un chero: print("archivo", "estilo") .c V. Luaa 2003-2010 n

(450)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Operaciones con complejos: Un complejo en forma cartesiana: z = 2 + 3i . i,j,I,J estn inicialmente asociados a (0+1i). a Tambin: z = x + i * y , siendo x e y las partes real e imaginaria del nmero. e u Un complejo en forma polar: z = r * exp(i*theta) . p De la forma cartesiana a la polar: r = |z| = x2 + y 2 , = arctan(y/x). De la forma polar a la cartesiana: x = r cos , y = r sen . Frmula de Euler: ei = cos + i sen . o Funciones como sin(), cos(), sqrt(), etc, operan sobre complejos o sobre reales. Funciones espec cas para manipular complejos: abs(z) : mdulo de z. o angle(z) arg(z) : ngulo de fase. o a conj(z) : conjugado complejo (z ). real(z) : parte real de z. imag(z) : parte imaginaria de z.

c V. Luaa 2003-2010 n

(451)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Operaciones con vectores y matrices:Notacin: A, B, matrices; x, y, vectores la; m, n, dimensiones; i, j, o ndices. operacin o suma resta producto potencia divisin por la derecha o divisin por la izquierda o transpuesta conjugada transpuesta C = A+B C = A-B C = A*B C = A**n C = A/B C = A\B C = A C = A. Escalar Producto de vectores: Vectorial Directo o cartesiano de matrices Cij = Aij + Bij Cij = Aij Bij P Cij = k Aik Bkj C = AAA C = [(BT )1 AT ]T C = A1 B Cij = A ji Cij = Aji s=xy z =xy A=xy x*y dot(x,y) o cross(x,y) x*y elemento a elemento C = A.+B C = A.-B C = A.*B C = A.**n C = A./B C = A.\B lo mismo lo mismo Cij = Aij Bij Cij = An ij Cij = Aij /Bij Cij = Bij /Aij

c V. Luaa 2003-2010 n

(452)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Propiedades de vectores y matrices: det(A) trace(A) rank(A) conj(A) inv(A) inverse(A) [vec,val] = eig(A) [R,K] = rref(A) sum(A,dim) sum(sum(A)) sumsq(A,dim) diff(x,k) [m,n] = size(A) length(A) determinante de una matriz cuadrada P traza de la matriz ( i Aii ) rango (dimensin del mayor determinante no nulo) o matriz conjugada matriz inversa matriz inversa vectores y valores propios forma escalonada reducida por las suma de elementos segn la dimensin dim (1 por defecto) u o suma de todos los elementos de la matriz suma de cuadrados diferencias nitas de orden k del vector x dimensiones (m n) de la matriz dimensin mxima de la matriz o a

c V. Luaa 2003-2010 n

(453)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Matrices especiales:eye(n) ones(m,n) zeros(m,n) repmat(A,m,n) rand(m,n) Devuelve la matriz unidad n n. Matriz m n formada por unos. La forma ones(n) equivale a ones(n,n). Matriz m n formada por ceros. La forma zeros(n) equivale a zeros(n,n). Matrix m n que tiene A en cada bloque. Matriz m n formada por nmeros aleatorios uniformemente distribuidos en u o u [0, 1). Es vlida la variante rand(n) (matriz n n) y rand (un slo nmero). a Con rand("seed") se puede consultar el valor que tiene la semilla inicial del generador, y con rand("seed",valor) se puede establecer una nueva semilla. Matriz de nmeros aleatorios normalmente distribuidos, con centro en 0 y u desviacin t o pica unidad. Acepta las mismas variantes que rand(). Matriz de nmeros aleatorios que siguen una distribucin exponencial. u o Matriz de nmeros aleatorios que siguen una distribucin de Poisson. u o Permutacin aleatoria de los enteros 1 . . . n. o Crea una matriz con el vector v ocupando la diagonal k. Crea una matriz de Vandermonde cuya penltima columna es el vector v. u

randn(m,n) rande(m,n) randp(m,n) randperm(n) diag(v,k) vander(v)

c V. Luaa 2003-2010 n

(454)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Seleccionar elementos y bloques de un vector o matriz:A A(i,j) x(i) A(i,:) A(:,j) A(1:3,:) A([1,7,5],[2,8]) A(:) i = find(A>0.9) A(i) A(find(A 0.9 Elementos correspondientes al ndice i Elementos que cumplen Aij 0.5

A(:,[1,2]) = A(:,[2,1]); # intercambio de dos columnas de una matriz. 03 3 3 3 B3 A = 3*ones(5); A(2:4,2:4) = 2; A(3,3) = 1; # produce B3 @3 3 c V. Luaa 2003-2010 n 2 2 2 3 2 1 2 3 2 2 2 3

3 3 3 3 3

1 C C A(455)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Resolver un sistema lineal de ecuaciones:Si hay tantas ecuaciones como incgnitas y la matriz de coecientes no es singular, la solucin o o es unica: 9 3 2 32 3 2 5 2 3 1 x 2x + 3y z = 5 > = 7 76 7 6 6 6x 2y + z = 33 = 4 6 2 1 5 4 y 5 = 4 33 5 = A x = b = x = A\b . > 2 1 1 1 z x + y + z = 2 ; En forma ms general: a M : nmero de variables. Determina la dimensin del espacio de trabajo (RM ). u o N : nmero de ecuaciones. De momento, slo examinaremos el caso M N . u o R: rango de la matriz de coecientes (R = rank(A)). Nmero de ecuaciones linealmente u independientes. L = M R: grados de libertad. Nmero de variables que son independientes entre s y que u no estn especicadas por el sistema. a La solucin del sistema es un subespacio RL en el espacio RM del problema. o L = 0: Solucin unica (un punto). o L = 1: la solucin es una recta. o L = 2: la solucin es un plano. oc V. Luaa 2003-2010 n

(456)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Las soluciones de un sistema lineal no se modican si se somete a los siguientes cambios: una ecuacin se intercambia por otra. o una ecuacin se multiplica por una constante no nula. o una ecuacin se sustituye por una suma de s misma y un mltiplo de otra ecuacin. o u o dos variables se intercambian entre s en todas las ecuaciones (intercambio de columnas), aunque hay que tener en cuenta el cambio para interpretar la solucin nal. o Mediante estos cambios, todo sistema lineal se puede convertir a una forma escalonada por las, o forma de Gauss-Jordan. Ejemplo: 9 8 9 8 > x + 0 + 0 6t = 1 > > x = 1 + 6t x + y + z + t = 1> = < = < 2x + 3y 5z + t = 2 A x = b 0 + y + 0 + 6t = 0 y = 6t > > > > :0 + 0 + z + t = 0; : z = t 3x + 2y + 5z t = 3 ; Es muy cmodo trabajar con la matriz de coecientes ampliada con la o independientes: 1 0 0 1 1 1 1 1 1 0 C B B B = (A|b). En el ejemplo: @ 2 3 5 1 2 A @ 0 1 3 2 5 1 3 0 0 columna de trminos e 0 6 1 C 0 6 0A 1 6 0 1

Si el rango de la matriz ampliada supera al rango de la matriz de coecientes, el sistema es imposible.c V. Luaa 2003-2010 n

(457)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Usando octave, ingresar amos la matriz de coecientes y la de trminos independientes del ejemplo e mediante:1 2

A = [1 , 1 , 1 , 1; b = [1; 2; 3];

2 , 3 , -5 , 1;

3 , 2 , 5 , -1];

Podemos construir la matriz ampliada y ver los rangos de A y B (3 y 3 en este caso) con1 2 3

B = [A , b ]; rank ( A ) rank ( B ) El sistema se puede reducir a la forma escalonada empleando la funcin rref(B): o

1 2 3 4 5

[R , K ] = rref ( B ) R = 1.00000 0.00000 0.00000 1.00000 0.00000 0.00000 K = 1 2 3

0.00000 0.00000 1.00000

-6.00000 6.00000 1.00000

1.00000 0.00000 0.00000

En este resultado, R contiene la forma escalonada, y K indica cules son las variables que han sido a reducidas. La rutina rref() forma parte de la librer octave forge. a

c V. Luaa 2003-2010 n

(458)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Valores y vectores propios de una matriz cuadrada:Sea A una matriz n n, xi un vector propio (columna) asociado al valor propio i . Se cumplen las ecuaciones A xi = i xi A X = X = X1 A X donde X es la matriz que tiene a los vectores propios por columnas, es decir [x1 x2 xn ], y es la matriz diagonal de los vectores propios. Se dice que X diagonaliza la matriz A mediante la transformacin de semejanza X1 AX. o Otros nombres: autovectores, eigenvectors, autovalores, eigenvalues. Dos casos nos interesan particularmente: Si A es simtrica (AT = A) X es ortogonal (XT = X1 ) y los valores propios son nmeros reales. e u Si A es herm tica (AH = A) X es unitaria (XH = X1 ) y los valores propios son nmeros reales. u (Nota: recuerda que AH = (A )T .) Empleando octave:1

[ vectores , valores ] = eig ( A );

c V. Luaa 2003-2010 n

(459)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Polinomios:Un polinomio de grado n se dene por su matriz de coecientes: Pn (x) = c1 xn + c2 xn1 + + cn x + cn+1 Las principales funciones de octave en el trabajo con polinomios son: y = polyval(c,x) Evala el polinomio de coecientes c en los puntos que indica el vector u x. El resultado es un vector de valores. c = polyfit(x,y,n) Ajusta, en el sentido de m nimos cuadrados, un polinomio de grado n a los datos contenidos en los vectores x e y. El resultado es el vector de coecientes. r = roots(c) Encuentra las raices del polinomio de coecientes c. polyout(c, VAR) Escribe el polinomio de coecientes c empleando VAR como nombre de la variable (por defecto se llama s). y = conv(a,b) Si a y b son los coecientes de sendos polinomios, conv(a,b) devuelve los coecientes del polinomio producto. En general, devuelve la convolucin de a y b. o [b,r] = deconv(y,a) Encuentra cociente y resto de la divisin de polinomios, de modo que o y=conv(a,b)+r.

Otras funciones relacionadas con polinomios son: compan, filter, poly, polyder, polyderiv, polyinteg, polyreduce, polyvalm, residue.c V. Luaa 2003-2010 n

(460)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Denir nuevas funciones:1 2 3

function a rg um e nt o s_ sa l id a = nombre ( a r g u m e n t o s _ e n t r a d a ) instrucciones de la f u n c i n endfunction1 2 3

Ejemplo:

4 5 6 7

function y = mifun ( x ) y = 3* x **2 + 5* sin ( x /2); endfunction mifun (3* pi /8) for x = 0: pi /10: pi disp ([ x , mifun ( x )]) endfor

Funcin vectorizada: es una funcin preparada para recibir un escalar/vector/matriz de datos o o y devolver, a su vez, un escalar/vector/matriz de resultados. Muchas rutinas de integracin, o minimizacin, etc, requieren que se les pasen funciones vectorizadas. Como receta sencilla, las o operaciones internas deben ser las variantes elemento a elemento: .*, ./, .** . . .1 2

Ejemplo:

3 4

function y = mifun ( x ) y = 3.* x .**2 .+ 5.* sin ( x ./2); endfunction x = 0: pi /10: pi ; y = mifun ( x ); plot (x , y )

c V. Luaa 2003-2010 n

(461)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Argumentos de entrada: En la denicin de la funcin se trata de una lista de variables separadas por comas. Cada o o variable puede ser un escalar, vector, matriz, . . . Al llamar una funcin, cada argumento puede ser una expresin: los argumentos se pasan por o o valor. Los argumentos en la llamada y en la denicin se asocian por orden y no por nombre. o Argumentos de salida: En la denicin de la funcin se trata de una variable, o de una coleccin de variables encerradas o o o entre corchetes y separadas por comas. Se supone que los argumentos de salida reciben un valor dentro de la funcin, y este es el resultado que se devuelve al programa de llamada. o Las funciones constituyen el mecanismo de octave para facilitar la programacin en mdulos o o independientes. Cada funcin es un mdulo, con sus propias variables locales. Los argumentos de o o entrada y salida (o una instruccin global) son los unicos mecanismos por los que las funciones se o transmiten informacin. o Caracter sticas avanzadas: El nmero de argumentos de entrada y salida puede ser variable. Las funciones nargin() y u nargout() permiten conocer el nmero de argumentos que se han usado en la llamada y que u se esperan como resultado de la funcin, respectivamente. oc V. Luaa 2003-2010 n

(462)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Las funciones de octave admiten recursin directa e indirecta. o Una variable puede ser declarada global para ser compartida en varias funciones. Todas las funciones que la necesiten deben declararla. Esto permite una cadena de llamadas: A llama a B, B llama a C, en la que A y C pero no B compartan una variable global. Por defecto, cuando acaba una rutina sus variables desaparecen y pierden su valor. Esto puede evitarse declarando una variable como persistente. La instruccin return puede usarse para interrumpir una rutina y devolver, de inmediato, el o control al programa de llamada. Una funcin llamada funcy almacenada en el chero func.mser visible para octave siempre o a que el chero se encuentre en un directorio denido en el rbol de llamadas (vase path y a e addpath). Tambin puede invocarse expl e citamente con source(func.m).

c V. Luaa 2003-2010 n

(463)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Raices de ecuaciones f (x) = 0:Llamada general:1

[x , info , msg ] = fsolve ( fcn , x0 )

fcn: Nombre de la funcin que calcula las f (x). o x0: Vector que contiene el valor inicial de las variables. Si el sistema tiene mltiples soluciones u ser necesario realizar una bsqueda cuidadosa comenzando en diferentes puntos. a u x: Solucin encontrada. o info: Condicin de terminacin opcional. Puede consultarse su signicado con perror(fsolve,info). o o msg: Mensaje de terminacin opcional. o Ejemplo:1 [x , info , msg ] = fsolve ( (1 -2* x )* cos ( x ) , 0.1)

Ejemplo: Resolver el siguiente sistema no lineal partiendo del punto inicial (x, y) = (1, 2). f1 (x, y) = 2x2 + 3xy + 4 sen y 6 = 0,1 2 3 4 5

f2 (x, y) = 3x2 2xy 2 + 3 cos x + 4 = 0.

function y = f ( x ) y (1) = -2* x (1)**2 + 3* x (1)* x (2) + 4* sin ( x (2)) - 6; y (2) = 3* x (1)**2 - 2* x (1)* x (2)**2 + 3* cos ( x (1)) + 4; endfunction [x , info ] = fsolve ( " f " , [1;2])c V. Luaa 2003-2010 n

(464)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

6 7 8 9

== > x : 0.57983 2.54621 == > info : 1 perror ( fsolve , info ) == > solution converged to requested tolerance En el caso de sistemas multidimensionales, fsolve, puede utilizar la informacin del Jacobiano del o sistema, es decir, de las derivadas parciales Jij = fi /xj . Para ello, debe haber una funcin que o proporcione las componentes de la matriz Jij , y el argumento de llamada fcn debe consistir en un vector con los nombres de la funcin que evala f (x) y de la que lo hace con Jij . Es el caso del o u ejemplo siguiente

1 2 3 4 5 6 7 8 9 10 11

function y = fun ( x ) y (1) = -2* x (1)**2 + 3* x (1)* x (2) + 4* sin ( x (2)) - 6; y (2) = 3* x (1)**2 - 2* x (1)* x (2)**2 + 3* cos ( x (1)) + 4; endfunction function J = jac ( x ) J (1 ,1) = -4* x (1) + 3* x (2); J (1 ,2) = +3* x (1) + 4* cos ( x (2)); J (2 ,1) = 6* x (1) - 2* x (2)**2 - 3* sin ( x (1)); J (2 ,2) = -4* x (1)* x (2); endfunction [x , info ] = fsolve ([ " fun " ," jac " ] , [1;2])

c V. Luaa 2003-2010 n

(465)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Integrales denidas:Octave dispone de la funcin quad() para evaluar numricamente integrales denidas. Un ejemplo o e sencillo ser a Z /3 1 K = quad ( sin , 0 , pi /3) K= sen x dx0

Una forma ms completa de la orden es: a1

[ valor , ier , nfun , err ] = quad (f , a , b , TOL , SING ) Los argumentos de entrada son: f: nombre de la funcin que calcula en integrando. Normalmente ser una funcin de usuario, o a o y debe estar preparada para que quad() la llame como y=f(x). a y b: l mites de integracin. Pueden ser +Inf y -Inf. o TOL: tolerancia o precisin requerida de la integral. Si se trata de un vector, el primer elemento o indica una tolerancia absoluta y el segundo elemento una relativa. SING: si el integrando presenta singularidades, la rutina de integracin tratar con particular o a cuidado los puntos que se indiquen en el vector SING. Los argumentos de salida son:c V. Luaa 2003-2010 n

(466)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

valor: resultado de la integracin. o ier: posible condicin de error. El valor de ier ser no nulo en el caso de que haya habido o a algn problema o no se haya alcanzado la precisin requerida. u o nfun: nmero de evaluaciones del integrando que se han realizado. u err: estimacin del error de la solucin. o o Z 3 p Un ejemplo ms complicado: K = a x sen(1/x) |1 x| dx.01 2 3 4 5 6 7 8

function y = integrando ( x ) y = x .* sin (1./ x ) .* sqrt ( abs (1. - x )); endfunction [K , ier , nfun , err ] = quad ( " integrando " , 0 , 3) = > 1.9819 => 1 = > 5061 = > 1.1522 e -07 Una representacin del integrando permite apreciar las complejidades de esta integral. Pese a la o bandera de error (ier=1) el resultado es bastante preciso. El paquete integration del conjunto de Octave-forge incluye rutinas de integracin en dos o ms o a dimensiones. Pueden consultarse: gquadnd, gquad2dgen, quad2dcgen, quad2dggen, quadndg, . . .c V. Luaa 2003-2010 n

(467)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Ecuaciones diferenciales ordinarias: La rutina lsode() resuelve sistemas de ecuaciones diferenciales de primer orden, r = f (r, t), con condiciones iniciales r(t0 ) = r0 :1

[x , info , msg ] = lsode ( fcn , x0 , t , tcrit ) fcn: Nombre de la funcin que calcula las f (r, t). En algunos problemas es util crear una segunda o rutina que calcule la matriz jacobiana, Jij = fi /xj . En ese caso fcn es [fun;jac] (string array) {fun;jac} (cell array). Las llamadas a estas rutinas sern fun(x,t) y o a jac(x,t), donde x es un vector y t un escalar. x0: Condiciones iniciales r(t0 ) = r0 . t: Vector con los valores de t en los que debe evaluarse la funcin integrada. Generalmente se o crea superponiendo una o varias llamadas a linspace() o logspace().

tcrit: Puntos singulares que deben ser evitados (opcional). x: Matriz de resultados. info: Condicin de terminacin opcional (2 si todo ha ido bien). o o msg: Mensaje de terminacin opcional. o La rutina lsode_options() puede utilizarse para modicar el funcionamiento de lsode().c V. Luaa 2003-2010 n

(468)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Ejemplo: Integrar x = x cos t con x(0) = 1 en t [0, 2] (Solucin exacta: x = esen t ). o1 2 3

t = 0: pi /51:2* pi ; [x , info , msg ] = lsode ( x * cos ( t ) , 1 , t ); plot (t , x ) Una ecuacin diferencial de orden n puede convertirse en n ecuaciones acopladas de primer orden y o ser resuelta mediante lsode(). Ejemplo: Integrar y + y + 2y = 0 con y(0) = 0 y y(0) = 1 en t [0, 1] (Solucin exacta: o y(t) = et e2t ). Denimos: x1 = y, x2 = y, de modo que x1 = x2 y x2 = 3x2 2x1 con [x1 (0), x2 (0)] = [0, 1]. De aqu :

1 2 3 4 5 6 7

function xdot = fcn (x , t ) xdot (1) = x (2); xdot (2) = -3* x (2) -2* x (1); endfunction t = linspace (0 ,1 ,101); x0 = [0 ,1]; [x , info , msg ] = lsode ( fcn , x0 , t ); plot (t , x ) Existen otras rutinas para el problema similar de resolver el sistema f (r, r, t) = 0 con las condiciones r(t0 ) = r0 y r(t0 ) = r0 . Son: daspk, dassl, y dasrt.c V. Luaa 2003-2010 n

(469)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Programacin y estructuras de control oUn programa es una coleccin estructurada de instrucciones, algoritmos, que actan sobre una o u coleccin de datos organizados: o Algoritmos + Estructuras de datos = Programas Teorema de la estructura: Cualquier programa se puede construir utilizando tan slo tres tipos de o estructuras de control: Secuencial. Por defecto, las instrucciones de un programa se ejecutan secuencialmente, siguiendo el orden en el que se han escrito o ingresado. Condicional. Permite bifurcar la marcha del programa en dos o ms rutas diferentes dependiendo a de alguna condicin que cumplan los datos. o Iterativa o bucle. Repite un fragmento del programa. Puede tratarse de: Bucle con contador: El fragmento se repite un nmero predeterminado de veces. u Bucle con condicin inicial: El fragmento se repite mientras se cumpla una cierta o condicin. Posiblemente nunca llegue a realizarse si la condicin es falsa desde el principio. o o Bucle con condicin nal: El fragmento se repite hasta que se cumpla una cierta condicin. o o En cualquier caso, el bucle se realiza al menos en una ocasin. o Una estructura puede contener otra, siempre y cuando la segunda se encuentre totalmente contenida dentro de la primera: estructuras anidadas.c V. Luaa 2003-2010 n

(470)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Estructura condicional: bloques ifif (condicin) o bloque-s else bloque-no endif if (condicin-1) o bloque-s -1 elseif (condicin-2) o bloque-s -2 else bloque-no endif

if (condicin) o bloque-s endif

El bloque if puede tener tantas partes elseif como sea necesario. Cuidado: elseif no debe tener espacios. La aparicin de else if se interpreta como un segundo o bloque if dentro de la parte else del primer bloque. Ejemplo elemental:1 2 3 4 5 6 7 8

n = input ( Ingresa un numero natural ); if ( rem (n ,2) == 0) disp ([ str2num ( n ) , es par ]) elseif ( rem (n ,2) == 1) disp ([ str2num ( n ) , es impar ]) else disp ( No juego con tramposos ! ) endif

c V. Luaa 2003-2010 n

(471)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Ejemplo: Programa capaz de resolver cualquier ecuacin de segundo grado ax2 + bx + c = 0. o1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

disp ( Resolviendo a * x **2 + b * x + c = 0 ) a = input ( Ingresa a -> ); b = input ( b -> ); c = input ( c -> ) if ( a == 0) if ( b == 0) if ( c == 0) disp ( Sistema indeterminado ) else disp ( Sistema imposible ) endif else disp ([ Raiz unica : , num2str ( - c / b )]) endif else d2 = b * b - 4* a * c ; if ( d2 == 0) disp ([ Raiz doble : , num2str ( - b /2/ a )]) else m = Dos raices ; if ( d2 >0) disp ([ m , reales : ]) else disp ([ m , complejas : ]) endif disp (( - b + sqrt ( d2 ))/(2* a )); disp (( -b - sqrt ( d2 ))/(2* a )) endif endif Prueba con (a, b, c): (1, 1, 1), (1, 2, 1), (0, 0, 0), (1, 0, 0), (0, 0, 1), (1, 0, 2), (1+3i, 3i, 7+2i).c V. Luaa 2003-2010 n

(472)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Estructuras iterativas: bucles for, while y do untilfor ndice = rango interior-del-bucle endfor while (condicin) o interior-del-bucle endwhile do interior-del-bucle until (condicin) o

Ejemplo 1: Construye los primeros 20 trminos de la sucesin de Fibonacci (F1 = 1, F2 = 1, e o F3 = 2, . . . , Fk = Fk2 + Fk1 ).1 2 3 4 5

fib (1) = 1; fib (2) = 1; for k = 3 : 20 fib ( k ) = fib (k -1) + fib (k -2); endfor disp ( fib ) Ejemplo 2: Encuentra el menor nmero Fn > 104 . u

1 2 3 4 5 6 7

fib (1) = 1; fib (2) = 1; n = 2; do n = n + 1; fib ( n ) = fib (n -1) + fib (n -2); until ( fib ( n ) > 10000) disp ([ fib ( , num2str ( n ) , ) = , num2str ( fib ( n ))])

c V. Luaa 2003-2010 n

(473)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Ejemplo: (http://en.wikipedia.org/Collatz_conjecture) Sea la funcin entera o 8 < 3n + 1 si n es impar, F (n) = : n/2 si n es par. La sucesin Sn est formada por los nmeros naturales x0 = n, x1 = F (x0 ), . . . , xn = F (xn1 ), o a u . . . , hasta que se alcance un trmino de valor unidad, en cuyo momento la serie se considera e terminada. El cardinal de Sn es el nmero de trminos de la serie, y su cota es el valor ms alto que u e a alcanza un trmino cualquiera. Dibuja los trminos de S27 . Calcula y dibuja las cotas y cardinales e e de las series S1 ...S50 .1 2 3 4 5 6 7 8 9 10 11 12 13 14

function Sn = Serie3n1 ( n ) # Calcula la su ce s i on 3 n +1 que com ienz a en n . k = 1; Sn ( k ) = n ; while ( Sn ( k ) > 1) s = Sn ( k ); if ( rem (s ,2) == 0) s = s /2; else s = 3* s +1; endif k = k +1; Sn ( k ) = s ; endwhile endfunction

c V. Luaa 2003-2010 n

(474)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

15 16 17 18 19 20 21 22

plot ( Serie3n1 (27)); for n = 1 : 100 s = Serie3n1 ( n ); cota ( n ) = max ( s ); cardinal ( n ) = length ( s ); endfor plot ( cota ); plot ( cardinal );

10000 9000 8000 7000 6000 5000 4000 3000 2000 1000 0 0 10 20 30 40 50 60 70 80 90 100

10000 9000 8000 7000 6000 5000 4000 3000 2000 1000 0 0 20 40 60 80 100 120

c V. Luaa 2003-2010 n

(475)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

Comparaciones y lgebra lgica: a o== Operadores de comparacin: o > >= Valores lgicos: o false 0 o true 1 o Operadores lgicos: o !~ o & falso cierto Negacin () o Conjuncin (y, , ) o | xor(x,y) Disyuncin (o inclusivo, , ) o O exclusivo igualdad mayor que mayor o igual que ~= != o < ); ok = ( n > 0) && ( n == fix ( n )); if (! ok ) disp ( Sin trampas , por favor ! ) disp ([ El numero debe estar en el rango 1: , num2str ( intmax )]) endif until ( ok ) maxdivisor = fix ( sqrt ( n )); ParecePrimo = true ; k = 1 while ( k < maxdivisor & ParecePrimo ) k = k + 1; ParecePrimo = ( rem (n , k ) != 0); endwhile if ( ParecePrimo ) disp ([ num2str ( n ) , es primo ]) else disp ([ num2str ( n ) , es divisible por , num2str ( k )]) endif

c V. Luaa 2003-2010 n

(479)

A. Gnuplot y octave

Octave: instalacin y primeros pasos. o

20 X 3k2 + 2k Sumamos una serie: S = 56 k k=11 2 3 4 5

Otra forma de sumar la misma serie:1 2 3

S = 0 for k = 1:20 S = S + (3* k **2+2* k )/(56 - k ); endfor disp ( S )

k = 1:20; sk = (3.* k .**2.+2.* k )./(56. - k ); S = sum ( sk )

X xk x2 x3 x La serie de McLaurin: e = =1+x+ + + k! 2 6 k=01 2 3 4 5 6 7 8 9 10 11 12

function y = mclaurin (x , TOL ) if ( nargin < 2) tol = 2* eps ; else tol = TOL ; endif y = 1 + x ; term = x ; k = 1; do k = k + 1; term = term .* x / k ; y = y + term ; until ( max ( max ( abs ( term )))