Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Ing. Pedro Romero y Otiniano PROGRAMACION EN MATLAB: UNMSM – FQIQ Mayo de 2017 1. Programación de MATLAB Como ya se ha dicho varias veces incluso con algún ejemplo MATLAB es una aplicación que se puede programar muy fácilmente. Se comenzará viendo las bifurcaciones y bucles, y la lectura y escritura interactiva de variables, que son los elementos básicos de cualquier programa de una cierta complejidad. 1.1. Bifurcaciones y bucles Se van a introducir aquí los primeros conceptos de programación. MATLAB posee un lenguaje de programación que como cualquier otro lenguaje dispone de sentencias para realizar bifurcaciones y bucles. Las bifurcaciones permiten realizar una u otra operación según se cumpla o no una determinada condición. La figura 17 muestra dos posibles formas de bifurcación. Los bucles permiten repetir las mismas o análogas operaciones sobre datos distintos. Mientras que en C el "cuerpo" de estas sentencias se determinaba mediante llaves {...}, en MATLAB se utiliza la palabra end con análoga finalidad. Existen también algunas otras diferencias de sintaxis. Hay que señalar que en MATLAB no existe las construcción análoga a do ... while. Figura 17. Ejemplos gráficos de bifurcaciones. Las bifurcaciones y bucles no sólo son útiles en la preparación de programas o de ficheros *.m. También se aplican con frecuencia en el uso interactivo de MATLAB, como se verá más adelante en algunos ejemplos. 1.2. SENTENCIA IF En su forma más simple, la sentencia if se escribe en la forma siguiente (obsérvese que a diferencia de C, la condición no va entre paréntesis, aunque se pueden poner si se desea)11 if condición (x>2) sentencias1 else sentencias2 end 11 En los ejemplos siguientes las sentencias aparecen desplazadas hacia la derecha respecto al if, else o end. Esto se hace así para que el programa resulte más legible, resultando más fácil ver dónde empieza y termina la bifurcación o el bucle. Es muy recomendable seguir esta práctica de programación. Existe también la bifurcación múltiple, en la que pueden concatenarse tantas condiciones como se desee, y que tiene la forma: if <condicion1> bloque1 elseif <condicion2> bloque2 elseif <condicion3> bloque3 else % opción por defecto Ing. Pedro Romero y Otiniano bloque4 end Una observación muy importante: la condición del if puede ser una condición matricial, del tipo A==B, donde A y B son matrices del mismo tamaño. Para que se considere que la condición 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. Por ejemplo: 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 Como se ha dicho, MATLAB dispone de funciones especiales para ayudar en el chequeo de condiciones matriciales. Por ejemplo, la función isequal(A, B) devuelve un uno si las dos matrices son idénticas y un cero en caso de que difieran en algo. 1.3. SENTENCIA SWITCH La sentencia switch realiza una función análoga a un conjunto de if...elseif concatenados. Su forma general es la siguiente: switch <switch_expresion> case <case_expr1>, bloque1 case {case_expr2, case_expr3, case_expr4,...} bloque2 ... otherwise, % opción por defecto bloque3 end Al principio se evalúa la <switch_expresion>, cuyo resultado debe ser un número escalar o una cadena de caracteres. Este resultado se compara con las <case_expr>, y se ejecuta el bloque de sentencias que corresponda con ese resultado. Si ninguno es igual a <switch_expresion> se ejecutan las sentencias correspondientes a otherwise. Según puede verse en el ejemplo anterior, es posible agrupar varias condiciones dentro de unas llaves (constituyendo lo que se llama un cell array o vector de celdas); basta la igualdad con cualquier elemento del cell array para que se ejecute ese bloque de sentencias. La “igualdad” debe entenderse en el sentido del operador de igualdad (==) para escalares y la función strcmp( ) para cadenas de caracteres). A diferencia de C12, sólo se ejecuta uno de los bloques relacionado con un case. 12 En C se ejecuta el caso seleccionado y todos los siguientes, salvo que se utilice la sentencia break. 1.4. SENTENCIA FOR La sentencia for repite un conjunto de sentencias un número predeterminado de veces. La sentencia for de MATLAB es muy diferente y no tiene la generalidad de la sentencia for de C. La siguiente construcción ejecuta sentencias con valores de i de 1 a n, variando de uno en uno. for i=1:0.5:n sentencias end En el siguiente ejemplo se presenta el caso más general para la variable del bucle (valor_inicial: incremento: valor_final); el bucle se ejecuta por primera vez con i=n, y luego i se va reduciendo de 0.2 en 0.2 hasta que llega a ser menor que 1, en cuyo caso el bucle se termina: for i=n:-0.2:1 sentencias end En el siguiente ejemplo se presenta una estructura correspondiente a dos bucles anidados. La variable j es la que varía más rápidamente (por cada valor de i, j toma todos sus posibles valores): for i=1:m for j=1:n Ing. Pedro Romero y Otiniano sentencias end end Una última forma de interés del bucle for es la siguiente (A es una matriz): for i=A sentencias end En la que la variable i es un vector que va tomando en cada iteración el valor de una de las columnas de A. 1.5. SENTENCIA WHILE La estructura del bucle while es muy similar a la de C. Su sintaxis es la siguiente: while <condición> sentencias end Donde condición puede ser una expresión vectorial o matricial. 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). 1.6. SENTENCIA BREAK Al igual que en C, la sentencia break hace que se termine la ejecución del bucle más interno de los que comprenden a dicha sentencia. 2. Lectura y escritura interactiva de variables Se verá a continuación una forma sencilla de leer variables desde teclado y escribir mensajes en la pantalla del PC. Más adelante se considerarán otros modos más generales –y complejos– de hacerlo. 2.1 FUNCIÓN INPUT La función input permite imprimir un mensaje en la línea de comandos de MATLAB y recuperar como valor de retorno un valor numérico o el resultado de una expresión tecleada por el usuario. Después de imprimir el mensaje, el programa espera que el usuario teclee el valor numérico o la expresión. Cualquier expresión válida de MATLAB es aceptada por este comando. El usuario puede teclear simplemente un vector o una matriz. En cualquier caso, la expresión introducida es evaluada con los valores actuales de las variables de MATLAB y el resultado se devuelve como valor de retorno. Véase un ejemplo de uso de esta función: » n = input('Teclee el número de ecuaciones') Otra posible forma de esta función es la siguiente (obsérvese el parámetro ’s’): » Nombre = input('¿Cómo te llamas?','s') En este caso el texto tecleado como respuesta se lee y se devuelve sin evaluar, con lo que se almacena en la cadena Nombre. Así pues, en este caso, si se teclea una fórmula, se almacena como texto sin evaluarse. 2.2. FUNCIÓN DISP La función disp permite imprimir en pantalla un mensaje de texto o el valor de una matriz, pero sin imprimir su nombre. En realidad, disp siempre imprime vectores y/o matrices: las cadenas de caracteres son un caso particular de vectores. Considérense los siguientes ejemplos de cómo se utiliza: » disp('El programa ha terminado') » A=rand(4,4) » disp(A) Obsérvese la diferencia entre las dos formas de imprimir la matriz A. 3. Ficheros *.m Los ficheros con extensión (.m) son ficheros de texto (ASCII) que constituyenel centro de la programación en MATLAB. Ya se han utilizado en varias ocasiones. Estos ficheros se crean y Ing. Pedro Romero y Otiniano modifican con un editor de textos cualquiera. En el caso de MATLAB ejecutado en un PC bajo Windows, lo más sencillo es utilizar su propio editor de textos. Existen dos tipos de ficheros *.m, los ficheros de comandos (llamados scripts en inglés) y las funciones. Los primeros contienen simplemente una sucesión de comandos que se ejecutan sucesivamente cuando se teclea el nombre del fichero en la línea de comandos de MATLAB. Un fichero de comandos puede llamar a otros ficheros de comandos. Si un fichero de comandos se llama desde de la línea de comandos de MATLAB, las variables que crea pertenecen al espacio de trabajo base de MATLAB, y permanecen en él cuando se termina la ejecución de dicho fichero. Las funciones permiten definir funciones enteramente análogas a las de MATLAB, con su nombre, sus argumentos [variables de entrada] y sus valores de retorno [variables de salida]. Los ficheros *.m que definen funciones permiten extender las posibilidades de MATLAB; de hecho existen bibliotecas de ficheros *.m que se venden (toolkits) o se distribuyen gratuitamente (a través de la Internet). Las funciones definidas en ficheros *.m se caracterizan porque la primera línea (que no sea un comentario) comienza por la palabra function, seguida por los valores de retorno, el signo igual (=) y el nombre de la función, seguido de los argumentos, entre paréntesis y separados por comas. Recuérdese que un fichero *.m puede llamar a otros ficheros *.m, e incluso puede llamarse a sí mismo de forma recursiva. Los ficheros de comandos se pueden llamar también desde funciones, en cuyo caso las variables que se crean pertenecen a espacio de trabajo de la función. A continuación se verá con un poco más de detalle ambos tipos de ficheros. 3.1 FICHEROS DE COMANDOS Como ya se ha dicho, los ficheros de comandos o scripts son ficheros con un nombre tal como file1.m que contienen una sucesión de comandos análoga a la que se teclearía en el uso interactivo del programa. Dichos comandos se ejecutan cuando se teclea el nombre del fichero que los contiene (sin la extensión), es decir cuando se teclea file1 con el ejemplo considerado. Cuando se ejecuta desde la línea de comandos, las variables creadas por file1 pertenecen al espacio de trabajo base de MATLAB. Por el contrario, si se ejecuta desde una función, las variables que crea pertenecen al espacio de trabajo de la función. En los ficheros de comandos conviene poner los (;) al final de cada sentencia, para evitar una salida de resultados No deseada. Un fichero *.m puede llamar a otros ficheros *.m, e incluso se puede llamar a sí mismo de modo recursivo. Sin embargo, no se puede hacer profile de un fichero de comandos: solo se puede hacer de las funciones. Las variables definidas por los ficheros de comandos son variables del espacio de trabajo desde el que se ejecuta el fichero, esto es variables con el mismo carácter que las que se crean interactivamente en MATLAB si el fichero se ha ejecutado desde la línea de comandos. Al terminar la ejecución del script, dichas variables permanecen en memoria. El comando echo hace que se impriman los comandos que están en un script a medida que van siendo ejecutados. Este comando tiene varias formas: echo on activa el echo en todos los ficheros script echo off desactiva el echo echo file on donde 'file' es el nombre de un fichero de función, activa el echo en esa función echo file off desactiva el echo en la función echo file pasa de on a off y viceversa echo on all activa el echo en todas las funciones echo off all desactiva el echo de todas las funciones Mención especial merece el fichero de comandos startup.m. Este fichero se ejecuta cada vez que se entra en MATLAB. En él puede introducir todos aquellos comandos que le interesa se ejecuten siempre al iniciar la sesión, por ejemplo format compact y los comandos necesarios para modificar el path. 3.2 DEFINICIÓN DE FUNCIONES La primera línea de un fichero llamado name.m que define una función tiene la forma: function [lista de valores de retorno] = name(lista de argumentos) Ing. Pedro Romero y Otiniano Donde name es el nombre de la función. Entre corchetes y separados por comas van los valores de retorno, y entre paréntesis también separados por comas los argumentos. Recuérdese que los argumentos son los datos de la función y los valores de retorno sus resultados. Una diferencia importante con C es que en MATLAB los argumentos de una función no se modifican nunca, y los resultados se obtienen siempre a través de los valores de retorno, que pueden ser múltiples y matriciales. Tanto el número de argumentos como el de valores de retorno no son fijos, dependiendo de cómo el usuario llama a la función. Las variables definidas dentro de una función son variables locales, en el sentido de que son inaccesibles desde otras partes del programa y en el de que no interfieren con variables del mismo nombre definidas en otras funciones o partes del programa. Para que la función 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. Es frecuente utilizar el convenio de usar para las variables globales nombres largos (más de 5 letras) y con mayúsculas. Por razones de eficiencia, los argumentos de una función no se copian si no son modificados por la función (en términos de C diríamos que se pasan por referencia). Esto tiene importantes consecuencias en términos de eficiencia y ahorro de tiempo de cálculo. Sin embargo, si dentro de la función se realiza modificaciones sobre ellos, se sacan copias y se modifican las copias (diríase que en este caso se pasan por valor). Dentro de la función, los valores de retorno deben ser calculados en algún momento (no hay sentencia return, como en C). De todas formas, no hace falta calcular siempre todos los posibles valores de retorno de la función, sino sólo los que el usuario espera obtener. Existen dos variables definidas de modo automático, llamadas nargin y nargout, que representan respectivamente el número de argumentos y el número de valores de retorno actuales, con los que la función ha sido llamada. Dentro de la función, estas variables pueden ser utilizadas como el usuario desee. MATLAB dispone de una nueva forma de pasar a una función un número variable de argumentos por medio de la variable varargin, que es un array de celdas que contienen tantos elementos como sean necesarios para recoger en sus elementos todos los argumentos que se hayan pasado en la llamada. No es necesario que varargin sea el único argumento, pero si debe ser el último, pues recoge todos los argumentos a partir de una determinada posición. A los elementos de un cell array se accede utilizando llaves {}, en lugar de paréntesis. De forma análoga, una función puede tener un número indeterminado de valores de retorno utilizando varargout, que es también un cell array que agrupa los últimos valores de retorno de la función. Puede haber otros valores de retorno, pero varargout debe ser el último. El cell array varargout se debe crear dentro de la función y hay que dar valor a sus elementos antes de salir de la función. Las variables nargin y nargout indican el número de argumentos y de valores de retorno con que ha sido llamada la función. 3.3. HELP PARA LAS FUNCIONES DE USUARIO También las funciones creadas por el usuario pueden tener su help, análogo al que tienen las propias funciones de MATLAB. Esto se consigue de la siguiente forma: las primeras líneas de comentarios de cada fichero de función son muy importantes, pues permiten construir un help sobre esa función. En otras palabras, cuando seteclea en la ventana de comandos de MATLAB: » help mi_func El programa responde escribiendo las primeras líneas del fichero mi_func.m que comienzan por el carácter (%), es decir, que son comentarios. De estas líneas, tiene una importancia particular la primera línea de comentarios (llamada en ocasiones línea H1). En ella hay que intentar poner la información más relevante sobre esa función. La razón es que existe una función, llamada lookfor que busca una determinada palabra en cada primera línea de comentario de todas las funciones *.m. 3.4. HELP DE DIRECTORIOS MATLAB permite que los usuarios creen una ayuda general para todas las funciones que están en un determinado directorio. Para ello se debe crear en dicho directorio un fichero llamado contents.m. Si este Ing. Pedro Romero y Otiniano fichero no existe se listas las primeras líneas de comentarios (líneas H1) de todas las funciones que haya en ese directorio. Para que el Help de directorios funcione correctamente hace falta que ese directorio esté en el search path de MATLAB o que sea el directorio actual. clear all; close all; N= input ('Ingrese N° de Alumnos: N= '); SP=0; % Suma de Promedios Nmax = 0; Nmin = 20; fprintf('\n\n N°\t\t P. Final\n'); for i=1:N PP = input ('Ingrese PP = '); EP = input ('Ingrese EP = '); EF = input ('Ingrese EF = '); PF = (PP+EP+2*EF)/4; fprintf ('\n %i\t\t %2.2f', i, PF); fprintf('\n'); if PF>Nmax Nmax = PF; NaU = i; end if PF<Nmin Nmin = PF; NaL = i; end SP = SP + PF; end PA = SP/N; fprintf('\n Promedio del Aula= %2.2f', PA); fprintf('\n Nota Máxima= %2.2f\t\t N° Orden= %2.0f', Nmax, NaU); fprintf('\n Nota Mínima= %2.2f\t\t N° Orden= %2.0f', Nmin, NaL); fprintf('\n'); >> PromIF Ingrese N° de Alumnos: N= 4 N° P. Final Ingrese PP = 11 Ingrese EP = 10 Ingrese EF = 12 1 11.25 Ingrese PP = 9 Ingrese EP = 10 Ingrese EF = 11 2 10.25 Ingrese PP = 13 Ingrese EP = 12 Ingrese EF = 14 3 13.25 Ingrese PP = 10 Ingrese EP = 9 Ingrese EF = 12 4 10.75 Ing. Pedro Romero y Otiniano Promedio del Aula = 11.38 Nota Máxima= 13.25 N° Orden = 3 Nota Mínima= 10.25 N° Orden = 2 Ing. Pedro Romero y Otiniano INTRODUCCION A MATLAB (PRACTICAS): Métodos Numéricos Avanzados Damián Ginestar Peiró 4.4. Ejercicios 1. Los problemas relacionados con la cantidad de dinero requerida para pagar una hipoteca en un periodo fijo de tiempo involucran una fórmula de la forma, , conocida como ecuación de anualidad ordinaria. En esta ecuación, A es la cantidad de la hipoteca, P es la cantidad de cada pago, e i es la tasa de interés por periodo para los n periodos de pago. Suponer que se necesita una hipoteca de 120.000 euros de una casa sobre un periodo de 30 años, y que la persona que pide el préstamo no puede hacer pagos de más de 1500 euros al mes. ¿Cuál es la tasa máxima de interés que esta persona puede pagar? 5. Un objeto de masa M se deja caer verticalmente desde una altura S. Se sabe que al cabo de t segundos la altura del objeto es: Donde g = −9,8 m/s2 y k representa el coeficiente de rozamiento con el aire. Si M = 0,1kg, So =9,2 m y k = 0,15 kg s/m. Calcular con una precisión de 10−2s en qué momento el objeto estará a 2.3 m de tierra. 6. El volumen V de un gas en función de la presión P ejercida por un pistón viene dada en la tabla siguiente: Calcula el trabajo necesario para disminuir V de 80 a 32.5. 7. Se tiene que construir una hoja de techo corrugado usando una máquina que comprime una hoja plana de aluminio convirtiéndola en una cuya sección transversal tiene la forma de una onda senoidal. Supongamos que se necesita una hoja corrugada de 50 cm de longitud y que cada ondulación tiene una altura de un cm respecto de la línea horizontal y un periodo de 2π cm. El problema de encontrar la longitud de la hoja inicial viene dado por la integral: . Estimar esta longitud. 9. Sea z(t) (t en minutos) la temperatura de un objeto que está en una habitación que se mantiene a una temperatura de 25°C. Según la ley de enfriamiento de Newton, z verifica la siguiente ecuación diferencial z(t) = −0,02(z(t) − 25). Si al principio el objeto tenía una temperatura de 55°C, se pide: a) ¿Qué temperatura tendría el objeto transcurridos 50 minutos?, b) ¿Cuándo alcanza el objeto la temperatura de 46°C? 4.2. Integración aproximada Para el cálculo aproximado de integrales definidas el Matlab tiene implementadas las funciones trapz, quad y quad8. Si queremos calcular. Ing. Pedro Romero y Otiniano Podemos escribir x= 0:pi/10:pi/2; y=sin(x); integral = trapz(x,y). La función trapz( ) utiliza el método de los trapecios basado en la división utilizada para definir el vector x. Otras posibilidades son: integral= quad(’sin’, 0, pi/2); o bien, integral = quad8(’sin’,0, pi/2). UNI-FIQT-AACB CICLO 2003-I 13/12/03 6ta PRACTICA PROGRAMACION DIGITAL (MA-713) ---------------------------------------------------------------------------------------------------------- 1. La serie f(x) = ! )1......( 432 1 432 N xxxx x N N , es la representación de Mclaurin de Ln(x+1) y esta converge para -1 < x < 1. Hacer un programa que nos pida el valor de x y N por teclado, y calcule la sumatoria. Nota: N debe ser entero y positivo. 2. Escriba un programa para calcular la siguiente serie: NNx N xxxx S 2 ! ...... 2 !4 2 !3 2 !2!1 443322 Donde N y x son datos. 3. Elaborar un programa que permita calcular el combinatorio de dos números. Recordar que el combinatorio de dos números se calcula de la siguiente manera: )!(! ! rnr nn r C 4. Tenemos la densidad del Sodio para 4 temperaturas: T ( °C) 94 205 371 400 ( kg. / m3) 929 902 860 760 Mediante un programa, que permita ingresar los datos de temperatura y densidad (como vectores), hallar las temperaturas a la cual la densidad es 875 y 800 kg./m3. Nota: Los programas en Matlab. SOLUCIONARIO: 6ta PRÁCTICA CALIFICADA 2009.II 1) Escriba un programa que lea a y b, para calcular por Integración numérica mediante el método del Trapecio la expresión indicada, donde el intervalo [a, b] se divide en n segmentos, siendo h el ancho de cada segmento: h = (Xi+1 – Xi ), (i = 1…..n+1) ∫𝑓(𝑥) = ℎ 2 [𝑦0 + (2∑𝑦𝑖 𝑛−1 𝑖=1 ) + 𝑦𝑛] 𝑎 𝑏 Además: h = (b–a)/n. Donde: Xo=a y Xn =b. y1 = f(a), yn+1 = f(b), yi = f(xi). 2) Hacer un programa para determinar cuántos múltiplos de 7 con su último dígito par, hay en el rango desde A hasta B inclusive. (A y B son datos enteros y A≥B). 3) (5 puntos) Escriba un programa que calcule S, luego de leer n: nn n S *)1(*....*4*3*2 )1( .... 5*4*3*2 4 4*3*2 3 3*2 2 2 1 1) clear all; close all; f = input ('Ingrese f(x): '); a = input ('Ingrese el límite inferior a: '); Ing. Pedro Romero y Otiniano b = input ('Ingrese el límite superior b: '); n = input ('Ingrese el Número de segmentos n: '); h = (b – a)/n; n = n+1; y = zeros(n, 1); x = zeros(n, 1); s = 0; for i=1:n x(i) = a + h*(i-1); y(i) = feval(f, x(i)); end for i=2:n-1 s = s + y(i); end p = 0.5*h*(y(1) + 2* s + y(n)); fprintf ('\n\n La Integral es: %5.9f\n\n', p); 2) function mult72(A, B) k=0; for i= A : B u=i rem 10; if ((i rem 7) = 0) & ((u rem 2) = 0) % Nota: (rem= mod) es residuo entero. k=k+1; end end mult72=k; 4) clear all; close all; n = input ('Ingrese el N° de Elementos (N)'); S=0; den=1; for i =1:(n-1) k=i+1; num = i; den = den.*k; S = S + (num./den); end disp (S); ……. Ing. Pedro Romero y Otiniano UNI-FIQT-AACB CICLO 2003-I 13/12/03 6ta PRACTICA PROGRAMACION DIGITAL (MA-713) ----------------------------------------------------------------------------------------------------------INDICACIONES: Sin libros, copias ni apuntes. Duración: 90 minutos. EL SOLO INTENTO DE PLAGIO ANULA AUTOMATICAMENTE LA PRUEBA. Mantenga orden y claridad en el desarrollo de sus preguntas. Está PROHIBIDO el préstamo de calculadoras y apague su teléfono celular. ---------------------------------------------------------------------------------------------------------- 2. La serie f(x) = ! )1......( 432 1 432 N xxxx x N N , es la representación de Mclaurin de Ln(x+1) y esta converge para -1 < x < 1. Hacer un programa que nos pida el valor de x y N por teclado, y calcule la sumatoria. Nota: N debe ser entero y positivo. 2. Escriba un programa para calcular la siguiente serie: NNx N xxxx S 2 ! ...... 2 !4 2 !3 2 !2!1 443322 Donde N y x son datos. 3. Elaborar un programa que permita calcular el combinatorio de dos números. Recordar que el combinatorio de dos números se calcula de la siguiente manera: )!(! ! rnr nn r C 4. Tenemos la densidad del Sodio para 4 temperaturas: T ( °C) 94 205 371 400 ( kg. / m3) 929 902 860 760 Mediante un programa, que permita ingresar los datos de temperatura y densidad (como vectores), hallar las temperaturas a la cual la densidad es 875 y 800 kg./m3. Nota: Los programas en Matlab. ….. Ing. Pedro Romero y Otiniano PROBLEMAS RESUELTOS DE WHILE PROBLEMA N°1: Dado el siguiente vector, hacer un programa que indique en que posiciones se encuentran los números negativos. V=[1, 2, 25, -12, -8, 32, -4, 88, -7,-21 ] SOLUCION: % Programa que imprime las posiciones con números negativos en un vector clc; V = [1, 2, 25, -12, -8, 32, -4, 88, -7,-21]; i=1; while (i<=length(V)) if (V(i)<0) fprintf ('En la posición %d hay un número negativo \n: ', i ); end i = i + 1; end PROBLEMA N°2: Realizar un programa que calcule el Factorial de un número N. SOLUCION: N=input ('dame un numero para multiplicar = '); k=1; A=1; % Dar un valor para que realice la multiplicación en forma de bucle while k<=N A=A*k; disp (A) k=k+1; end disp ('Fin de programa'); PROBLEMA N°3: Hacer un programa que recoja números del usuario hasta que se introduzca un 0 y después devuelva la media de los números introducidos. SOLUCION: c=0; n = input ('Introduce un numero='); S = 0; while (n~=0) S = S + n; c = c+1; n=input('Intoduce un numero='); end med = S/c; fprintf('La media vale %f', med); PROBLEMA N°4: Hacer un programa que pida un número hasta que este número sea mayor que 0 indicando con un mensaje que el número introducido es mayor que 0. Caso contrario que pida reintroducir otro valor. SOLUCION: n=input('Dame un valor: '); if n > 0 disp ('El numero introducido es mayor que cero') else while n <= 0 n = input ('Reintroduce el valor correcto: '); end disp ('El numero introducido es mayor que cero') Ing. Pedro Romero y Otiniano end disp('Fin del programa') PROBLEMA N°5: Realizar un programa que pida un número y que combinado con otros dos números menores o iguales a este número, te dé el valor del número que se pidió. SOLUCION: N=input ('Dame un valor='); M=0; while M<=N S=0; while S<=N if N==M+S; fprintf ('Combinacion: %d=%d+%d\n', M+S, M, S); %disp(M) %disp(S) end S=S+1; end M=M+1; end disp ('Fin de programa') PROBLEMA N°6: Realizar un programa que Sume una serie de Números Ingresados por el usuario. Dicha suma se realizara cuando el usuario introduzca el número 0. SOLUCION: % Programa que Suma Números mientras no sean 0 n=1; S=0; while (n ~= 0) n = input ('Ingrese un número, para terminar digite 0:'); S = S + n; end disp('la suma de los números Ingresados es :') disp(S); ….. Ing. Pedro Romero y Otiniano EJERCICIOS DEL COMANDO: WHILE 1. Escribir un programa que descomponga un numero N en todos sus factores correspondientes. Ej.: 24= 2*2*2*3 clear all; close all; n = input('Ingrese Numero = '); d=2; while n>1 if rem(n, d)==0 fprintf('%d', d); n=n/d; else d=d+1; end end 2. Ingresar 2 números y calcular su mínimo común múltiplo: clc; clear all; n1 = input('Primer numero='); n2 = input('Segundo numero='); d=2; mcm = 1; while n1~=1 | n2~=1 if rem(n1,d)==0 | rem(n2,d)==0 mcm= mcm*d; if rem (n1, d)==0 n1=n1/d; end if rem(n2, d)==0 n2=n2/d; end else d=d+1; end 3. Ingresar un número y reportar el número de dígitos que tiene clc; n=input('Ingrese Numero='); x=n; cd=0; while x>0 dig= rem(x,10); cd= cd+1; x= fix(x/10); end fprintf ('El numero %d tiene %d digitos', n, cd); 4. Ingresar un número y reportarlo al revés clc; n = input('Ingrese número = '); disp ('El numero al revés es = '); while n > 0 dig = rem (n, 10); fprintf('%d', dig); n = fix(n/10); end Ing. Pedro Romero y Otiniano 5. Ingresar un número y reportar si es capicúa clc; n=input('Ingrese número='); x=n; inv=0; while x>0 dig=rem(x,10); inv=inv*10+dig; x=fix(x/10); end if n==inv disp('El número Capicúa es'); else disp('El número no es Capicúa'); end 6. Ingresar un número en base 10 y convertirlo a base 2 clc; n=input('Ingrese Numero='); x=n; b2=0;p=1; while x>0 r=rem(x,2); b2=b2+r*p; p=p*10; x=fix(x/2); end fprintf('El Numero en base 2 es= %d',b2); 7. Ingresar un número en base 2 a base 10 clc; b2=input('Ingrese numero en base 2='); x=b2; n=0; p=1; while x>0 r=rem(x,10); n=n+r*p; p=p*2; x=fix(x/10); end fprintf ('el numero en base 10 es= %d', n); 8. Dado el siguiente vector, hacer un programa que indique en qué posición se encuentran los números negativos. clc; V=[1, 2, 25, -12, -8, 32, -4, 88, -7,-21 ]; i=1; while (i<=length(V)) if (V(i) <0) fprintf ('En la posición %d hay un número negativo \n: ', i ); end i=i+1; end Ing. Pedro Romero y Otiniano 9. Calcula la suma de las inversas de los factoriales hasta que alguno sea menor a 10-6 clc; format long; i=1; t = 1/factorial(i); a = 0; while ( t >= 10^-6) a=a+t; i=i+1; t=1/factorial(i) end; disp('Resultado='); disp(a); format; fprintf Pag. 108 Ing. Pedro Romero y Otiniano [Applied Numerical Methods Using Matlab (Yang 2005 Wiley).pdf] >> nm122 % [43: (pag. 32)] clear f1 = inline (’sqrt(x)*(sqrt(x + 1) - sqrt(x))’, ’x’); f2 = inline (’sqrt(x)./(sqrt(x + 1) + sqrt(x))’, ’x’); x = 1; format long e; for k = 1:15 fprintf (’At x = %15.0f, f1(x) = %20.18f, f2(x) = %20.18f\n’, x, f1(x), f2(x)); x = 10*x; end sx1 = sqrt(x+1); sx = sqrt(x); d = sx1 - sx; s = sx1 + sx; fprintf (’sqrt(x+1) = %25.13f, sqrt(x) = %25.13f ’, sx1, sx); fprintf (’ diff = %25.23f, sum = %25.23f \n’, d, s); >> Ing. Pedro Romero y Otiniano La sintaxis de MATLAB asemeja a la de FORTRAN. Para tener una idea de las similitudes, comparemos los códigos escritos en los dos idiomas para la solución de ecuaciones simultáneas Ax = b por la Eliminación de Gauss. Aquí está la subrutina en FORTRAN 90: Subroutine Gauss(A, b, n) use prec_mod implicit none real(DP), dimension(:, :), intent(in out) : : A real(DP), dimension(:), intent(in out) : : b integer, intent(in) : : n real(DP) : : lambda integer : : i, k ! --------------Elimination phase-------------- do k = 1,n-1 do i = k+1,n if(A(i, k) /= 0) then lambda = A(i, k)/A(k, k) A(i, k+1:n) = A(i, k+1:n) - lambda*A(k, k+1:n) b(i) = b(i) - lambda*b(k) end if end do end do ! ------------Back substitution phase----------do k = n,1,-1 b(k) = (b(k) - sum(A(k, k+1:n)*b(k+1:n)))/A(k, k) end do return end Subroutine Gauss El uso comunicado prec-mod indica al compilador para cargar el módulo prec-mod (no mostrado aquí), que define la longitud de la palabra DP para los números de punto flotante. También tenga en cuenta el uso de las secciones de la matriz, como una (k, k + 1: n), una característica que no estaba disponible en las versiones anteriores de FORTRAN. La función de MATLAB equivalente es (MATLAB no tiene subrutinas): function b = gauss(A, b) n = length(b); % -----------------Elimination phase------------- for k = 1:n-1 for i = k+1:n if A(i, k) ~= 0 lambda = A(i, k)/A(k, k); A(i, k+1:n) = A(i, k+1:n) - lambda*A(k, k+1:n); b(i)= b(i) - lambda*b(k); end end end %--------------Back substitution phase----------- for k = n:-1:1 b(k) = (b(k) - A(k, k+1:n)*b(k+1:n))/A(k, k); end Ecuaciones simultáneas también pueden ser resueltas en MATLAB con el comando sencillo A \ b (ver más abajo). Ing. Pedro Romero y Otiniano MATLAB puede ser operado en el modo interactivo a través de su ventana de comandos, donde cada comando se ejecuta inmediatamente después de su entrada. En este modo MATLAB actúa como una calculadora electrónica. He aquí un ejemplo de una sesión interactiva para la solución de ecuaciones simultáneas: >> A = [2 1 0; -1 2 2; 0 1 4]; % Input 3 x 3 matrix >> b = [1; 2; 3]; % Input column vector >> soln = A\b % Solve A*x = b by left division soln = 0.2500 0.5000 0.6250 El símbolo >> es rápido MATLAB para la entrada. El signo de porcentaje (%) marca el a partir de un comentario. Un punto y coma (;), tiene dos funciones: suprime la impresión de los resultados intermedios y separa las filas de una matriz. Con una terminación punto y coma, se mostrará el resultado de un comando. Por ejemplo, la omisión del último punto y coma en la línea que define la matriz A se traduciría en: >> A = [2 1 0; -1 2 2; 0 1 4] A = 2 1 0 -1 2 2 0 1 4 Funciones y programas se pueden crear con el editor/ depurador de MATLAB y guardado con la extensión .m (MATLAB los llama M-files). El nombre de archivo de un salvado función debe ser idéntico al nombre de la función. Por ejemplo, si la función de para la eliminación de Gauss enumerados anteriormente se guarda como gauss.m, se le puede llamar como cualquier Función de MATLAB: >> A = [2 1 0; -1 2 2; 0 1 4]; >> b = [1; 2; 3]; >> soln = gauss(A, b) soln = 0.2500 0.5000 0.6250 TIPOS DE DATOS Y VARIABLES Tipos de datos: Los tipos más comúnmente utilizados MATLAB datos, o clases, son dobles, char y lógico, todos los cuales son considerados por MATLAB como matrices. Objetos numéricos pertenecer a la clase doble, que representa las matrices de doble precisión; un escalar es tratada como una matriz 1 × 1. Los elementos de un array tipo char son cadenas (secuencias de caracteres), mientras que un elemento de tipo de matriz lógica puede contener solamente 1 (verdadero) o 0 (False). Otra clase importante es mango función, que es única para MATLAB. Ello contiene la información necesaria para encontrar y ejecutar una función. El nombre de una función mango consiste en el carácter @, seguido por el nombre de la función; por ejemplo, Sin. Manijas de función se utilizan como argumentos de entrada de llamadas a funciones. Por ejemplo, supongamos que tenemos una función parcela MATLAB (func, x1, x2) que traza ninguna especifica el usuario función func desde x1 a x2. La llamada a la función para trazar sen x de 0 a π habría plot (@ pecado, 0, pi). Ing. Pedro Romero y Otiniano Hay otros tipos de datos, pero que rara vez se encuentran con el min este texto. Adicional las clases pueden ser definidas por el usuario. La clase de un objeto se puede mostrar con el comando de clase. Por ejemplo, >> x = 1 + 3i % Complex number >> class(x) ans = double
Compartir