Taller de Informática I Segunda Clase: Programación Año 2014 Ejercicios de la clase pasada: 1) Realizar una función que dados tres números que representan notas, retorne el promedio de dichos valores. 2) Realizar una función que reciba como argumento N y retorne como salida la matriz de NxN con cincos en la diagonal y ceros en el resto de las componentes. Recordemos • Algoritmo: Una secuencia paso a paso de instrucciones bien definidas que describen como realizar un cómputo (ej. algoritmo de división de Euclides). • Lenguaje de programación: Lenguaje artificial diseñado para abstraer las instrucciones que puede ejecutar una computadora (ej. Matlab). • Programa: La transcripción de un algoritmo en un lenguaje de programación dado. Hace falta conocer un lenguaje de programación para diseñar un algoritmo? Lenguajes de programación En los lenguajes de programación se pueden reconocer dos partes: • Sintaxis: las posibles combinaciones de símbolos que se pueden entender como expresiones correctas. • Semántica: el significado asociado a una expresión. Expresiones válidas • • • • • • • 1 I+2 I + 2 * -3 (1 + 2) * -3 0 == 1 – 1 [1; 2; 3; 4] 2 * [1 0; 0 1] Expresiones inválidas • • • • • • • • I (1 I32 +12 (1 + 2) == {3; 2} ( 3, 2 ) [0; 2; 4; 6; ....... ; 20] [1 0; 0 1] (1) CARACTERES ESPECIALES [ ] Se utilizan para formar vectores y matrices ( ) Define precedencia en expresiones aritméticas. Encierra argumentos de funciones en forma usual , Separador de elementos de una matriz, argumentos de funciones y declaraciones en líneas con declaraciones múltiples ; Termina filas de una matriz, separador de declaraciones % Comentario Ejemplos: [6.0 9.0 3.4 ] sqrt(2) for i=1:n, a(i)=0, end for i=1:n; a(i)=0; end % inicia vector a en 0 Tipos Los tipos son los conjuntos de los distintos valores posibles. • • • • • Integer: 1, 2, 3, etc. Float-Point: 0.5, 1.7, 42.0, pi, etc. Logical: true, false. Character: „a‟, „b‟, „c‟, etc. Matrix: [1.7], [ „h‟, „o‟, „l‟, „a‟]; [1 0; 0 1]; etc. En general cada tipo de dato tiene asociadas ciertas operaciones. Variables Las variables son nombres con los que podemos referirnos al resultado de cómputos anteriores. • • • • Tres_x_pi = 3.0 * pi Booleana = false cadenaHola = 'hello' Matriz_Identidad = [1 0; 0 1] • Las variables nos abstraen del manejo de la memoria de la computadora. Los valores asignados en una variable son almacenados en la memoria. • Matlab es case-sensitive por lo que la variable Booleana es distinta que booleana. Asignación: • Es posible guardar el resultado de una operación cualquiera en una variable. • Para eso debemos escribir: >> x = 2 + 2 x =4 • Si una instrucción la finalizamos con punto y coma el resultado de la misma no se muestra: >> x=17^(1/3); >> test=x^3 test = 17.0000 Vectores • Vectores fila; elementos separados por blancos o comas >> v =[2 3 4 7 9 8] • Vectores columna: elementos separados por punto y coma (;) >> w =[2;3;4;7;9;8] • En MATLAB es posible transformar un vector fila en un vector columna y viceversa (hallar su traspuesta) empleando una comilla simple: >> vt = v‟ • Dimensión de un vector w: length(w) • Generación de vectores fila: ▫ Especificando el incremento h de sus componentes v=a:h:b ▫ Linealmente espaciados n: linspace(a,b,n) (por defecto n=100) ▫ Componentes logarítmicamente espaciadas logspace(a,b,n) (n puntos logarítmicamente espaciados entre 10a y 10b. Por defecto n=50) Ejemplo de programa: • Dado un vector de dimención 2 y un escalar se busca dibujar el vector y el resultado del producto del vector por el escalar. • Hacer primero >> help drawvec Ejemplo: producto escalar. • El producto por un escalar es tan intuitivo como la suma de vectores: ▫ v=[1 6]; ▫ w=-3*v; drawvec(v, 'red', 20); ▫ hold on; drawvec(w, 'blue', 20); • Obsérvese que -3v es un vector tres veces más largo que v y apuntando en sentido contrario. Ejemplo: mean • Programar una función que dado un vector retorne el promedio de todos sus valores. • Qué pasa si como entrada le damos una matrix? Vectores y matrices Definición de matrices: • Generación de matrices: ▫ ▫ ▫ ▫ Generación de una matriz de ceros, zeros(n,m) Generación de una matriz de unos, ones(n,m) Inicialización de una matriz identidad eye(n,m) Generación de una matriz de elementos aleatorios rand(n,m) • Añadir matrices: [X Y] columnas, [X; Y] filas Operaciones con vectores y matrices Operaciones con escalares: v: vector, k: escalar: • • • • • • • v+k adición o suma v-k sustracción o resta v*k multiplicación v/k divide cada elemento de v por k k./v divide k por cada elemento de v v.^k potenciación de cada componente de v a k k.^v potenciación k elevado a cada componente de v Operaciones con vectores y matrices • • • • • • • • • • + adición o suma – sustracción o resta * multiplicación matricial .* producto elemento a elemento ^ potenciación .^ elevar a una potencia elemento a elemento \ división-izquierda / división-derecha ./ y .\ división elemento a elemento matriz traspuesta: B=A’ (en complejos calcula la traspuesta conjugada, sólo la traspuesta es B=A.’) Ejemplo: main_operaciones_matrices.m Funciones para vectores y matrices • sum(v) suma los elementos de un vector • prod(v) producto de los elementos de un vector • dot(v,w) producto escalar de vectores • cross(v,w) producto vectorial de vectores • mean(v) (hace la media) • diff(v) (vector cuyos elementos son la resta de los elemento de v) • [y,k]=max(v) valor máximo de las componentes de un vector (k indica la posición), min(v) (valor mínimo). El valor máximo de una matriz M se obtendría como max(max(M)) y el mínimo min(min(v)) • Aplicadas algunas de estas funciones a matrices, realizan dichas operaciones por columnas. Funciones para vectores y matrices • [n,m]=size(M) te da el número de filas y columnas • matriz inversa: B=inv(M), rango: rank(M) • diag(M): Obtencion de la diagonal de una matriz. sum(diag(M)) calcula la traza de la matriz A. diag(M,k) busca la k-ésima diagonal. • norm(M) norma de una matriz (máximo de los valores absolutos de los elementos de A) • flipud(M) reordena la matriz, haciendo la simétrica respecto de un eje horizontal. fliplr(M) ) reordena la matriz, haciendo la simétrica respecto de un eje vertical • [V, landa]=eig(M) da una matriz diagonal landa con los autovalores y otra V cuyas columnas son los autovectores de M Ejemplo: main_operaciones_matrices.m Resumen: vectores y matrices • MATLAB es un entorno interactivo que utiliza como tipos de datos básicos vectores y matrices de flotantes que no requieren ser dimensionados. • MATLAB permite distinguir vectores fila de vectores columna y calcular la transpuesta de un vector. • En MATLAB es posible sumar vectores, multiplicarlos por un escalar, calcular su módulo o calcular su producto escalar. • MATLAB permite definir matrices y acceder a sus componentes elementales; también es posible extraer fácilmente submatrices así como multiplicar matrices y vectores. Funciones Las funciones son procedimientos con nombres que pueden requerir múltiples argumentos y retornar distintos resultados dependiendo de los valores de los argumentos. Es una tarea independiente que puede o no depender de variables externas. Lo ideal es que funcione como “caja negra”, es decir, que se la pueda invocar desde cualquier programa cada vez que se la necesite y que realice una función bien específica Funciones internas Ejemplos: • • • • size( [1 0; 0 1] ) resul = or( true, false ) disp( [1 2 3 4]) sum( [1 2 3 4]) Ventajas de utilizar funciones • Solamente se escribe una vez. Esto evita errores involuntarios (pero siempre presentes) de transcripción. • Si una función es probada y funciona bien, funcionará bien cada vez que se use (siempre y cuando el uso sea el correcto). Esta es una ventaja importante cuando estamos buscando errores presentes en nuestros programas, puesto que evaluamos pedazos cada vez más pequeños lo que facilita la detección de errores. • Son portables. Una misma función puede ser útil para distintos casos, distintos programas y distintos programadores • Código más limpio. Al usar funciones reducimos las líneas de código de nuestro programa y por lo tanto se hacen mucho más fáciles de leer y validar su correctitud. • Parte un programa en varios subprogramas Partes de una función Se pueden observar dos lados de una función: la invocación y la definición. Invocación: Se refiere a la llamada a la función. Ejemplo: >> y = sin(pi); En este caso, sin representa el nombre de la función, pi es el argumento y la variable y el objeto de salida. Partes de una función Definición: Se refiere al texto de la función con el desarrollo del cuerpo de la misma. En nuestro caso, se trata de archivos .m donde volcamos, en sintaxis correcta, el texto de la función como un conjunto de sentencias válidas: Ejemplo: Palabra reservada function salida = nombreFuncion (lista_de_parametros) .. %sentencias salida = ... end Aquí se guarda el resultado final Argumentos, separados por coma Variables de la función ¿Qué sucede si por línea de comandos quiero saber qué valor tienen las variables a y b de la función o la variable salida? >> a error: „a' undefined near line 2 column 1 El mensaje de error indica que la variable „a‟ no es conocida en este contexto. Es decir, las variables de la función sólo tienen validez dentro de la función misma. Se puede realizar el siguiente experimento: >> a=123 a = 123 >> suma(3,4) ans = 7 >> a a = 123 y no 3 que es el valor que toma a dentro de la función!!! Esto nos indica que las variables poseen diferentes alcances Variables de la función • Las variables declaradas en el intérprete (por línea de comando) tienen validez en el intérprete • Las variables dentro de una función tienen alcance dentro de la misma función. No interfieren con variables con el mismo nombre declaradas fuera de la misma. • Se dice entonces que las variables son locales a la función OPERADORES RELACIONALES Los operadores relacionales de MatLab son: < menor que <= menor o igual a > mayor que >= mayor o igual a == igual a ~= no igual a OPERADORES LÓGICOS Los operadores &, | y ~ son los operadores de lógica "y", "ó" y "no" respectivamente. El resultado de C = A & B es una matriz cuyos elementos son unos donde A y B sean ambos distintos de cero, y ceros donde A ó B sean cero. A y B deben de ser matrices con las mismas dimensiones, a menos que una de ellas sea un escalar. El resultado de C = A | B es una matriz cuyos elementos son unos donde A ó B tienen un elemento diferente de cero, y ceros donde ambas tienen elementos cero. A y B deben de ser matrices con las mismas dimensiones, a menos que una sea un escalar. El resultado de B ~ = A es una matriz cuyos elementos son uno donde A tiene un elemento cero, y ceros donde A tiene elementos diferentes de cero. Expresión Condicional Es de especial interés que un programa pueda tomar distintas decisiones a medida que evalúa los valores de las expresiones que lo conforman. La sintaxis del condicional requiere dar una expresión lógica, a continuación todo el código que debe ejecutarse si la condición resulta verdadera y finalmente la palabra clave end para marcar el final. v = [1 2 3]; B = v' * v; d = det(B); if d == 0 disp('Determinante es cero'); end Estructuras de control: condicional • Operaciones lógicas: ▫ >, <, >=,<=,== (igual) ▫ | (or), &(and) ▫ ~ (no), ~= (no igual) if end if else end if elseif else end ▫ Ejemplo: main_condicional Expresión Condicional Si deseamos elegir un comportamiento alternativo cuando la condición es falsa podemos usar el if en conjunción con el else: v = [1 2 3]; B = v' * v; d = det(B); if d == 0 disp('Determinante es cero'); else disp('Determinante no es cero'); B = zeros(3,3); end Otra vez mean • ¿Cómo debo modificar la función mean si el vector de entrada es un vector columna? Ejercitación 1) Escribir un programa que dados los goles del equipo local y los goles del equipo visitante de un partido de futbol, indique que equipo ha ganado (resultados posibles: “local”, “visitante” y “empate”). 2) El cuadrante de un punto (x; y) se puede determinar a partir del signo de x e y. Escribir un programa que pida al usuario las coordenadas x e y y que especifique a que cuadrante pertenece el punto 3) Se desea representar con una letra la calificación de un alumno. Las calificaciones son notas entre 1 y 10. Escribir un programa que pida la nota y que indique la letra correspondiente: A para calificaciones mayores o iguales a 9 B para calificaciones mayores o iguales a 8 C para calificaciones mayores o iguales a 7 D para calificaciones mayores o iguales a 6 F para las demás calificaciones. Ejercitación (cont.) 4) Dados el valor anterior y el actual del medidor de la luz, escribir un programa que determine a cuanto asciende la factura de la luz. El importe es la suma de $12 de cuota fija más una cuota variable que depende del consumo y se calcula por tramos: • Los primeros 100 Kw se cobran a $0.06 el Kw. • Los 150 Kw siguientes se cobran a $0.04 el Kw. • El excedente de 250 Kw se cobra a $0.02 el Kw. Funciones any y all La función any(x) devuelve 1 si cualquiera de los elementos de x es diferente de cero, de lo contrario devuelve 0. La función all(x) devuelve 1 solamente si todos los elementos de x son diferentes de cero. Estas funciones se usan en cláusulas if. Por ejemplo: if all(A < 5) ... end Más funciones Para argumentos matriciales, any y all trabajan por columnas para devolver un vector fila con el resultado para cada columna. Aplicando la función dos veces, any(any(A)), siempre reduce la matriz a una condición escalar. Las funciones relacionales y lógicas en MATLAB son: any condiciones lógicas all condiciones lógicas find halla índices de arreglos de valores lógicos exist verifica si existen variables isinf detecta infinitos finite verifica para los valores finitos Funciones de Funciones • fzero(‘nombre_funcion’,x0): Calcula el cero de una función más próximo al valor de la variable x0 • fminsearch(‘funcion’,x0): calcula el mínimo relativo de una función más próximo a x0 • fminbnd(‘funcion‘,a,b): calcula un mínimo de la función en el intervalo [a,b] • Ejemplo de fzero en main_pintarseno Estructuras de Repetición • Controlan un conjunto de instrucciones que deben repetirse cierto número de veces, mientras se cumple una condición que debe ser claramente especificada. • La condición podrá ser verdadera o falsa, y se comprobará en cada paso o iteración del bucle o ciclo. Partes de un ciclo • Decisión: donde se evalúa la condición y, en caso de ser cierta, se ejecuta el cuerpo del bucle. • Cuerpo del bucle: son las instrucciones que se ejecutarán repetidamente, un número determinado de veces, siempre que la decisión sea verdadera. • Salida del bucle: es la condición que indica cuando terminan las iteraciones. Gráficamente Ciclo for • Se sabe cuántas veces se realizará el bucle, o sea, cuantas veces se ejecutará el conjunto de instrucciones dentro del ciclo. • La cantidad de veces está determinada en la sección de decisión del ciclo. Ciclo for SINTAXIS for variable=incio:paso:final declaración 1; ... declaración n; end for variable=inicio:final declaración 1; ... declaración n; end Ciclo for (cont.) for k=n1:incre:n2 end for k=vector_columna end Ejemplo: main_bucles Ejemplos básicos for i=1:10 disp(„El valor de i es „) disp(i) end for i=1:2:10 disp(‘El valor de i es ‘) disp(i) end x=10:-1:1; for i=x disp(‘El valor de i es ‘) disp(i) end %con una matriz: matriz = [ 1 2 3 4; 1 2 3 4; 1 2 3 4; 1 2 3 4]; for x = matriz n = x(1)*x(2)*x(3)*x(4); disp(n) end Otro ejemplo for i = 1:n, x(i) = 0, end asigna 0 a los primeros n elementos de x. Si n es menor de 1, el ciclo sigue siendo válido pero MATLAB no ejecuta la instrucción intermedia. Si x no esta definido, ó si tiene menos de n elementos, entonces un espacio adicional es localizado automáticamente a x cada vez que sea necesario. Ejercicio 1: cuadrados • Escribir una función que dado un natural n devuelva los primeros n cuadrados. Ejercicio 2: Fibonaccifor • Programar una función que dado un entero n calcule los n primeros valores de la serie de Fibonacci y los grafique. • Fibonacci(0) = 1 • Fibonacci(1) = 1 • Fibonacci(n+2) = Fibonacci(n+1) + Fibonacci(n) Ejercicios! • Escribir un programa que calcule las N primeras fracciones del tipo 1/i para i = 1; 2; ….;N, tras pedir N al usuario • Ingresar un vector de orden n y calcular su norma euclídea. La norma euclídea de un vector x = (x1; x2; ….xn) viene dada por la fórmula sqrt((x1)2 + (x2)2 + …. + (xn)2) • Generar un vector de n elementos con números aleatorios entre 0 y 1. Pedir al usuario dos números reales entre 0 y 1 LS y LI, que representan los límites superior e inferior de un intervalo, respectivamente. Recorrer el vector e indicar cuales elementos se encuentran dentro de los límites dados. • Dado un vector, hacer un programa que genere el vector inverso. Dado x=[1 2 3] generar y=[3 2 1] • Dada una cadena, generar la inversa. Resolverlo: ▫ Con disp. (lo muestra en vertical) ▫ Inicializando y= y´ concatenando cada elemento del vector en cada iteración del ciclo Ciclo while • NO se sabe cuántas veces se realizará el bucle, o sea, cuantas veces se ejecutará el conjunto de instrucciones dentro del ciclo. • La cantidad de veces NO está determinada en la sección de decisión del ciclo. En esta sección se determina la condición, que deberá ser verdadera, para que el ciclo siga funcionando. Ciclo while SINTAXIS while expresion proposición 1; ... proposición 2; end Ejemplos e=1.0; while (1.0+e)>1.0001 e=e/2.0; end it=1; t=0; wo=2.0*pi*60.0; while it<=npts, ut=sin(wo*t);t=t+dt;end Ciclo while • Las sentencias se siguen ejecutando mientras haya elementos distintos de cero en condición, es decir, mientras haya algún o algunos elementos true. El bucle se termina cuando todos los elementos de condición son false (es decir, cero). Más ejemplos: a=3; while a < 5 disp (Valor de a: ') disp (a) a = a + 1; end %desplegar el volumen de una %esfera con radios de 1, 2, 3, 4 y 5 r = 0; while r<5 r = r+1; vol = (4/3)*pi*r^3; disp([r, vol]) end; clear; r=0 while r<10 r = input('Teclee el radio (o -1 para terminar): '); if r< 0, break, end vol = (4/3)*pi*r*3; fprintf('volumen = %7.3f\n', vol) end Ejercicio: Fibonacci (cont.) • Ahora programar la función que dado un entero n calcule todos los valores de la serie de Fibonacci menores a n. • En que cambia respecto de la habíamos programado antes? Ejercicios! • El juego de adivinar un número termina cuando el usuario adivina el número secreto elegido por la computadora. Se pide entonces que la computadora elija un número secreto entre 1 y 100, y luego le pregunte al usuario un número hasta que ambos números sean iguales. • Se pide escribir una versión mejorada del ejercicio anterior, en la que la computadora ayuda al usuario avisando en cada paso si el número secreto es mayor o menor al número ingresado por el usuario. • El método de Newton-Raphson permite aproximar una raíz de una función f derivable dado un punto inicial x ingresado por el usuario. En cada paso se recalcula el valor de x por medio de la asignación x = x – (f(x) / f’(x)). Escribir un programa que le pida al usuario el punto x inicial y que calcule una raíz de la función f(x) = x2-2 realizando 5 iteraciones del método de Newton-Raphson. ¿Qué puede decir sobre la calidad de la aproximación? ¿Qué sucede si se aumenta el numero de iteraciones? Ejercicios en clase • Criba de Erastótenes: Algoritmo que permite hallar todos los números primos menores que un número natural dado N. Se forma una tabla con todos los números naturales comprendidos entre 2 y N y se van tachando los números que no son primos de la siguiente manera: cuando se encuentra un número entero que no ha sido tachado, ese número es declarado primo, y se procede a tachar todos sus múltiplos. El proceso termina cuando el cuadrado del mayor número confirmado como primo es mayor que N. • Conjetura de Collatz Conocida también como conjetura 3n+1. Sea la siguiente operación, aplicable a cualquier número entero positivo: ▫ ▫ Si el número es par, se divide entre 2. Si el número es impar, se multiplica por 3 y se suma 1. La conjetura dice que siempre alcanzaremos el 1. Ejemplos: n = 6, uno llega a la siguiente sucesión: 6, 3, 10, 5, 16, 8, 4, 2, 1. n = 11, la sucesión tarda un poco más en alcanzar el 1: 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1. Un cálculo más práctico ilustrando el ciclo while es en el cómputo del exponencial de una matriz, llamado expm(A) en MATLAB. Una posible definición de la función exponencial es mediante la serie: expm(A) = I + A + A^2/2! + A^3/3! + ... La idea es sumar todos los términos necesarios hasta producir un resultado que, en la precisión finita la de computadora, no cambie aunque más términos sean añadidos. Para esto procedemos de la forma siguiente: E = zeros(size(A)); F = eye(size(A)); k = 1; while norm(E+F-E, 1) > 0 E = E + F; F = A*F/k k = k+1; end Aquí A es la matriz dada, E representa la suma parcial de la serie, F es un término individual en la serie, y k es el índice de este término. Manejo de archivos en Matlab • Ficheros de programa: Se construyen mediante una secuencia de comandos. El fichero principal se llamará main_nombre.m • Ficheros de función: para crear funciones propias. Son llamados por los ficheros de programa. ▫ La primera línea es ejecutable y empieza por la palabra function de la forma: function arg_salida=funcion_nombre(arg_entrada, parametros) ▫ El fichero se debe guardar como funcion_nombre.m • Comandos de entrada y salida: • Ejemplo: main_pintarseno.m input: permite introducir datos: ae=input(„Teclee valor de a‟); disp: muestra un texto por pantalla: disp(„El algoritmo no ha convergido‟) Manejo de archivos en Matlab • Ficheros de programa: Se construyen mediante una secuencia de comandos. El fichero principal se llamará main_nombre.m • Ficheros de función: para crear funciones propias. Son llamados por los ficheros de programa. ▫ La primera línea es ejecutable y empieza por la palabra function de la forma: function arg_salida=funcion_nombre(arg_entrada, parametros) ▫ El fichero se debe guardar como funcion_nombre.m Comandos de entrada y salida: • • input: permite introducir datos: ae=input(„Teclee valor de a‟); disp: muestra un texto por pantalla: disp(„El algoritmo no ha convergido‟) Ejemplo: main_pintarseno.m. Usar el Debugger para meterse en la función ARCHIVOS DE E/S DECLARACIÓN fopen id = fopen(`nombre.dat', `permiso') donde permiso puede ser: `r' `r+ `w' `w+' `a' `a+' Abre archivo para lectura Abre archivo para lectura y escritura Borra el contenido del archivo existente o crea un nuevo archivo y lo abre para escritura Idem que `w' únicamente que el archivo se abre para lectura y escritura Crea y abre un nuevo archivo o abre un archivo Idem que `a' únicamente que el archivo es abierto para lectura y escritura Ejemplo fid = fopen(`archivo.dat','r') fid = -1, error 0, lectura/escritura normal [fid, mensaje = fopen(`archivo.dat','r') DECLARACIÓN fclose status = fclose(fid) DECLARACIÓN fread Lee un archivo abierto con una precisión indicada o fread(fid,registros,'precision') status = fclose (`all') – cierra todos los archivos abiertos registros DECLARACIÓN fprintf `char' o `uchar' `short' o `long' `float' o `double' Salida con formato Ejemplos: fprintf(fid,'titulo\n'); fprintf(fid,'%f %12.7f\n', y); Formato %s - cadena decimal %d - número decimal %f - punto flotante % g - formato g Ejemplo: A = fread(fid,10,'float') DECLARACIÓN fwrite fwrite(fid,A,'short') Debugger de una función Set/Clear breakingpoint: Coloca o borra un punto de ruptura en la línea en que está colocado el cursor Clear all breakingpoints:: Borra todos los puntos de ruptura Step: Avanza un paso en el programa Step in: Avanza un paso en el programa y si en ese paso se llama a una función, entra en dicha función Step out: Avanza un paso en el programa y si en ese paso se llama a una función, entra en dicha función Continue: Continua ejecutando hasta el siguiente punto de ruptura Quit debugging: Termina la ejecución del debugger GRÁFICAS EN DOS DIMENSIONES FUNCIONES ELEMENTALES PARA GRÁFICAR plot crea una gráfica de vectores ó columnas de matrices. loglog crea una gráfica utilizando una escala logarítmica para ambos ejes. semilogx crea una gráfica utilizando una escala logarítmica para el eje-x y una escala lineal para el eje-y. semilogy crea una gráfica utilizando una escala logarítmica para el eje-y y una escala lineal para el eje-x. Puedes añadir títulos, encabezamientos de ejes, líneas entre cortadas y texto a tus gráficas utilizando: tittle xlabel ylabel text gtext grid añade título a la gráfica añade encabezamiento al eje-x añade encabezamiento al eje-y añade una cadena de texto en una localización específica añade texto a la gráfica utilizando el ratón crea líneas entrecortadas