MatLab
Matlab es la abreviatura de Matrix Laboratory (laboratorio de matrices). Creado en 1984 por The MathWorks, es un software de cálculo muy usado en universidades, centros de investigación y por ingenieros. En los últimos años ha incluido muchas más capacidades, como la de programar directamente procesadores digitales de señal, crear código, etc.
Prom t Ventana del Espacio de Trabajo y Ventana del Directorio Actual de Trabajo Ventana de Comandos
Ventana de historial de Comandos utilizados
Figura 1: El escritorio de Matlab
Matlab es un sistema interactivo, cuando se arranca en un ordenador aparece en la pantalla pantalla la Figura 1 a cuya derecha se encuentra la ventana de comandos. Cuando se escribe después del prompt >> el nombre del comando y se presiona la tecla 'enter', el sistema ejecuta la instrucción y si no le ha asignado un nombre concreto lo guardará en una nueva variable llamada ans. Las variables se almacenan en el workspace que se puede ver a la izquierda de la Figura1. Matlab tiene tres características muy importantes que lo diferencian de otros lenguajes: 1. Las variables no necesitan ser previamente declaradas. 2. Contiene una gran colección de funciones matemáticas con un número de argumentos no necesariamente el mismo.
1
3. El tipo de dato fundamental son vectores y matrices de números complejos almacenados en aritmética flotante flotante de doble precisión. Algunos comentarios generales generales que siempre se deberán deberán tener en cuenta: 1. Los caracteres mayúsculos y minúsculos no son equivalentes. 2. Un punto y coma al final de un comando suprime la salida por pantalla. 3. Los ( ) y [ ] no son intercambiables. 1.- Tipos de Datos en MatLab
MATLAB es un entorno pensando para trabajar con vectores y matrices. Por ello, tanto el propio programa como la sintaxis de los comandos que se introducen están optimizados para este tipo de objetos. MATLAB también permite representar tipos de datos escalares, como números enteros, números reales (en formato de coma flotante de doble precisión), variables booleanas y números complejos. Ejemplo:
Escalares
Números complejos
Figura 2: Escalar y número complejo 2.- Variables en MatLab
Los nombres de variables en MatLab deben comenzar por una letra. El resto de los caracteres pueden ser letras, dígitos o subrayados. Únicamente son importantes los 63 primeros caracteres caracteres para la versión 7. Matlab distingue entre mayúsculas y minúsculas. Ejemplo: Area es diferente area y AREA.
2
2.1.1 Variables predefinidas Nombre Significado
Pi Inf NaN i,j
π
Infinito Not a Number Imaginario
3.- Formatos de salida
La función format cambia la precisión de los datos de salida. Matlab, presenta valores de acuerdo a un formato, el que por defecto es format short; existen otros (ver la siguiente tabla y figura 3) Comandos
long short e long e hex bank + rat short
Valor de pi
3.14159265358979 3.1416e+000 3.14159265358979e+000 3.14159265358979e+000 400921fb54442d18 3.14 + 355/113 3.1416
Figura 3: Formatos de salida 4.- Comandos Comandos para mostrar datos 4.1 Comando Comando disp
Este comando se utiliza para visualizar un texto o contenido de una variable sin mostrar su nombre. El formato de este comando es: disp (nombre de variable) o disp (‘Mensaje’)
3
Cada vez que se ejecuta el comando disp, la salida aparece en una nueva línea. Por ejemplo: Utilización del comando disp para Visualizar un mensaje en pantalla. Se asi na un valor de 15 a la variable x Se utiliza el comando dis
ara visualizar el contenido de la variable
Visualización de la variable nombre
Figura 4: Comando disp 4.2 Comando fprintf
El comando fprintf se utiliza para visualizar salidas de programas (texto y datos) en la pantalla, o bien para almacenarlas en un fichero. Con este comando, y a diferencia de disp. La salida puede tener un formato preestablecido. En este caso se pueden combinar texto y resultados numéricos provenientes de cálculos o variables predefinidas en la misma línea. Además, el formato de los números se puede controlar directamente con este comando. Gracias a su expresividad, el comando fprintf es útil en la visualización de salidas, pero esta misma razón hace que este comando sea un tanto complejo y con una sintaxis larga en algunos casos. Para evitar cualquier confusión, vamos a presentar este comando gradualmente. Primero veremos como utilizar fprintf para visualizar mensajes de texto para después ver cómo podemos combinar números y cadenas en la salida. 4.2.1 Uso del comando fprintf para visualizar mensajes de texto:
Para la visualización de texto, el comando fprintf se utiliza de la forma: fprintf (‘Mensaje en forma de cadena’)
Por ejemplo:
Carácter \n, hace que pasa a la línea siguiente el mensaje que esta delante de él carácter
Figura 5: Comando fprintf
4
Con el comando fprintf es posible empezar una nueva línea e indicarlo en la mitad de la cadena que se introduce como parámetro. Esto se hace insertando \n antes del carácter que va empezar en la línea siguiente, Como en el ejemplo anterior (figura 5). Al carácter \n se le denomina carácter de escape. Es uno de los caracteres utilizados para controlar la salida. Además, existen estos otros caracteres de escape que pueden ser insertados dentro de una cadena: \b \t
Carácter de borrado Tabulación horizontal.
4.2.2 Utilización del comando fprintf para visualizar datos y textos juntos:
Para visualizar texto y datos (valores de variables) juntos, el comando fprintf debe utilizarse siguiendo la sintaxis: fprintf (‘Texto %-5.4f texto adicional’, nombre_variable)
Ejemplo:
Figura 6: Comando fprintf
El símbolo % marca del lugar donde se insertará el número dentro del texto. -5.4f Elementos de formato - Flag o bandera (opcional) 5.4 Ancho de campo y precisión (opcional) f Carácter de conversión (obligatorio) nombre_variable, Nombre de variable cuyo valor será visualizado (R) El flag o bandera, cuyo carácter es opcional, puede ser uno de los siguientes: Carácter utilizado Para la bandera
- (signo menos) + (signo más) 0 (cero)
Descripción
Justificación izquierda del número dentro del campo Visualiza el carácter de signo (+ o - ) delante del número Añade ceros si el número es más pequeño que el campo
La especificación del ancho y precisión del campo (5.4 en el ejemplo anterior) es opcional. El primer número (5 en nuestro ejemplo) es el ancho de campo, el cual nos indica el menor número de dígitos en la visualización. Si el 5
número que se visualiza es menor que el ancho de campo, se añadirán ceros o espacios delante del número en cuestión. La precisión se corresponde con el segundo número (figura 6), y especifica el número de dígitos que se mostrarán a la derecha del punto decimal. El último elemento es el correspondiente al formato de conversión (f en el ejemplo anterior). Este es obligatorio. A continuación se muestran los caracteres de conversión más utilizados:
e Notación ex onencial en minúsculas E Notación ex onencial en ma úsculas f Notación de unto fi o g Representación en formato corto de Las notaciones e o f G Representación en formato corto de Las notaciones e o f i Entero
Figura 7: Caracteres de conversión
Se puede obtener información adicional sobre estos y otros formatos utilizando la ayuda de MATLAB, en el menú Help (Ayuda). A continuación se muestra un 5.- Comandos para ingresar datos 5.1. Comando para ingresar datos por teclado: input nombre_variable=input(‘Mensaje que se muestra en la Ventana de Comandos’)
Ejemplo:
Figura 8: Comando input
6
6.- Operadores aritméticos básicos son: Símbolo
Operación
+ * / \ ^ ‘ ( )
Suma Resta Multiplicación División División en sentido contrario ( 2\1) = 0.5 Potencia Transpuesta Paréntesis
7.- Funciones matemáticas elementales que operan de modo escalar
Estas funciones, que comprenden las funciones matemáticas trascendentales y otras funciones básicas, actúan sobre cada elemento de la matriz como si se tratase de un escalar. Se aplican de la misma forma a escalares, vectores y matrices. Algunas de las funciones de este grupo son las siguientes: Función
sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) atan2(y, x) sinh(x) cosh(x) tanh(x) asinh(x) acosh(x) atanh(x) log(x) log10(x) exp(x) sqrt(x) sign(x) rem(x, y) round(x) fix(x) floor(x) ceil(x) gcd(x, y) lcm(x, y) real(x)
Comentario
Seno Coseno Tangente arco seno arco coseno arco tangente (devuelve un ángulo entre –pi/2 y +pi/2) Devuelve un ángulo entre –pi y pi; se le pasan 2 argumentos, proporcionales al seno y al coseno seno hiperbólico coseno hiperbólico tangente hiperbólica arco seno hiperbólico arco coseno hiperbólico arco tangente hiperbólica logaritmo natural logaritmo decimal función exponencial raíz cuadrada Devuelve -1 si <0, 0 si=0, y 1 si>0. Aplicada a un numero complejo devuelve un vector unitario en la misma dirección resto de la división de x entre y redondea hacia el entero mas próximo redondea hacia el entero más próximo a 0 valor entero más próximo hacia menos infinito valor entero más próximo hacia más infinito máximo común divisor mínimo común múltiplo parte real 7
imag(x) abs(x) angle(x)
parte imaginaria valor absoluto Ángulos de fase
8. Elaboración de un Programa (Fichero Script) en Matlab
1) Como se muestra en la Figura, en El menú File escoger New y luego M-File
Figura 9: Creación de un archivo con extensión m
Al presionar en M-File se muestra la siguiente Venta de Edición
Figura 10: Ventana de edición
En la cual podremos escribir el Programa que deseemos, en otras palabras un conjunto de instrucciones de matlab para poder resolver un problema determinado 8
8.1 Comentarios en Matlab
Los comentarios deben ir precedidos por % o, lo que es lo mismo, MATLAB ignora todo lo que vaya precedido por el símbolo %. Ejemplo Ingresar la base y la altura de un Rectángulo y reportar el area, el perímetro y la diagonal.
Figura 11: Programa rectángulo
Una vez escrito el programa se graba con el nombre de rectángulo generando un archivo que puede ser llamada desde la ventana de comandos. Se debe escribir rectángulo y presionar enter
Figura 12: Ejecución del programa rectángulo
El programa se ejecuta y pide el valor de la base del rectángulo se ingresa un numero por ejemplo 3 y se presiona enter, luego pide el valor de la altura se ingresa otro numero por ejemplo 4 y se presiona enter, luego el programa 9
reporta el valor del área, el perímetro y la diagonal como se muestra en la figura 12. 9.- Estructuras secuenciales
Son estructuras de programas que cuando se ejecutan, lo hacen instrucción por instrucción, en orden de manera secuencial 9.1.- Ejemplos de Estructuras Secuenciales
Ejemplo 1
Figura 13: Programa para calcular el área y la longitud de la circunferencia
Ejecución en la Ventana de Comandos
Figura 14: Ejecución del programa circulo
10
Ejemplo 2
Figura 15: Programa de conversión de radianes a grados sexagesimales
Ejecución en la Ventana de Comandos
Figura 16: Ejecución del programa de conversión
Ejemplo 3
Figura 17: Programa para calcular el promedio de tres números enteros
Ejecución en la Ventana de Comandos
11
Figura 18: Ejecución del programa para calcular promedio
Ejemplo 4
Figura 19: Programa de cuadrado
Ejecución en la Ventana de Comandos
Figura 20: Ejecución del programa de un cuadrado
Ejemplo 5
Figura 21: Programa de periodo de tiempo
12
Ejemplo 6 Figura 22: Ejecución del programa de periodo de tiempo
Ejemplo 6
Figura 23: Programa para calcular el interés generado por un capital
Figura 24: Ejecución del programa de interés
Ejemplo 7
Figura 25: Enunciado del problema de un triangulo
13
Figura 26: Programa para calcular ángulos de un triangulo
Figura 27: Ejecución del programa Practica Nº 1
1. Hacer un programa para calcular el área de un triángulo dada la base y la altura. 2. Escriba un programa que lea un número y escriba su cuadrado. 3. Determinar el volumen de un cilindro cuyas dimensiones radio y altura se leen desde el teclado. 4. Determinar la hipotenusa de un triángulo rectángulo si se ingresan las longitudes de los catetos. 5. Hacer un programa para que se ingresen 2 números y reporte su suma, resta y multiplicación. 6. Calcular el perímetro, el área y la diagonal de un rectángulo si se ingresan los lados. 7. Hacer un programa que se ingrese una temperatura en grados centígrados ( ° C) y la reporte en grados Fahrenheit ( ° F) F = 9/5 C + 32 8. Hacer un programa para convertir metros a pies y pulgadas. metro = 39.37 pulgadas
14
1 metro = 3.2 pies 9. Hacer un programa que intercambie el valor de 2 variables numéricas. 10. Hacer un programa para hallar la ganancia de la venta de un producto. Se debe ingresar el precio de costo, precio de venta. Se debe reportar la ganancia. 11. Hacer un programa para que se ingrese una cantidad en kilos y reporte su equivalencia en libras. 1 kilo = 2.2 libras 12. Calcular el salario neto de un trabajador. Se debe leer el nombre, horas trabajadas, precio de la hora y sabiendo que los impuestos aplicados son el 10 por ciento sobre el salario bruto. 13. Calcular la altura que cae un objeto. Se debe ingresar el tiempo recorrido en segundos. 14. Calcular la presión de un gas en un recipiente. Se debe ingresar la temperatura (° C), el número de moles n y el volumen (lts). 15. Calcular el espacio recorrido por un móvil. Ingresar Velocidad inicial (m/seg.), tiempo (seg.) y aceleración (m/seg2). 10.- Operadores Relacionales Y Lógicos
Además de las operaciones matemáticas tradicionales, MATLAB nos permite realizar operaciones relacionales y lógicas. El objetivo de estos operadores es proporcionar respuestas a cuestiones verdadero/falso. MATLAB responde a este tipo de preguntas con 1 (verdadero) ó 0 (falso). 10.1.- Operadores relacionales
Los operadores relacionales de MATLAB son las comparaciones comunes: <
Menor que
<=
Menor o igual
>
Mayor que
>=
Mayor o igual
==
Igual a
~=
Distinto a
15
10.2.- Operadores lógicos
Los operadores lógicos que proporciona MATLAB son: & |
AND OR
~
NOT
11. - Estructura Selectiva Simple (if … else….end)
Sirve para escoger dos caminos en un programa de acuerdo al resultado de una expresión lógica. if condición
Instrucciones1 else
Instrucciones2 end
Si la condición es verdadera se ejecutan Instrucciones1, en caso contrario si es falsa se ejecutan Instrucciones2. La sentencia else es opcional if
condición Instrucciones
end
11.1 Estructuras selectivas simples encadenadas
Permite escoger entre diferentes alternativas evaluando diferentes condiciones. Se encadenan varios if-else. condicion1 instrucciones1 elseif condicion2 instrucciones2 elseif condicion3 instrucciones3 elseif condición4 instrucciones4 if
…
else
% opción por defecto cuando no se cumple % ninguna de las anteriores Instrucciones n
end
16
11.2.- Ejemplos de condicionales (o selectivas)
Ejemplo Condicional 01
Ejecución
Ejemplo Condicional 02
Ejecución
Ejemplo Condicional 03
17
Ejecución
Ejemplo Condicional 04
D de
18
Ejecución
Ejemplo Condicional 05
Ejecución
19
Ejemplo Condicional 06
Ejecución
Pr actica N Nº 2 2
1. 2. 3.
Hacer un programa para que se ingrese 2 números y se reporte el mayor de ellos. Escriba un programa para determinar sí un número entero A es divisible por otro B. Hacer un programa para que calcule e imprima los valores de las raíces reales de una ecuación de segundo grado: Ax2 + Bx + C =0 Se debe ingresar los coeficientes de la ecuación A, B y C.
4.
La tasa de interés sobre un préstamo es del 8% si la cantidad es menor o igual que S/. 200, pero es de 6% si excede a 200. Hacer un programa para que ingrese la cantidad y reporte el interés y el monto total.
5.
Hacer un programa de tal manera que se ingrese las 2 evaluaciones de un alumno y reporte APROBADO si el promedio es mayor o igual a 10.5 y DESAPROBADO en caso contrario.
20
6.
La comisión de las ventas totales es como sigue: a) Si VENTAS < S/.80, entonces no hay comisión. b) Si S/.80 <= VENTAS <= S/.600 entonces la comisión es igual al 12% de las ventas. c) Si VENTAS > 600 entonces la comisión es igual al 15% de las ventas. Hacer un programa para que se ingrese las ventas y se reporte la comisión.
7.
Hacer un programa para calcular el pago semanal de un trabajador. Se debe ingresar el nombre, pago por hora y el número de horas trabajadas. Si normalmente se trabaja 40 horas a la semana y por cada hora extra trabajada se paga 1.5 veces la hora normal, reportar el nombre y el pago semanal del trabajador.
8.
Se repartirá la herencia entre los hijos de un señor como sigue: Si la cantidad de hijos es menor que 4; se repartirá exactamente entre el número de hijos; si son 4 o más hijos, la mitad le tocará al hermano mayor y el resto se dividirá entre los demás hermano. Hacer un programa para que reporte cuando le corresponde a cada hijo. Se debe ingresar la herencia y el número de hijos.
9.
Una empresa comercial desea hacer un programa para calcular el precio neto de un artículo de acuerdo a lo siguiente: a) Si la venta es al contado se le da el 40% de descuento. b) Si la venta es a plazos y: T < 12 meses se recarga el 30% T>=12 meses se recarga el 60% Se debe ingresar el precio del artículo, el codigo de venta (c) contado, (p) plazos y si la venta es a plazos se debe ingresar el tiempo de pago.
10. En un triángulo se cumple lo siguiente: s>a, s>b, s>c donde s: semiperímetro
a, b, c: Lados del triángulo
Hacer un programa para que se ingresen los valores de los lados del triángulo y si estos valores cumplen las condiciones calcular el área del triángulo en caso contrario reportar 'DATOS INCORRECTOS'. AREA=
s(s-a)(s-b)(s-c)
11. Calcular el valor de la función de acuerdo a lo siguiente : y = x 2 + 5 Si x<=0 y = 3x - 1 Si 0 < x < 2 y = x2 - 4x + 5 Sí x>=2 Se debe ingresar el valor de x y reportar el valor de y. 21
12. Los empleados de una fábrica trabajan en dos turnos: diurno y nocturno. Se desea calcular el jornal diario de acuerdo a los siguientes puntos: - La tarifa de las horas diurnas es de S/.1.5 - La tarifa de las horas nocturnas es de S/. 2.25 - En caso de ser domingo la tarifa aumentará en S/.1 en el turno diurno y S/. 1.25 en el turno nocturno. Se debe leer el turno, las horas trabajadas y el día de la semana. 11.3.- Estructura Selectiva múltiple
La sentencia switch realiza una función análoga a un conjunto de if-elseif encadenados. Su sintaxis es la siguiente: switch expresión case valor1 instrucciones1 case valor2 instrucciones2 case {valor3, valor4, valor5} instrucciones3 case
… …
otherwise % opción por defecto
instrucciones4 end
En primer lugar, se evalúa la expresión del switch, cuyo resultado debe ser un número escalar o una cadena de caracteres. Este resultado se compara con los valores de cada uno de los case y se ejecutan las instrucciones del case cuyo valor coincida. Sólo se ejecutará el que coincida. Si ningún valor de los case coincide, entonces se ejecutarán las instrucciones indicadas en otherwise. Observar que se puede agrupar más de un valor en un case. 11.4.- Ejemplos de estructuras selectivas múltiples
Ejemplo múltiple 01
22
Ejecución
Ejemplo múltiple 02
23
Ejecución a
Ejecución b
Ejecución c
Ejemplo múltiple 03
24
Ejecución
12. - Estructuras Repetitivas 1) while …. End
while condicion Instrucciones end 2) for
for v = vi : inc: vf Instrucciones end donde : vi: valor inicial inc: incremento vf: valor final Si el incremento es de 1 en 1, se omite el incremento for v=vi:vf Instrucciones end Contador: Es una variable comienza con valor inicial y se incrementa en un
valor constante. Inicializamos Y en el proceso
C=0; C=C+Valor_constante;
25
12.1.- Ejemplos While…end
Ejemplo mientras 01
Ejecución
Ejemplo mientras 02
Ejecución
Ejemplo mientras 03
26
Ejecución
12.2.- Ejemplos de procesos repetitivos for
Ejemplo for 01
Ejecución
Ejemplo for 02
Ejecución
27
Ejemplo for 03
Ejecución
12.3.- Ejemplos de estructuras mixtas
Ejemplo repetitivo 01
Ejecución
28
Ejemplo repetitivo 02
Ejecución
Acumulador: Variable que comienza con un valor inicial que generalmente es
cero y se incrementa una cantidad variable Inicializamos S=0 Y en el proceso de suma S = S + valor_a_sumar;
29
Ejemplo repetitivo 03
Ejecución
Ejemplo repetitivo 04
Ejecución
Ejemplo repetitivo 05
30
Ejecución
Ejemplo repetitivo 06
31
Ejecución
Ejemplo repetitivo 07
32
Ejecución
Multiplicador: Variable que comienza con un valor inicial que generalmente es
uno y se multiplica una cantidad variable Inicializamos
P = 1;
Y en el proceso de multiplicación P = P * valor_a_multiplicar; Ejemplo repetitivo 08
Ejecución
33
Ejemplo repetitivo 09
Ejecución
Ejemplo 10 Calcular la suma de los n términos de la siguiente serie: s = 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 +...... 1/n.
Ejecución
34
Ejemplo 11 Ingresar n números, calcular el máximo y el mínimo de ellos.
Ejecución
Ejemplo 12 Realizar un programa que escriba los n términos de la serie de Fibonacci: 1, 1, 2, 3, 5, 8, 13,.......
35
Ejecución
Ejemplo 13 Calcular la sumatoria: s = 1 + x + x 2 /2! + x3 /3! + x4 /4! + ........ + xn /n! Se debe ingresar x real y n entero positivo.
Ejecución
36
Ejercicios Resueltos
1.- Programa para ingresar un número y reportar todos sus divisores clc n=input('ingrese numero :'); disp('Los divisores son '); for i=1:n if rem(n,i)==0 fprintf('%d ',i); end end 2.- Ingresar un número y reportar si es perfecto. Un número es perfecto si es igual a la suma de divisores menores que el clear all clc n=input('Ingrese numero :'); s=0; for i=1:n-1 if rem(n,i)==0 s= s+i; end end if n==s disp('es perfecto'); else disp('no es perfecto'); end 3.- Ingresar un número y reportar si es primo. clear all clc n=input('Ingrese numero :'); cd=0; for i=1:n if rem(n,i)==0 cd= cd+1; end end if cd==2 disp('es primo'); else disp('no es primo'); end
37
4.- Escribir un programa que descomponga un número N en todos sus factores correspondientes. Ej.: 27 = 3*3*3 180 = 2*2*3*3*3 clear all clc 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 5.- Ingresar 2 números y calcular su máximo común divisor clc clear all n1=input('Primer numero :'); n2=input('Segundo numero :'); d=2; mcd=1; while d<=n1 & d<=n2 if rem(n1,d)==0 & rem(n2,d)==0 mcd=mcd*d; n1=n1/d; n2=n2/d; else d=d+1; end end fprintf('El m.c.d. es : %d ',mcd); 6.- 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; 38
end if rem(n2,d)==0 n2=n2/d; end else d=d+1; end 7.- 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); 8.- Ingresar un número y reportarlo al revés clc; n=input('Ingrese numero :'); x=n; disp('El numero al reves es :'); while x>0 dig= rem(x,10); fprintf('%d',dig); x=fix(x/10); end 9.- Ingresar un número y reportar si es capicúa clc; n=input('Ingrese numero :'); 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 numero es capicua'); else disp('el numero no es capicua'); end
39
10.- 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); 11.- 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); Ejercicios Sobre Estructuras Repetitiva Ejercicios De Sumatorias
1.-
Escribir un programa que permita leer 3 números positivos A,B, n: n>0 calcule el valor de la sumatoria: 1
2 +
A 2.-
3 +
A+B
4
(n+1)
+ A + 2B
+ ..... + A + 3B
A + nB
Escribir un programa que lea 3 números enteros positivos A, B, N>0, calcule la sumatoria de: 1
2 -
A
3 +
A+B
4 -
A + 2B
(N+1) + .....
A + 3B
A + NB
40
3.-
Escribir un programa que lea 3 números enteros positivos a, b, n>0, calcule la sumatoria de: 1!
2!
3!
A 4.-
4!
+
(n+1)!
-
A+B
A + 2B
+ ..... A + 3B
A + nB
Escribir un programa que calcule el valor del número "e" como la suma de la serie: 1 e = 1/i =
1 +
1 +
+ .............
0! 1! 2! La sumatoria terminará cuando se tenga el primer término inferior a 0.001 5.-
Escribir un programa que permita calcular la sumatoria de: 1+ X+
X2
+
X3
+ ...............
2! 3! Hasta que el termino |xn/n!| < 0.001. Se debe ingresar el valor de X. 6.-
Escriba un programa que lea 2 números X1 y X2 tal que X1
7.-
X
X2
-
+
X3
-
X4
+ .....
3! 5! 7! 9! La sumatoria termina cuando se tiene un término: | X n/Y! | < 0.001. Escriba un programa que permita calcular el valor de f(x) para valores desde X=X1 hasta X=X2. X3 f(x) = X +
X5 -
X7 +
X9 -
+ .....
3! 5! 7! 9! Cada sumatoria termina cuando se tiene un término : | X n/Y! | < 0.001. 8.-
Escribir un programa que que lea 3 números enteros A, B y n (n>0, A>0 y B>0) y calcule la sumatoria de n!
(n-1)! -
A 9.-
(n-2)! +
A+B
(n-3)! -
A+2B
1! + ........
A+3B
A+(n-1)B
Escribir un programa que permita calcular cuantos términos debe tener esta sumatoria para que el valor de esta sea lo más cercano a 1000 (sin exceder de 1000). 41
k2 + 1 k=
= 1000 n = ? k Ejercicios De Series
1.-
Escribir un programa que permita leer un número entero n>0 y que imprima los n términos de la serie: 1
2 +
2.-
3 +
4 +
5 +
n + ....... +
2 3 4 5 6 n+1 Escribir un programa que permita imprimir los números de fibonacci, menores que un número n ingresado por el teclado.
3.-
Escribir un programa que lea un número entero n>0 y que imprima los n términos de la serie: 4, 12, 24, 40, 60........ Debe imprimir también la suma de los n términos.
4.-
Escribir un programa que lea un número entero n>0 y que imprima los n términos de la serie: 4, 9, 15, 23, 34, 49,..... Debe imprimir también la suma de los n términos.
5.-
Escribir un programa que lea un número entero n>0 y que imprima los n términos de la serie: 10, 15, 23, 35, 53, 80,.......... Además se debe imprimir la suma de los n términos. Escribir un programa que calcule e imprima el valor de los n términos de la serie:
6.-
2, 1, 1, 2, 8, 64.......
7.-
El valor de n se lee por el teclado y es n>0. También se debe imprimir la suma de los n términos. Escribir un programa que permita calcular e imprimir cada uno de los N términos de la serie: 1 2 4 7 11 + + + + + ......... 4 12 24 40 60 Se debe imprimir como máximo 5 términos por línea. También se debe imprimir la suma de los n términos.
8.-
Escribir un programa que calcule e imprime los N términos de la sumatoria 4 9 15 23 34 49 + + + ....... 2 1 1 2 8 64 Debe imprimir como mínimo k términos por línea. También debe calcular la suma de los N términos. 42
Ejercicios Varios
1.- Escribir un programa que permita mostrar en pantalla los N primeros números primos. N se ingresa por teclado y es N>0. 2.- Escribir un programa que permita leer un número entero N>0 y que imprima todos los números primos menores o iguales que N. 3.- Escribir un programa que determine todos los números primos que se encuentran entre 2 números n1 y n2. n1 y n2 se ingresan por teclado. 4.- Escribir un programa que permita mostrar todos los números perfectos menores que 1000. 5.- Escribir un programa que permita ingresar un número entero y reporte si es un Cubo Perfecto. Un número es un cubo perfecto y es igual a la suma de sus dígitos al cubo. Ejemplo 153 es Perfecto porque 13 + 53+ 33 = 153. 6.- Ingresar un número entero positivo y reportar: - La suma de sus dígitos - El producto de sus dígitos - El mayor de sus dígitos 7.- Escribir un programa que calcule el producto de 2 números enteros en base a sumas sucesivas (solamente). 8.- Escribir un programa que calcule el cociente y el residuo de 2 números enteros en base a restas sucesivas. 9.- Escribir un programa que permita leer números enteros diferentes de cero y que al finalizar imprima: a.- El número mayor y el número menor. b.- El total de números leídos. c.- La cantidad de números positivos y números negativos. El programa termina cuando se ingresa el cero. 10.- Escribir un programa que lea las edades de personas y calcule la edad mayor, la edad menor y la edad promedio. El programa termina cuando se ingresa una edad menor o igual que cero. 11.- Escribir un programa que permita leer números enteros diferentes de cero y que imprima: - El mínimo número negativo leído. - El máximo número positivo leído. - La cantidad de datos leídos. - La cantidad de impares positivos. - La cantidad de pares negativos. El programa termina cuando se ingresa el No cero.
43
Si no se ingreso ningún número negativo debe imprimirse el mensaje: "No se ingresaron números negativos". Si no se ingresó ningún número positivo debe imprimirse el mensaje "No se ingresaron números positivos. 12.- Escribir un programa que permita leer las notas de 3 parciales para 40 alumnos (las notas están entre 0 y 20) y calcule el promedio de cada uno. Si el promedio de las 3 notas es >=11 el alumno aprueba, sino tiene derecho a rendir un examen sustitutorio, el cual reemplaza la nota más baja de las 3 primeras y se calcula nuevamente el promedio del alumno. Se desea saber: - El número de aprobados sin sustitutorio. - El número de aprobados con sustitutorio. - El número de alumnos que rinden examen sustitutorio. - El número de alumnos con promedio final desaprobatorio. El número de alumnos que a pesar de aprobar el sustitutorio al final son desaprobados. 13.- Dado un número entero positivo N, dibujar el siguiente triangulo: Si N=5 saldrá 1 21 321 4321 54321 14.- Dado un número entero positivo N, dibujar el siguiente rectángulo: Si N=4 saldrá ******** ******** ******** ******** 15.- Dado un número entero positivo N, Dibujar en la pantalla el siguiente triangulo: Si N=4 **** *** ** * 16-. Dado un número entero positivo N, dibujar el siguiente cuadrado: Ingrese N: 4 1234 2341 3412 4123 17.- Mostrar en la pantalla los N primeros términos de la serie:
44
10, 11, 12, 14, 17, 22, 30, 34, 37, 44, 54,... Ayuda: los dos primeros términos son 10 y 11, a partir de allí, cada término se forma al aumentar a cada término la suma de los dígitos del término anterior. 18. Determinar cuales son los números de 3 dígitos, cuya suma de sus dígitos es igual a N. Se debe ingresar el valor de N. 19. Ingresar N números de 2 dígitos y determinar cual de ellos Tiene la suma de dígitos mayor. 20. Dado un número entero, mostrar la lista de todos sus divisores Impares, además mostrar la suma de todos sus divisores. 13.- Matrices En Matlab
Una matriz es un conjunto ordenado de datos compuesta de filas y columnas. Para crear una matriz se usa los corchetes para especificar los valores dentro y el punto y coma para separar las filas del arreglo, un espacio además separa las columnas. Por ejemplo: > >A = [1 2 3; 4 5 6; 7 8 9] 123 456 789
Si las matrices tienen una sola fila y columna se les denomina vectores Por ejemplo: Para crear un vector fila: >> x = [4 8 9] x= 4
8
9
Para trabajar con los elementos individuales del vector se usa el nombre del vector con un índice de la siguiente manera X(1) es el primer elemento en este caso 4 X(2) es el segundo elemento en este caso 8 X(3) es el tercer elemento en este caso 9 Para crear un vector columna: >> y = [8; 12; 30] y= 8 12 30
45
13.1.- Creación de un Vector usando un valor inicial, valor final y el incremento
Variable = [vi: incremento: vf] Ejemplos: >> a = [1:2:15] a= 1
3
5
7
9
11
13
15
>> b = [1:0.1:2] b= 1.0000 2.0000
1.1000
1.2000
1.3000
1.4000
1.5000
1.6000
1.7000
1.8000
1.9000
13.2.- Creación del vector Indicando el número de elementos y el valor inicial y final Variable = linspace(vi, vf, num_elementos)
Ejemplo: >> x=linspace(0,10,5) x= 0 2.5000 5.0000 7.5000 10.0000 13.3.- Creación de arreglos bidimensionales (matrices) Nombre_variable = [ elementos de la 1a fila; elementos de la 2 a fila; elementos de la 3a firla; … ; elementos de la última fila ]
Se pone un punto y coma después de cada línea
Se pulsa la tecla Intro después de Cada línea
46
Se visualizan los elementos
Se definen los elementos de la matriz a partir de distintas expresiones matemáticas
Para trabajar con los elementos individuales de una matriz se usa lo siguiente Nombre_matriz(índice_fila,índice_columna) En la matriz del ejemplo anterior: B(1,1) es igual a 11 B(1,2) es igual a 12 B(1,3) es igual a 13 B(2,1) es igual a 26 B(2,2) es igual a 22 B(2,3) es igual a 24 B(3,1) es igual a 31 B(3,2) es igual a 32 B(3,3) es igual a 33 13.3.1 Comandos zeros, ones y eye
Sintaxis: zeros(m,n) ones(m,n) eye(n)
Crea una matriz de m filas y n columnas, elementos ceros. Crea una matriz de m filas y n columnas, elementos unos. Crea una matriz de n filas y n columnas, elementos de la diagonal sonu unos y el resto de elementos ceros. (Matriz identidad)
47
13.4.- Operador de transposición
El operador de transposición, cuando se aplica a un vector, transforma la fila en columna y viceversa. Cuando se aplica a una matriz, éste transforma las filas en columnas y viceversa. Ejemplo: >> VF= [5 7 9] VF = 5 7 9 >> VC=VF' VC = 5 7 9 >> MA= [1 2 3 4; 5 6 7 8; 9 10 11 12] MA = 1 2 3 4 5 6 7 8 9 10 11 12 >> MB=MA' MB = 1 2 3 4
5 9 6 10 7 11 8 12
Define un vector fila VF
Define un vector columna VC A partir de la transpuesta de VF
Define una matriz MA con 3 filas Y 4 columnas.
Define una matriz MB con 4 filas Y 3 columnas. A partir de la transpuesta de la matriz MA
>> 48
13.5.- Manipulación de Arreglos
Los elementos dentro de un arreglo (vector o matriz) pueden ser manipulados individualmente o en grupo. Esto es especialmente útil cuando se necesita redefinir sólo algunos de los elementos para ser utilizados en cálculos específicos, o cuando un subgrupo de elementos se utiliza para definir una variable. 13.5.1.- Vectores
>> V=1:3:19 V= 1 4 7 10 13 16 19 >> V(5) ans =
Visualiza el quinto elemento
13 >> V (1) =2 V= 2
4
Define un vector V
Asigna un nuevo valor al primer elemento 7 10
13 16
19
>> V (5)^V(1)+sqrt(V(6)) ans =
Utilización de los elementos del vector en Operaciones matemáticas
173 >> 13.5.2.- Matrices
>> M=[3:6;linspace(10,40,4);15:-1:12] M= 3 4 5 6 10 20 30 40 15 14 13 12 >> M(2,3)=25 M= 3 4 5 6 10 20 25 40 15 14 13 12 >> M(2,4)-M(3,1) ans = 25 >>
Crea una matriz 3x4
Asigna un nuevo valor al elemento (2,3)
Utilización de los elementos de la matriz en operaciones matemáticas
49
13.6.- Utilización de los dos puntos (:) en la manipulación de arreglos
Los dos puntos se utilizan para acceder a un rango de elementos dentro de un vector o una matriz. Para vectores: VC(:)
se refiere a todos los elementos del vector VC
VC(m:n)
se refiere a los elementos comprendidos entre las posiciones m y n del vector VC.
Para matrices: M(:,n)
se refiere a los elementos de la columna n de la matriz M
M(n,:)
se refiere a los elementos de la fila n de la matriz M
M(:,n)
se refiere a los elementos de la columna n de la matriz M
M(:,m:n)
se refiere a los elementos entre las columnas m y n de la matriz M
M(m:n,:)
se refiere a los elementos entre las filas m y n de la matriz M
M(m:n,p:q)
se refiere a los elementos de la fila m a la n, y a los de la columna p a la q de la matriz M
Ejemplos: >> VC=10:10:90 VC = 10 20 30 40 50 60 70 80 90 >> NV=VC(3:7) NV = 30 40 50 60 70
Se crea el vector VC
Se crea un vector NV a partir de los elementos de las posiciones 3 a 7 del vector VC
>> MA=[1:2:11;2:2:12;3:3:18;4:4:24;5:5:30] Se define una matriz MA con 5 filas y 6 MA = columnas 1 3 5 7 9 11 2 4 6 8 10 12 3 6 9 12 15 18 4 8 12 16 20 24 5 10 15 20 25 30 >> A=MA(4,:) A = 4 8 12 16 20
24
Se define un vector fila A a partir de los elemento de la fila 4 de la matriz MA
50
>> B=MA(:,3) B= 5 6 9 12 15
Se define un vector columna B a partir de los elementos de la columna 3 de la matriz MA
>> C=MA(2:4,:) C= 2 4 6 8 10 12 3 6 9 12 15 18 4 8 12 16 20 24
Se define una matriz C a partir de los elementos de las filas 2 a 4 de la matriz MA
>> D=MA(3:5,4:6) D= 12 15 18 16 20 24 20 25 30
Se define una matriz D a partir de los elementos de las filas 3 a 5, columnas 4 a 6 de la matriz MA
13.7.- Adición de nuevos elementos a variables ya creadas Adición de elementos a un vector:
>> V=5:8 V= 5
6
Define un vector V con 4 elementos 7
8
>> V(5:10)=15:3:30 V= 5
6
7
Añade 6 elementos, empezando en la quinta posición
8 15
18 21 24 27 30
>> W=[10 11 12] W=
Define un vector W con 3 elementos
10 11 12 >> W(7)=13 W= 10
11
Asigna un nuevo valor al séptimo elemento 12
0
0
0
13
>> x(3)=14 x= 0
0 14
51
Adición de elementos a una matriz:
>> M=[11 12 13;14 15 16] M=
Define una matriz M de 2x3
11 12 13 14 15 16 >> M(3,:)=[1:3] M=
Añade el vector 1 2 3 a la tercera fila de M
11 12 13 14 15 16 1 2 3 >> N=eye(3) N= 1 0 0
0 1 0
Define una matriz N de 3x3
0 0 1 Crea una nueva matriz L resultado de añadir la matriz M y la matriz N. El número de filas de M y N deben coincidir.
>> L=[M N] L= 11 14 1
12 15 2
13 1 16 0 3 0
0 1 0
0 0 1
13.8.- Eliminación de elementos
>> X=[21 22 23 24 25 26 27] X=
Define un vector X de 7 elementos
21 22 23 24 25 26 27 Elimina el cuarto elemento
>> X(4)=[ ] X= 21 22 23 25 26 27 >> X(2:4)=[ ] X= 21 26 27
El vector tiene ahora 6 elementos
Elimina los elementos de las posiciones 2 a la 4. El vector tiene ahora 3 elementos
>> Y=[31 32 33 34;35 36 37 38;39 40 41 42] Y=
Define una matriz de 3x4
31 32 33 34 52
35 36 37 38 39 40 41 42 >> Y(:,2:3)=[ ] Y=
Elimina los elementos de las columnas 2 y 3.
31 34 35 38 39 42 13.9.- Funciones para la manipulación de arreglos
Matlab posee una amplia variedad de funciones para manipular arreglos. Función
Descripción
length(X)
Devuelve el numero de elementos de X
size(X)
Devuelve un vector fila [m,n] donde m y n representan el tamaño mxn del arreglo X
Ejemplo >> X=[1 2 3 4 5 6]; >> length(X) ans = 6 >> X=[4 6 8;7 9 11] X= 4 7
6 9
8 11
>> size(X) ans =
reshape(X,m,n) Reordena una matriz X, que tiene r filas y s columnas, a una matriz de m filas y n columnas. El valor de rxs debe ser igual al de mxn
2 3 >> X=[11 12 13;14 15 16] X= 11 14
12 15
13 16
>> Y=reshape(X,3,2) Y=
diag(x)
diag(X)
Cuando x es un vector, este comando crea una matriz cuadrada con los elementos de x en la diagonal
Cuando X es una matriz, este comando crea un vector a partir de los elementos de la diagonal X
11 15 14 13 12 16 >> x=[9 7 5]; >> diag(x) ans = 9 0 0 0 7 0 0 0 5 >> X=[15 14 13;9 8 7;4 3 2] X= 15
14
13
53
9 4
8 3
7 2
>> diag(X) ans = 15 8 2
Existen muchas más funciones, de las cuales se puede obtener información detallada utilizando la Ventana de Ayuda de Matlab. 13.10.- Cadena de caracteres y variables de tipo cadena
Una cadena es simplemente un arreglo de caracteres. Para crear una cadena solo es necesario teclear los caracteres que la f orman entre comillas simples. >> c='Hola que tal...' c= Hola que tal... >> C='My name is Walter Moreno' C= My name is Walter Moreno >> C(5) ans = a >> C(16) ans = e >> C(12:17)='Miguel' C=
Utilización de los dos puntos para asignar nuevos Caracteres a los elementos 12 al 17 del vector C
My name is Miguel Moreno La función char admite como parámetros de entrada las cadenas separadas por coma, según el siguiente formato: Nombre_variable = char (‘cadena1’, ‘cadena 2’, ‘cadena 3’,…, ‘cadena N’)
Ejemplo >> Info=char('Nombre del Profesor:','Walter Moreno','Curso:','MATLAB','UNT')
54
Info = Nombre del Profesor: Walter Moreno Curso: MATLAB UNT 14.- Operaciones matemáticas con arreglos 14.1.- Suma y resta
>> vect1=[7 9 3]; vect2=[5 6 4]; >> vect3=vect1+vect2 vect3 = 12
15
Se define dos vectores. Se define un vector vect3 que es igual a la suma vect1 + vect2
7
>> A=[10 11 12;19 18 17] A =
Se define dos matrices A y B de 2x3
10 11 12 19 18 17 >> B=[21 22 23;16 17 18] B= 21 22 23 16 17 18 >> A-B ans =
Se realiza la resta de matrices A-B
-11 -11 -11 3 1 -1 >> C=A+B C=
Se define una matriz C que es igual al resultado de la suma A + B
31 33 35 35 35 35 >> C-5 ans =
Se resta el número 5 de la matriz C
26 28 30 30 30 30 14.2.- Multiplicación de arreglos
55
Si M y N son dos matrices, la operación M*N se ejecuta solamente si el número de columnas de la matriz M es igual al número de filas de la matriz N. El resultado es una matriz que tiene el mismo número de filas que M y el mismo número de columnas que N. Ejemplo: >> M=[6 5 4;7 8 9;3 2 1] M= 6 5 4 7 8 9 3 2 1
Se define un matriz M de 3x3
>> N=[1 2;5 6;7 9] N= 1 2 5 6 7 9
Se define una matriz N de 3x2
>> P=M*N P= 59 78 110 143 20 27 >> Q=N*M ??? Error using ==> * Inner matrix dimensions must agree.
>> R=[5 6;3 2] R= 5 6 3 2
Se multiplica la matriz M por la matriz N y se asigna el resultado a la variable P
Se intenta multiplicar la matriz N por la matriz M la operación retorna un error, ya que el número de columnas de N es 2, y el número de filas de M es 3 Se definen dos matrices, R y S, de 2x2
>> S=[3 3;2 2] S= 3 3 2 2 >> R*S ans = 27 27 13 13 >> S*R ans = 24 24 16 16
Se multiplica R*S
Se multiplica S*R Como puede comprobarse, el resultado de multiplicar R*S no es el mismo que multiplicar S*R
56
El producto de la multiplicación de dos matrices cuadradas (deben ser del mismo tamaño) es también una matriz cuadrada del mismo tamaño. Sin embargo, la multiplicación de matrices no es conmutativa. Dos vectores pueden multiplicarse sólo si ambos tienen el mismo número de elementos. Es necesario que uno sea un vector fila y el otro un vector columna. La multiplicación de un vector fila y un vector columna da como resultado una matriz de 1x1, es decir, un escalar. Esto es lo que se denomina producto escalar de dos vectores. Matlab posee la función dot(a,b), que calcula el producto escalar de dos vectores. Ejemplo: >> X=[5 8 9] X= 5
8
Se define un vector fila X de tres elementos
9
>> Y=[1;2;3] Y=
Se define un vector columna Y de tres elementos
1 2 3 >> X*Y
Se multiplica X por Y. El resultado es un escalar
ans = 48 >> Y*X ans =
Se multiplica Y por X. El resultado es una matriz de 3x3.
5 8 9 10 16 18 15 24 27 La regla de multiplicación de matrices permite crear y resolver sistema de ecuaciones lineales. Por ejemplo: A11 Si tenemos las matrices A A21 A31
A12 A22 A32
A13
B11 A23 y B B21 B31 A33
B12
B32
B22
La matriz que se obtiene de la operación A*B tienen dimensión 3x2 y sus elementos son:
57
( A11B11 A12 B21 A13 B31 ) ( A11 B12 A12 B22 A13 B32 ) ( A B A B A B ) ( A B A B A B ) 22 21 23 31 21 12 22 22 23 32 21 11 ( A31B11 A32 B21 A33 B31 ) ( A31 B12 A32 B22 A33 B32 )
Ahora si tenemos el siguiente sistema de ecuaciones con tres incógnitas: A11 x1 A12 x2 A13 x3 B1 A21 x1 A22 x2 A23 x3 B2 A31 x1 A32 x2 A33 x3 B3
Se puede escribir como matrices de la siguiente forma: A11 A 21 A31
A12 A22 A32
A13 x1 B1
A33
A23
x B 2 2 x3 B3
Y en notación matricial: A11 AX B donde A A21 A31
A12 A22 A32
A13
x1 B1 A23 , X x2 y B B2 x3 B3 A33
14.3.- División de arreglos
La operación de división se puede explicar con al ayuda de otros dos conceptos relacionados con las operaciones de matrices: la matriz identidad y la operación de inversión o matriz inversa. Matriz identidad:
Es una matriz cuadrada en donde los elementos de la diagonal son unos y el resto de los elementos son ceros. La matriz identidad multiplicada por otra matriz (o vector) da como resultado la misma matriz original. Ejemplo: 1 0 0 1 0 0 5 5 4 7 9 4 7 9 12 8 23 0 1 0 12 8 23 o 0 1 0 7 7 0 0 1 0 0 1 9 9 3 9 1 1 0 0 3 9 1 o 6 8 4 0 1 0 6 8 4 2 7 5 0 0 1 2 7 5
Si una matriz A es cuadrada, ésta puede ser multiplicada por la matriz identidad I de derecha a izquierda o de izquierda a derecha: 58
AI = IA = A Inversa de una matriz:
Se dice que una matriz B es la inversa de una matriz A si al multiplicar ambas matrices el producto es la matriz identidad. Ambas matrices deben ser cuadradas, y el orden de la multiplicación puede ser AB o BA. BA = AB = I
Obviamente B es la inversa de A, y A es la inversa de B. Ejemplo: >> M=[2 1 4;4 1 8;2 -1 3] M= 2 4 2
1 1 -1
Se crea la matriz M
4 8 3
>> N=inv(M) N=
Se utiliza la función inv para calcular la inversa de M. El resultado se asigna a N
5.5000 -3.5000 2.0000 2.0000 -1.0000 0 -3.0000 2.0000 -1.0000 >> M*N ans = 1 0 0
0 1 0
El resultado de multiplicar M por N nos da la la matriz identidad 0 0 1
>> M*M^-1 ans = 1 0 0
0 1 0
Se calcula el inverso de M, elevando a esta matriz a -1. Además se multiplica por M, lo que nos da la matriz identidad 0 0 1
Determinantes:
El determinante esta asociada a las matrices cuadradas. Un determinante es una función que asocia un número, llamado determinante de la matriz, a cada matriz cuadrada M. El determinante se denota comúnmente por det (M) o |M|. El determinante se calcula a partir de una regla específica. Ejemplo:
59
m11
M
m21
m12
6 2 m11m 22 m12m21 , por ejemplo, 6.9 2.4 46 m22 4 9
El determinante de una matriz cuadrada se puede determinar con el comando det. División de arreglos:
Matlab posee dos tipos de división de arreglos: la división derecha y la división izquierda. División izquierda \:
Se emplea para resolver ecuaciones matriciales AX=B. En esta ecuación X y B son vectores columna. X=A\B División derecha /:
Se emplea para resolver ecuaciones matriciales XC=D. En esta ecuación X y D son vectores fila. X=D/C Ejemplo: 2 x 4 y 6 z 18 4 x 5 y 6 z 24 3 x y 2 z 4
2 4 6 x 18 4 5 6 y 24 3 1 2 z 4
>> A=[2 4 6;4 5 6;3 1 -2];
o
x
2 4 3 y z 4 5 1 18 24 4 6 6 2
Forma AX=B
>> B=[18;24;4]; >> X=A\B X= 4.0000 -2.0000 3.0000
Resolución X=A\B (División izquierda)
>> Xb=inv(A)*B Xb =
Resolución X=A-1B (utilizando inversa de A)
4.0000 -2.0000 3.0000 >> C=[2 4 3;4 5 1;6 6 -2];
Forma XC=D
60
>> D=[18 24 4]; >> Xc=D/C Xc =
Resolución X=D/C (División derecha)
4.0000 -2.0000 3.0000 Resolución X=DC-1 (utilizando inversa de C)
>> Xd=D*inv(C) Xd = 4.0000 -2.0000 3.0000
14.4.- Operaciones elemento a elemento
Las operaciones elemento a elemento se pueden realizar únicamente si los arreglos tienen el mismo tamaño. Para que las operaciones de multiplicación, exponenciación y división de arreglos se realicen elemento a elemento, en Matlab hay que teclear un punto delante del operador aritmético correspondiente. Símbolo .* .^ ./ .\
Descripción
Multiplicación Exponenciación División derecha División izquierda
Ejemplos: >> M=[1 2 3;4 5 6] M= 1 4
2 5
3 6
>> N=[7 8 9;2 4 6] N= 7 2
8 4
16 20
>> P=M./N P=
Define un arreglo N de 2x3
9 6
>> M.*N ans = 7 8
Define un arreglo M de 2x3
Multiplicación elemento a elemento de MxN 27 36 División elemento a elemento de M entre N El resultado se le asigna a la variable P 61
0.1429 0.2500 0.3333 2.0000 1.2500 1.0000 >> M.^2 ans =
Exponenciación elemento a elemento de M El resultado es un arreglo en el cada elemento es el correspondiente de M elevado a 2.
1 4 9 16 25 36 >> M*N M y N no pueden ser multiplicados, ya que el ??? Error using ==> * número de columnas de M no es igual al número Inner matrix dimensions must agree. de filas de N Las operaciones elemento a elemento son muy útiles para calcular el valor de una función pasándoles distintos valores de sus argumentos. Ejemplo: >> x=[1:5] x= 1
2
Se crea un vector con 5 elementos 3
4
5
>> y=x.^2-4*x
Se obtiene el vector y a partir del vector x
y=
operando elemento a elemento
-3
-4
-3
0
5
>> z=[1:2:15] z= 1
3
5
Se crea un vector con 8 elementos 7
9
11
>> Y=(z.^3+5*z)./(4*z.^2-10)
13
15 Se obtiene el vector y a partir del vector z
Y= -1.0000 1.6154 1.6667 2.0323 2.4650 2.9241 3.3964 3.8764 14.5.- Funciones predefinidas para trabajar con arreglos
Matlab posee un gran número de funciones predefinidas para trabajar con arreglos. Se listan algunas de estas funciones. Función mean(A)
Descripción Si A es un vector, retorna el valor medio de los elementos
Ejemplo >> A=[4 6 8 7]; >> mean(A) ans = 6.2500
62
C=max(A)
Si A es un vector, C contendrá el Elemento mayor de A. Si A es una Matriz, C contendrá un vector fila Que representa el elemento mayor De cada columna [d,n]=max(A) Si A es un vector, d contendrá el Elemento mayor de A, y n la posición Del elemento (la posición de la primera Aparición, si el mayor valor se repite Varias veces en el vector) min(A) Lo mismo que max(A), pero para el Elemento menor [d,n]=min(A)
Lo mismo que [d,n]= max(A), pero para el elemento menor
sum(A)
Si A es un vector, calcula la suma de Sus elementos
sort(A)
Si A es un vector, devuelve el mismo Vector ordenado en orden ascendente
median(A)
Si A es un vector, devuelve el valor de la mediana de los elementos del vector. Si A es un vector, devuelve la desviación estándar de los elementos del vector. Devuelve el valor del determinante de la matriz cuadrada A
std(A) det(A) dot(a,b)
Calcula el producto escalar de dos vectores a y b. Los vectores pueden ser de tipo fila o columna.
cross(a,b)
Calcula el producto cruzado de dos vectores a y b, (axb). Ambos vectores deben tener 3 elementos
inv(A)
Devuelve la inversa de una matriz cuadrada A
>> A=[4 8 1 6 3 21 13 58]; >> C=max(A) C= 58 >> A=[4 8 1 6 3 21 13 58]; >> [d,n]=max(A) d= 58 n= 8 >> A=[4 6 8 7]; >> min(A) ans = 4 >> A=[4 6 8 7]; >> [d,n]=min(A) d= 4 n= 1 >> A=[4 6 8 7]; >> sum(A) ans = 25 >> A=[4 6 8 7]; >> sort(A) ans = 4 6 7 8 >> A=[4 6 8 7]; >> median(A) ans = 6.5000 >> A=[4 6 8 7]; >> std(A) ans = 1.7078 >> A=[4 6 ;8 7]; >> det(A) ans = -20 >> a=[4 6 8 7]; >> b=[1 2 3 4]; >> dot(a,b) ans = 68 >> a=[4 6 8]; >> b=[1 2 3]; >> cross(a,b) ans = 2 -4 2 >> A=[4 6 8;7 2 1;1 1 1]; >> inv(A) ans = 0.1250 0.2500 -1.2500 -0.7500 -0.5000 6.5000 0.6250 0.2500 -4.2500
63
14.6.- Números aleatorios
Matlab posee dos comandos: rand y randn, que pueden ser utilizados para asignar números aleatorios a variables. 14.6.1.- El comando rand:
Este comando genera números aleatorios distribuidos uniformemente entre 0 y 1. Se puede utilizar para asignar números a escalares, vectores o matrices. Ejemplo: Comando rand
Descripción Genera un número aleatorio entre 0y1
rand(1,n)
Genera un vector fila de n números aleatorios entre 0 y 1 Genera una matriz n x n de números aleatorios entre 0 y 1
rand(n)
rand(m,n)
Genera una matriz m x n de números aleatorios entre 0 y 1
Ejemplo >> rand ans = 0.9501 >> a=rand(1,4) a= 0.2311 0.6068 0.4860 0.8913
>> b=rand(3) b= 0.7621 0.8214 0.7919 0.4565 0.4447 0.9218 0.0185 0.6154 0.7382 >> c=rand(2,4) c= 0.1763 0.9355 0.9355 0.4103 0.0579 0.4057 0.9169 0.9169 0.8936 0.3529
randperm(n) Genera un vector fila con n elementos >> randperm(5) Que son permutaciones aleatorias de ans = 2 3 5 4 Enteros entre 1 y n
1
Para obtener números aleatorios que se distribuyan en un intervalo (a, b) sólo es necesario multiplicar el resultado de rand por (b - a), y añadir el producto a a. (b – (b – a)*rand a)*rand + a
Ejemplo Crear un vector de 8 elementos con números aleatorios entre -2 y 10. >> v=12*rand(1,8)-2 v= 9.2256 9.0029 2.9232 8.7238 -1.3053 2.2344 7.7580 -1.8817 Para números enteros aleatorios se utiliza la función de redondeo. Ejemplo Crear una matriz de 3 x 4 con números aleatorios enteros en un intervalo de 50 a 90 >> M=round(40*rand(3,4)+50) M=
64
56 74 51 87 58 61 80 69 58 58 68 67 14.6.2.- El comando randn:
Este comando genera números aleatorios con distribución normal, es decir, con media 0 y desviación típica o estándar 1. Este comando se puede utilizar para generar un solo número, así como un vector o una matriz de números de este tipo. Ejemplo >> a=randn a= -0.4326 >> b=randn(1,5) b= -1.6656 0.1253 0.2877 -1.1465 1.1909 >> c=randn(3,2) c= 1.1892 0.1746 -0.0376 -0.1867 0.3273 0.7258 La media y la desviación estándar de varios números se puede cambiar realizando operaciones matemáticas. Ejemplo, generar un vector de 15 números enteros con media 50 y desviación estándar 5. >> V=round(5*randn(1,15)+50) V= 47 61 49 51 55 50 50 46 51 43 54 58 47 54
56
14.7.- Programas con vectores
1.- Hacer un programa para ingresar n valores reales en un arreglo y los muestre en la pantalla, además reportar el mayor, el menor y el promedio. n=input('Numero de elementos del arreglo : '); for i=1:n fprintf(' x(%d) : ',i); x(i)=input('');
65
end fprintf('Vector ingresado :\n'); for i=1:n fprintf('%.2f\n',x(i)); end s=0; may=x(1); men=x(1); for i=1:n s=s+x(i); if x(i)>may may=x(i); else if x(i)
fprintf(' x(%d) : ',i); x(i)=input(''); end j=n; mitad=fix(n/2); for i=1:mitad temp=x(i); x(i)=x(j); x(j)=temp; j=j-1; end fprintf('Vector final :\n'); for i=1:n fprintf('%.2f\n',x(i)); end 4.- Programa para ingresar 2 vectores de n elementos reales cada uno y reportar el producto escalar de ellos. n=input('Numero de elementos de los arreglos : '); disp('Primer arreglo') for i=1:n fprintf(' x(%d) : ',i); x(i)=input(''); end disp('Segundo arreglo') for i=1:n fprintf(' y(%d) : ',i); y(i)=input(''); end p=0; for i=1:n p=p+x(i)*y(i); end fprintf('El producto escalar es: %.3f\n',p); 5.- Programa para ingresar n elementos en un arreglo y luego reportarlo en la pantalla. Además ingresar un número y verificar si este se encuentra en el arreglo, si se encuentra reportar la posición donde se encontró y si no se encontró reportar "numero no se encuentra". n=input('Numero de elementos del arreglo : '); for i=1:n fprintf(' x(%d) : ',i); x(i)=input(''); end fprintf('Vector ingresado :\n'); for i=1:n fprintf('%.2f\n',x(i)); end 67
num=input('Ingrese el numero a buscar : '); pos=0; for i=1:n if x(i)==num pos=i; break end end if pos>0 fprintf('El numero se encuentra en la posicion: %d\n',pos); else fprintf('El numero no se encuentra'); end 6.- Programa para ingresar n elementos en un arreglo y luego reportarlo en la pantalla. Además ingresar un número y verificar si este se encuentra en el arreglo, si se encuentra cambiarlo por otro dato si no se encuentra reportar "dato no se encuentra" n=input('Numero de elementos del arreglo : '); for i=1:n fprintf(' x(%d) : ',i); x(i)=input(''); end fprintf('Vector ingresado :\n'); for i=1:n fprintf('%.2f\n',x(i)); end num=input('Ingrese el numero a buscar : '); pos=0; for i=1:n if x(i)==num pos=i; break end end if pos>0 fprintf('El numero se encuentra en la posicion: %d\n',pos); x(pos)=input('Ingrese nuevo dato'); fprintf('Nuevo arreglo\n'); for i=1:n fprintf('%.2f\n',x(i)); end else fprintf('El numero no se encuentra'); end 7.- Programa para ingresar n elementos en un arreglo y luego reportarlo en la pantalla. Además ingresar un numero y verificar si este se encuentra en el
68
arreglo, si se encuentra eliminarlo si no se encuentra reportar dato no se encuentra. n=input('Numero de elementos del arreglo : '); for i=1:n fprintf(' x(%d) : ',i); x(i)=input(''); end fprintf('Vector ingresado :\n'); for i=1:n fprintf('%.2f\n',x(i)); end num=input('Ingrese el numero a buscar : '); pos=0; for i=1:n if x(i)==num pos=i; break end end if pos>0 fprintf('El numero se encuentra en la posicion: %d\n',pos); for i=pos:n-1 x(i)=x(i+1); end n=n-1; fprintf('Nuevo Vector :\n'); for i=1:n fprintf('%.2f\t',x(i)); end else fprintf('El numero no se encuentra'); end 8.- Programa para ingresar n elementos en un arreglo y luego reportarlo en la pantalla. Además ingresar un número y la posición donde desea insertarlo e insertarlo en el arreglo, reportar el arreglo modificado. n=input('Numero de elementos del arreglo : '); for i=1:n fprintf(' x(%d) : ',i); x(i)=input(''); end fprintf('Vector ingresado :\n'); for i=1:n fprintf('%.2f\t',x(i)); end num=input('\nIngrese un numero : '); pos=input('Ingrese posicion : '); for i=n:-1:pos 69
x(i+1)=x(i); end x(pos)=num; n=n+1; fprintf('Nuevo Vector :\n'); for i=1:n fprintf('%.2f\t',x(i)); end 9.- Programa para ingresar n elementos en un arreglo y luego reportarlo en la pantalla. Además reportarlo ordenado ascendentemente. n=input('Numero de elementos del arreglo : '); for i=1:n fprintf(' x(%d) : ',i); x(i)=input(''); end fprintf('Vector ingresado :\n'); for i=1:n fprintf('%.2f\t',x(i)); end for i=1:n-1 for j=i+1:n if x(i)>x(j) temp=x(i); x(i)=x(j); x(j)=temp; end end end fprintf('\nVector ordenado de menor a mayor :\n'); for i=1:n fprintf('%.2f\t',x(i)); end 10.- Dada una colección de puntos (xi, yi), i=1,2,...,n, existe una recta L: y=Mx+B para la cual es mínima la suma de los cuadrados de las distancias de los puntos a la recta. Así, L constituye la recta mas próxima-con respecto a esta forma de calculo-a los puntos dados, y puede ser utilizada para estimar valores aproximados (x, y). Escriba un programa que permita hallar la recta de regresión asociada a una colección de datos. Usar las siguientes formulas: M=(N*SXY - SX*SY)/(N*SXX - SX*SX) B=(SXX*SY - SXY*SX)/(N*SXX - SX*SX) en donde: SX = X1 + X2 + ...+ Xn, SY = Y1 + Y2 + ...+ Yn, SXX = X1^2 + X2^2 + ...+ Xn^2, SXY = X1*Y1 + X2*Y2 + ...+ Xn*Yn.
70
clear all n=input('Numero de puntos : '); for i=1:n fprintf(' x(%d) : ',i); x(i)=input(''); fprintf(' y(%d) : ',i); y(i)=input(''); end sx=0;sy=0;sxy=0;sxx=0; for i=1:n sx=sx+x(i); sy=sy+y(i); sxx=sxx+x(i)*x(i); sxy=sxy+x(i)*y(i); end M=(n*sxy - sx*sy)/(n*sxx - sx*sx); B=(sxx*sy - sxy*sx)/(n*sxx - sx*sx); fprintf('El valor de M es: %.3f\n',M); fprintf('El valor de B es: %.3f\n',B); A=input('Ingrese la abcisa : '); O=M*A+B; fprintf('El valor de la ordena es: %.3f\n',O); Práctica Nº 3 Ejercicios de Vectores
1.- Programa para ingresar n valores reales en un vector y luego invierta el vector. 2.- Programa para ingresar 2 vectores de n elementos reales cada uno y reportar el producto escalar de ellos. 3.- Programa para ingresar n elementos en un vector y al final quede sin elementos repetidos 4.- Programa para ingresar n elementos en un vector y luego ingresar un elemento, si este se encuentra en el vector eliminarlo todas las veces que se encuentra. 5.- Ingresar n números en un vector y mostrar luego, primero la lista de los números pares que fueron ingresados y luego la lista de los números negativos 6.- Ingresar n enteros en un vector A y otros n enteros en un vector B y mostrar la lista de enteros del vector C. Donde cada C[i]=A[i]+B[i] 7.- Sea un vector de tipo real (de 15 elementos), encuentre el promedio de los húmeros enteros ingresados en el vector. 8.- Sea un vector de tipo real de n elementos. Mostrar la lista menores al promedio.
de enteros
71
9.- Lea dos vectores A y B y luego diga que elementos del vector A no se encuentran en B. 10.- Ingrese un número entero y conviértalo a binario Sugerencia: guarde cada residuo obtenido en una posición del vector. 11.- Ingresar N notas en un vector y determinar el porcentaje de aprobados y el porcentaje de desaprobados 12.- Ingresar n elementos en un vector y luego ingresar un elemento y reportar cuantas veces aparece ese elemento en el vector. 13.- Ingresar dos vectores y reportar si son iguales. 14.- Ingresar 2 vectores de n y m elementos y calcular la unión, intersección y la diferencia del primero con el segundo. 15.- Se tienen dos vectores ordenados y se desea unirlos en un tercero pero manteniendo los datos ordenados. 16.- La moda de un conjunto de datos es el elemento que mas se repite. Encuentre la moda de elementos almacenados en un vector. 17.- Calcule la mediana de un conjunto de datos. La mediana de un vector ordenado es el elemento central si el número de términos es impar. Y la semisuma de los términos centrales si el número de términos es par. 18.- Calcule la media armónica de un conjunto de datos. La media armónica se define como: el Inverso del promedio de los inversos. 19.- Calcule el promedio ponderado de un conjunto de datos. Se deben ingresar las cantidades con sus respectivos pesos. 20.- Ingrese los nombres y las notas de n alumnos y reportar una lista en orden alfabético y otra lista en orden de merito. 21.- Ingrese los nombres y las tallas de los jugadores de un equipo de fútbol y determine la talla promedio y el nombre del jugador más alto. 22.- En un concurso de belleza se tienen 10 candidatas, cada una de l as cuales es evaluada en tres criterios: belleza, personalidad y armonía física. Se necesita ingresar los nombres y tres puntajes de cada candidata y determinar: - El nombre de la ganadora de "mis personalidad" - El nombre de la ganadora de "el rostro más bello" - El nombre de la ganadora del concurso 23.- Escribir un programa que lea: Nombre, clase(N= nacional I= importado) y precio de n productos de librer¡a y los muestre en la pantalla, luego debe hacer los siguientes reportes:
72
a) Nombre y precios de los productos nacionales. b) Nombre y precios de los productos importados. c) Lista de productos con precio mayor o igual que 100 d) Lista de productos nacionales con precio <=200 e) Cuantos productos nacionales y cuantos productos importados se ingresaron. f) La suma de los precios de los productos nacionales. 24.- Escribir un programa que lea 2 listas de números enteros L1y L2, n y m elementos respectivamente y los imprima en pantalla. El programa debe permitir: - Unir la lista 2 al final de la lista 1. - Insertar la lista 2 en la lista 1 en una posición determinada. Al final debe imprimir la lista resultante. 14.8.- Programas con Matrices
M1.- Hacer un programa para generar una matriz de f filas y c columnas y calcular el mayor, el menor y el promedio. clear all f=input('Numero de filas de la matriz : '); c=input('Numero de columnas de la matriz : '); for i=1:f for j=1:c fprintf(' M(%d,%d) : ',i,j); M(i,j)=input(''); end end mayor=M(1,1); menor=M(1,1); s=0; for i=1:f for j=1:c s=s+M(i,j); if M(i,j)>mayor mayor=M(i,j); else if M(i,j)
73
M2.- Ingresar una matiz de f filas y c columnas y calcular la suma de filas y la suma de columnas clear all clc f=input('Numero de filas de la matriz : '); c=input('Numero de columnas de la matriz : '); for i=1:f for j=1:c fprintf(' M(%d,%d) : ',i,j); M(i,j)=input(''); end end M for i=1:f sf(i)=0; for j=1:c sf(i)=sf(i)+M(i,j); end end for j=1:c sc(j)=0; for i=1:f sc(j)=sc(j)+M(i,j); end end for i=1:f fprintf('La suma de la fila %d es : %.2f\n',i,sf(i)); end for j=1:c fprintf('La suma de la columna %d es : %.2f\n',j,sc(j)); end M3.- Ingresar una matriz de f filas y c columnas y calcular su matriz transpuesta. clear all f=input('Numero de filas de la matriz : '); c=input('Numero de columnas de la matriz : '); for i=1:f for j=1:c fprintf(' M(%d,%d) : ',i,j); M(i,j)=input(''); end end for i=1:f for j=1:c T(j,i)=M(i,j); end end 74
disp('Matriz transpuesta'); T M4.- Programa para ingresar dos matrices, una de f1 filas y c1 columnas y otra de f2 filas y c2 columnas y reportar su suma y su producto si es que se pueden realizar. clear all clc f1=input('Numero de filas de la primera matriz : '); c1=input('Numero de columnas de la primera matriz : '); for i=1:f1 for j=1:c1 fprintf(' M(%d,%d) : ',i,j); M(i,j)=input(''); end end f2=input('Numero de filas de la segunda matriz : '); c2=input('Numero de columnas de la segunda matriz : '); for i=1:f2 for j=1:c2 fprintf(' N(%d,%d) : ',i,j); N(i,j)=input(''); end end if f1==f2 & c1==c2 for i=1:f1 for j=1:c1 S(i,j)=M(i,j)+N(i,j); end end disp('La suma de las matrices es') S else disp('No se pueden sumar') end if c1==f2 for i=1:f1 for j=1:c2 P(i,j)=0; for k=1:c1 P(i,j)=P(i,j)+M(i,k)*N(k,j); end end end disp('El producto de las matrices es') P else disp('No se pueden multiplicar') end 75
Practica Nº 4 Ejercicios de Matrices
1.- Ingresar una matriz cuadrada de orden n y reportar si es simétrica. Recordar que una matriz es simétrica si se cumple la condición: a[i][j]=a[j][i] 2.- Programa para ingresar una matriz de f filas y c columnas, y que se haga lo siguiente: a) Ingresar un número de fila y eliminarla de la matriz. b) Ingresar un número de columna y eliminarla de la matriz. c) Ingresar un número de fila e insertar una fila en la matriz. d) Ingresar un número de columna e insertar una columna en la matriz. e) Intercambiar 2 filas de la Matriz. El número de las filas a intercambiar debe ingresarse. f) Intercambiar 2 columnas de la Matriz. El número de las columnas a intercambiar debe ingresarse. g) Ordenar las filas de una matriz h) Ordenar las columnas de una matriz 3.- El curso de Computación tiene n alumnos y se rinden 4 exámenes. Escribir un programa que reporte lo siguiente: a) El promedio de calificaciones de cada alumno. b) El promedio de cada Examen c) El alumno que obtuvo el mejor Promedio d) El examen que tuvo el mayor promedio de calificación. 4.- Hacer un programa para invertir las columnas de una matriz (Los elementos de la primera columna se intercambian con los de la ultima, los de la segunda con los de la penúltima y así sucesivamente). 5.- Escribir un programa que genere un cuadrado mágico. Un cuadrado mágico se representa por una matriz cuadrada de orden n, impar y contiene los números comprendidos entre 1 y n*n. En un cuadrado mágico la suma de cualquiera de las filas, columnas y diagonales principales siempre es la misma. El cuadrado mágico se genera aplicando el siguiente algoritmo: a) El primer numero 1 se coloca en la celda central de la primera fi la. b) El siguiente número se coloca en la celda de la fila anterior y columna posterior. c) La fila anterior al primero es el último. La columna posterior a la última es la primera. d) Si el número es un sucesor de un múltiplo de n, no aplique la regla 2. Coloque el número en la celda de la misma columna de la fila posterior. 6.- Hacer un programa para que coloque un 1 en las diagonales principales de una matriz cuadrada. El resto se debe completar con ceros. 7.- Hacer un programa que, al recibir los montos de ventas mensuales de cinco departamentos de una fábrica proporcione la siguiente información a) Las ventas mensuales de la fábrica incluido el monto anual.
76
b) El departamento que que tuvo la mayor mayor venta en el mes de Julio, incluyendo incluyendo el monto de la venta. c) El mes en el que que se obtuvieron obtuvieron las mayores y menores ventas del departamento I, donde I se debe ingresar. i ngresar. 8.- Hacer un programa para invertir las filas de una matriz (Los elementos de la primera fila se intercambian con los de la ultima, los de la segunda con los de la penúltima y así sucesivamente). 9.- Hacer un programa que al recibir una matriz cuadrada de orden impar. Determine si la misma se pude considerar un cuadrado Mágico.(En un cuadrado mágico la suma de cualquiera de las filas, f ilas, columnas y diagonales principales siempre es la misma). 10.- Hacer un programa que al recibir como dato una matriz , recorra esta matriz en forma de espiral. Tal como se muestra en la figura:
11.- Hacer un programa que al recibir recibir como dato una matriz recorra esta matriz columna a columna tal como se muestra en la figura.
12.- Programa que ingresa el orden de una Matriz cuadrada y generarla y luego hacer lo siguiente: a) Calcula la suma de los elementos de la diagonal principal. b) Calcula el promedio de los elementos de la diagonal secundaria. c) Calcula el mayor de los elementos de la matriz triangular inferior. d) Calcula el promedio de los elementos de la matriz triangular superior. e) Reporta solo las diagonales. f) Intercambia las diagonales. g) Invierte las diagonales. h) Reporta los elementos que están arriba y abajo de la diagonal principal.
77
i) Reporta los elementos que están arriba ar riba y abajo de la diagonal secundaria. 13.- Programa para ingresar una matriz mat riz de números enteros diferentes de cero de filas y c columnas y la acomode para que queden primero los números positivos y luego los números negativos 14.- Ingresar una matriz de f filas y c columnas y calcular el Mayor, y reportar todas las posiciones donde se encuentra el mayor. Y calcular el menor y reportar todas las posiciones donde se encuentra el menor 15.- Ingresar una matriz cuadrada y verificar si es una matriz Triangular inferior.
15.- Funciones 15.1.- Archivos de función
Los archivos de función se crean y editan como si se trataran archivos script. En el menú File, se selecciona New y luego M-file. 15.2.- Estructura de un Archivo de Función 15.2.1.- Línea de Definición de una función
La primera línea ejecutable de un archivo de función debe ser la definición de la propia función. En otro caso, el archivo será considerado como un archivo script normal. La Línea de definición de la función: Define que el archivo será tratado como un archivo de función. Define el nombre de la función Define el numero numero y orden de de los argumentos de entrada entrada y salida La forma que tiene la línea de definición es: function [argumentos de salida]= nombre_funcion(argum nombre_funcion(argumentos entos de entrada)
Si la función tiene más de un parámetro de entrada, estos se separan por comas y si tiene más de un parámetro de salida se escribe la lista separada por comas y entre corchetes ([ ]). Si solo hay un argumento de salida este se puede teclear sin corchetes. Para que funcione correctamente un archivo de función, a los argumentos de salida se les debe asignar valores durante la ejecución del código correspondiente al cuerpo de la función. Ejemplos: argumentos de entrada y 2 de salida function [a, b]=calculo(r,s,t) 3 argumentos function A= Rectarea(b,h)
2 argumentos de entrada y 1 de salida
78
function [V,S]=EsferaVolArea(rad) una variable de entrada y dos de salida 15.2.2.- La línea H1 y las líneas de texto de ayuda
La línea H1 y las líneas de texto de ayuda son líneas de comentarios a continuación de la línea de definición de la función. Aunque estas líneas son opcionales son muy útiles para proporcionar información sobre la función en si. Las líneas de texto de ayuda son líneas de comentarios que siguen a la línea H1. Estas líneas contienen una explicación de la función y cualquier descripción relacionada con sus argumentos de entrada y salida. Cuando el usuario coloca help nombre_funcion en la ventana de comandos se muestran estas líneas. Ejemplo: function A=RectArea(b,h) % funcion que calcula el area del rectangulo % Argumentos de entrada: % b: base del rectangulo % h: altura del rectangulo % Argumentos de salida % A: area del rectangulo A=b*h; >> help RectArea funcion que calcula el area del rectangulo Argumentos de entrada: b: base del rectangulo h: altura del rectangulo Argumentos de salida A: area del rectangulo 15.2.3.- Cuerpo de la función
El cuerpo de la función contiene el código que realiza las operaciones especificadas. El código puede contener cualquier comando en matlab. La Sentencia return
Normalmente se sale de una función cuando se llega al final de la misma. Una sentencia return puede ser usada para forzar a salir de la función sin llegar al final. Ejemplo: function d = det(A) if isempty(A) d = 1; return else ... end
79
15.3.- Ejercicios de funciones
1.- Escribir una función que convierta grados centígrados a grados Fahrenheit function far=conversion(cent)
% funcion que convierte grados centigrados a farenheit % Argumentos de entrada % cent: grados centigrados % Argumento de salida: % far= grados farenheit far= 9*cent/5+32; >> help conversion funcion que convierte grados centigrados a farenheit Argumentos de entrada cent: grados centigrados Argumento de salida: far= grados farenheit >> conversion(30) ans = 86 2.- Escribir una función que calcule el área de un circulo y la longitud de la circunferencia dado su radio function [ac,lc]=arLongCirc(r)
% Función que alcular el area del circulo y la longitud de la circunferencia % Argumento de Entrada: % r: radio % Argumento de salida: % ac: area del circulo % lc: longitud de la circunferencia ac=pi*r^2; lc= 2*pi*r; >> [ac,lc]=arLongCirc(3) ac = 28.2743 lc = 18.8496 3.- Escribir una función que calcule las dos raíces de una ecuación de segundo grado: ax 2+bx+c=0. a, b, y c son parámetros de entrada.
80
function [X1,X2]= raicesCuadratica(A,B,C)
% funcion que calcula las raices de una ecuacion cuadratica % Argumentos de Entrada: % A, B, C : coeficientes de la ecuacion % x1,x2: raices de la ecuacion D = B^2-4*A*C; X1=(-B + sqrt(D))/(2*A); X2=(-B - sqrt(D))/(2*A); >> [X1, X2]= raicesCuadratica(1,-8,15) X1 = 5 X2 = 3 4.- La presión atmosférica (p) varía en función de la altura (h) según la siguiente expresión: p=1035*e- 0.12h, donde la altura se mide en kilómetros y la presión en milibares. Escribir una función presión que calcule la presión para una altura dada. function p=presionAtm(h)
% Funcion que calcula la presion atmosferica en funcion de la altura % Argumentos de entrada: % h: altura en Kilometros % Argumento de Salida: % p : presion en milibars p=1035*exp(-0.12*h); >> presionAtm(10) ans = 311.7360 5.- Diseñar una función en MATLAB que calcule la superficie y volumen de un cilindro dados su radio (r) y altura (h) (V= πr 2h, S=2πr 2+2πrh). function [vc, ac]=volArCilindro(r,h)
% funcion que calcular el volumen y el area de un cilindro % argumentos de entrada: % r: radio % h:altura; % argumentos de salida % vc: volumen del cilindro % ac: area del superficial del cilindro 81
vc= pi*r^2*h; ac= 2*pi*r^2 + 2*pi*r*h; >> [vc, ac]=volArCilindro(1,5) vc = 15.7080 ac = 37.6991 6.- Sabiendo que la resistencia total de 3 resistencias conectadas en serie es: rT= r1 + r2 + r3 Y que si dichas resistencias se conectan en paralelo, entonces su resistencia total es: 1/rT = 1/r1 + 1/r2 + 1/r3 Escribir una función tal que dadas 3 resistencia total conectadas en paralelo y en serie
resistencias
calcule
su
function [rts, rtp] =resistenciaTotal(r1,r2,r3)
% funcion para calcular la resistencia total de 3 resistencias conectadas % en serie y en paralelo % Argumentos de entrada: r1, r2 y r3 % Argumentos de salidad: % rts: resistencia total en serie % rtp: resistencia total en paralelo rts = r1+r2+r3; w= 1/r1 + 1/r2+ 1/r3; rtp = 1/w; >> [rts, rtp] =resistenciaTotal(5,8,3) rts = 16 rtp = 1.5190 7.- Funcion para calcular el mayor de 3 números function m=mayor3(n1,n2,n3)
% funcion que calcular el mayor de 3 numeros % Argumentos de entrada: n1, n2, n3 numeros % Arguemnto de salida: m el numero mayor
82
m=n1; if n2>m m=n2; end if n3>m m=n3; end >> mayor3(18,10,25) ans = 25 8.- Función que reporta los divisores de un numero n function reporteDivisores(n)
% funcion que reporta los divisores de un numero n % Argumento de entrada: % n: numero entero for i=1:n if rem(n,i)==0 disp(i) end end >> reporteDivisores(68) 1 2 4 17 34 68 9.- Función que verifica si un número es primo function r=esPrimo(n)
% funcion que verifica si un numero es primo % argumento de entrada: n numero entero % arguemento de salida: r verdadero si es primo, falso si no lo es cd=0; for i=1:n if rem(n,i)==0 cd=cd+1;
83
end end if cd==2 r=1; else r=0; end >> esPrimo(17) ans = 1 >> esPrimo(68) ans = 0 10.- Verificar si un número es Perfecto function r=esPerfecto(n)
% funcion que verifica si un numero es perfecto % argumento de entrada: n numero entero % arguemento de salida: r=1 si es perfecto, r=0 si es f also sd=0; mitad=fix(n/2) for i=1:mitad if rem(n,i)==0 sd=sd+i end end if sd==n r=1; else r=0; end >> esPerfecto(6) ans = 1 >> esPerfecto(7) ans = 0
84
12.- Función para reportar todos los factores primos de un número. function reporteFactoresPrimos(n)
% Funcion que reporta los factores primos de un numero n % Arguemto de entrada: n numero entero % Salida: Los factores primos d=2; while n>1 if rem(n,d)==0 fprintf('%6d',d); n=n/d; else d=d+1; end end >> reporteFactoresPrimos(325) 5 5 13 >> reporteFactoresPrimos(96) 2 2 2 2 2 3 13.- Función que permite ingresar elementos en un vector function x=ingresoVector()
% función que permite el ingreso de un arreglo % Argumentos de salida: vector n=input('Numero de elementos:'); for i=1:n fprintf('elemento[%d]: ',i); x(i)=input(''); end >> A=ingresoVector Numero de elementos:3 elemento[1]: 5 elemento[2]: 8 elemento[3]: 9 A = 5
8
9
14.- Función que calcule el mayor de los elementos de un vector function m=mayorVector(x)
% funcion que calcula el mayor de los elementos de un arreglo % Argumentos de entrada: % x: vector de numeros reales
85
% Argumentos de salida: % m: mayor de los elementos del arreglo n=length(x); m=x(1); for i=1:n if x(i)>m m=x(i); end end >> x=[8 9 6 7 3] x= 8
9
6
7
3
>> mayorVector(x) ans = 9 15.- Función que calcula el promedio de los elementos de un vector function p=promedioVector(x)
% funcion que calcula el promedio de los elementos de un arreglo % Argumentos de entrada: % x: vector de numeros realeas % Argumentos de salida: % p: promedio de los elementos n=length(x); s=0; for i=1:n s=s+x(i); end p=s/n; 16.- Función para que ingrese los elementos de una Matriz function m=ingresoMatriz()
% funcion que permite el ingreso de un arreglo % Argumentos de salida: matriz con f y c columnas f=input('Numero de filas :'); c=input('Numero de columnas : '); for i=1:f for j=1: c fprintf('elemento(%d,%d): ',i,j);
86
m(i,j)=input(''); end end 17.- Función para calcular el mayor de los elementos de una matriz function may=mayorMatriz(A)
% Funcion que calcula el mayor de una matriz % Argumento de Entrada: A matriz % Argumento de Salida : may, mayor de la matriz [f c]=size(A); may=A(1,1); for i=1:f for j=1:c if A(i,j)>may may=A(i,j); end end end >> mayorMatriz([1 5 9;6 9 12;8 13 18]) ans = 18 >> M=[21 25 29;16 19 32;28 23 28] M= 21 25 29 16 19 32 28 23 28 >> mayorMatriz(M) ans = 32 18.- Función que calcula la suma de filas de una matriz function sf=sumaFilas(A)
% Función que calcula la suma de filas de la matriz % Argumento de Entrada: A, matriz % Argumento de Salida: sf, vector de suma de filas [f c]=size(A); for i=1:f sf(i)=0;
87
for j=1:c sf(i)=sf(i)+A(i,j); end end >> M M= 21 25 29 16 19 32 28 23 28 >> sumaFilas(M) ans = 75 67 79 19.- Función que calcula la suma de columnas de una matriz function sc=sumaColumnas(A)
% Función que calcula la suma de columnas de la matriz % Argumento de Entrada: A, matriz % Argumento de Salida: sc, vector de suma de columnas [f c]=size(A); for j=1:c sc(j)=0; for i=1:f sc(j)=sc(j)+A(i,j); end end >> M M= 21 25 29 16 19 32 28 23 28 >> sumaColumnas(M) ans = 65 67 89 20.- Programa para intercambiar dos filas de una matriz function R=intercambiaFilas(A,f1,f2)
88
% Funcion que intercambia las dos filas de una matriz % Argumento de Entrada: A, matriz % Argumento de Salida: R matriz con las filas intercambiadas temp=A(f1,:); A(f1,:)=A(f2,:); A(f2,:)=temp; R=A; >> M M= 21 25 29 16 19 32 28 23 28 >> intercambiaFilas(M,1,3) ans = 28 23 28 16 19 32 21 25 29 21.- Función para eliminar una fila de una matriz function R=eliminaFila(A,f)
% Funcion que elimina las fila de una matriz % Argumentos de Entrada: A, matriz; f, fila a eliminar % Arguemento de Salida : R matriz con las fila eliminada A(f,:)=[ ]; R=A; >> eliminaFila(M,2) ans = 21 25 29 28 23 28
89
Practica Nº 5 Ejercicios de Funciones
Empleando funciones realizar los siguientes ejercicios: 1.- Calcular la posición de la primera componente negativa de un vector pedido al usuario. 2.- Calcular cuantas componentes de una matriz son negativas, positivas y cero. 3.- Diseñar un algoritmo que permita almacenar las edades y nombres de un conjunto de personas. El usuario finalizará la introducción de datos tecleando una edad igual a cero, y seguidamente el algoritmo pedirá al usuario una edad para informarle acerca de cuantas personas tienen dicha edad y cuales son sus nombres. 4.- Pedirle al usuario un valor numérico que representa un importe en euros, e indicarle el número mínimo de billetes y monedas (cuantas y de que tipo) en que se puede descomponer. Ejemplo: 1.354,23 : 2 de 500, 1 de 200, 1 de 100, 1 de 50, 2 de 2, 1 de 0,20, 2 de 0,02 y 1 de 0,01. 5.- Calcular el número de cifras de un número entero n pedido al usuario. (NOTA: puede dividirse sucesivamente n entre 10, hasta alcanzar un cociente que valga cero). 6.- Diseñar un algoritmo que permita calcular la menor componente de un vector. Modificar el algoritmo para que también indique cual es su posición. 7.- Elaborar un algoritmo que permita calcular el NIF de un contribuyente. El resto de la división del DNI entre 23 proporciona la posición de la letra del NIF en la palabra 'RWAGMYFPDXBNJZSQVHLCKET'. NOTA: En DFD puede utilizarse la función substring(a, inicio, n), que devuelve n caracteres consecutivos de la cadena a, a partir del carácter situado en la posición que indica inicio. Por ejemplo, si a='hola', substring(a,2,3) Valdrá 'ola'. 8.- Diseñar un programa que calcule el producto de dos matrices pedidas al usuario. 9.- Diseñar un algoritmo que permita calcular la posición (fila y columna) de la mayor componente de una matriz pedida al usuario. 10.- Convertir a binario puro un número real en base 10 pedido al usuario. 11.- Diseñar un algoritmo que informe al usuario si una frase pedida al usuario es un palíndromo. Un palíndromo es una frase que se lee igual en los dos sentidos ('A torre da derrota', 'Dabale arroz a la zorra el abad'). Para simplificar, el usuario introducirá la frase en minúsculas, sin tildes ni espacios en blanco.
90
12.- Calcular si dos números enteros a y b son amigos. Se dice que a es amigo de b si a es igual a la suma de los divisores primos de b . A estos efectos, no se cuenta como divisor el propio número b . (Ejemplo: el 1 es amigo del 19, y también el 11 del 21). 13.- Usar la función anterior para diseñar un algoritmo que encuentre todos los números perfectos entre 0 y un número a pedido al usuario. (NOTA: un número es perfecto si es amigo de sí mismo). 14.- Dados tres valores numéricos, que expresan una fecha (día, mes y año), calcular la fecha siguiente, considerando la posibilidad de que el año sea bisiesto. 15.- Escribir un algoritmo que calcule el importe final a pagar por un cliente, dado el precio de venta al público (PVP) de un artículo. El importe final se calcula aplicando un descuento, nunca mayor del 20%, al PVP, y añadiéndole el 16% de IVA. El importe del artículo podrá estar en pesetas o euros, y el resultado se dará en ambas monedas. 16.- Escribir una función cod ifica(a, b) que guarde en b el complemento a 10 de a . (números de cuatro cifras). Construir la función inversa descodifica(a,b) . 17.- Escribir la función esprimo, definida como: 1 si n es primo esprimo(n)= 0 si n no es primo Utilizando dicha función, diseñar un programa que imprima todos los números primos menores que uno dado por teclado. 18.- Escribir una función de nombre reccil que convierta las coordenadas rectangulares de un punto a en coordenadas cilíndricas. Considerar que a es un vector de tres coordenadas: >> a=[1 1 1] >> reccil(a) >> ans = 1.7321 0.7854 1.0000 Corregir los errores de ejecución que se pudieran producir al probar la función con los puntos siguientes: [0 0 0], [0 0 1], [0 1 0] y [0 0 1]. Escribir, de forma análoga, la función inversa correspondiente cilrec. 19.- Construir una función espalíndromo (frase) que devuelva un 1 si la cadena de caracteres contenida en la variable frase es un palíndromo y un cero en
91
caso contrario. Considerar que el usuario pueda escribir espacios en blanco, tildes, mayúsculas y minúsculas. 20.- Diseñar un algoritmo para jugar al Mastermind. En dicho juego, un jugador A escribe un número de 4 cifras y otro jugador B intenta adivinarlo. No se permite que haya repeticiones en las cifras del número. A cada intento de B, A debe decirle cuantas cifras ha acertado y, de éstas, cuantas están correctamente colocadas. Ejemplo: Número secreto: 1234 Intento 1:
4321
4 correctas, 0 colocadas
Intento 2:
2143
4 correctas, 0 colocadas
Intento 3:
1243
4 correctas, 2 colocadas
Intento 4:
1234
4 correctas, 4 colocadas
21.- Diseñar una función MATLAB moda(x) que devuelva la moda (valor o valores que más veces se repita) de un vector x. 15.4.- Las funciones eval y feval La función eval (‘cadena de caracteres’) hace que se evalué como expresión de MATLAB el texto contenido entre comillas como argumento de la función. Este texto puede ser un comando, una formula matemática o en general una expresión válida de MATLAB. La función eval puede tener valores de retorno para recoger los resultados de la expresión evaluada.
Ejemplo 1
92
Ejemplo 2
Ejemplo 3
Por su parte la función feval sirve para evaluar, dentro de una función, otra función cuyo nombre se ha recibido como argumento. Por ejemplo, is dentro de una función se quiere evaluar la función calcular(A, b, c). donde el nombre calcular se envía como argumento en la cadena nombre, entonces feval (nombre, A, b,c). Ejemplo 4
93
16.- Graficas 2D 16.1. Funciones de la forma y = f (x) Para hacer gráficas de funciones de una variable con MatLab, primero tenemos que crear una tabla de valores de la variable para después dibujar la función. Por ejemplo, queremos dibujar la gráfica de la función y = sen(x): Primero creamos una tabla de valores para x >>x=0:pi/100:2*pi; Con este comando hemos formado una tabla (el vector x) con 200 valores entre 0 y 2 pi Otra forma de conseguir el mismo resultado sería utilizar el comando >>x=linspace(0,2*pi,200); Ahora calculamos los valores de y >> y = sin(x); y por ultimo la dibujamos (ver Figura 1) >>plot(x,y)
Figura 28: Grafica de y = sen(x).
94
Realmente lo que hemos hecho es dibujar 200 puntos de la función en el intervalo [0; 2¼], y posteriormente el programa los ha unido mediante segmentos. Si el numero de puntos es lo suficientemente grande, como en este caso, no se aprecian los vértices. Veamos un ejemplo algo más complicado. Queremos dibujar ahora la grafica de la función y = x*e –x^2. Definimos los valores para los que queremos hacer la grafica >>x=-3:.01:3; Es decir, que vamos a dibujar la grafica en el intervalo [-3,3] con un paso de longitud 0.01 Definimos la función >>y=x.*exp(-x.^2); Y por ultimo, se escribe el comando para que ejecute el dibujo (figura 2.) >>plot(x,y)
Figura 28: Grafica de y = x*e –x^2.
95
Figura 30. Grafica de y = x*e –x^2 con cuadrícula. - Cuadrícula. Si queremos que aparezca una cuadrícula sobre el dibujo, utilizaremos el comando >>grid on. El aspecto del dibujo será ahora como el de la figura 3. Para desactivar la cuadrícula habrá que escribir >>grid off . - Color y trazo. El comando plot ofrece múltiples posibilidades de color forma de trazo de la grafica. Por ejemplo, el comando:
y
>> plot(x,y,’r*’), nos dibujara la grafica en color rojo y con asteriscos. Para consultar todas las posibilidades, hacer >> help plot . - Ejes. Los ejes que aparecen por defecto en una grafica también se pueden modificar. Con el comando >>axis([-2 2 -1 1]), conseguiremos que la grafica aparezca en la región -2>axis square, conseguiremos que la figura aparezca en un cuadrado, sin cambiar el rango de los ejes. Con el comando >>axis equal , conseguiremos que los rangos de los ejes sean iguales. - Zoom. Utilizando el comando >>zoom on. Se puede agrandar la figura o alguna zona seleccionada de la figura. Hay que abrir la figura y utilizar los botones izquierdo y derecho del ratón. Para desactivarlo, habrá que escribir >>zoom off . - Varias graficas en la misma figura. Se pueden dibujar tanta graficas como se quieran en una misma figura. Si ya tenemos dibujada una, y generamos una nueva grafica, en principio la figura anterior es sustituida por la nueva. Sin embargo, utilizando el comando >> hold on, se
96
mantendrá la anterior, con todas sus propiedades, y se podrá dibujar encima una nueva. Para desactivar el comando anterior: >>hold off . Otra forma de hacerlo es dibujar desde el principio dos graficas juntas, por ejemplo, vamos a dibujar las graficas de las funciones y = sen(x) e y = sen(x + pi/3 ) en la misma figura (4): Generamos las tablas: >>x=linspace(0,2*pi,300); >>y=sin(x); >>z=sin(x+pi/3); Y ahora las dibujamos
Figura 31: Graficas de y = sen(x) y de y = sen(x + pi/3 ). >>plot(x,y,’r -’,x,z,’g--’),grid on (La primera en color rojo, con trazo continuo, y la segunda en verde, con trazo discontinuo). - Etiquetado de graficas. Existen diversas posibilidades para etiquetado de las graficas. Veámoslo con un ejemplo (ver figura 5):
el
>>x=linspace(-3,3,500);y=exp(-x.^2);z=2*exp(-x.^2); >>plot(x,y,’-’,x,z,’--’) % dibujamos dos funciones >>title(’Campanas de Gauss’) >>xlabel(’Eje de Abscisas’) % Etiqueta el eje horizontal >>ylabel(’Eje de Ordenadas’) % Etiqueta el eje vertical >>legend(’exp(-x^2)’, ’2*exp(-x^2)’) % Pone una leyenda
97
Figura 32: Etiquetado de graficas. Además de los comandos descritos antes para etiquetar graficas, existe la posibilidad de poner un texto en algún otro lugar de la figura. Con el comando >>gtext(’texto’), se abrirá la figura y podremos indicar con el ratón el lugar donde ha de ir el texto, que seleccionaremos con un clic. - Obtención de puntos desde el grafico. Una vez que se ha realiza- do una grafica, podemos necesitar conocer las coordenadas de algunos puntos de la misma. Por ejemplo, el lugar aproximado en el que están los máximos y mínimos, o si queremos añadir alguna recta o una poligonal al dibujo. Para conseguir esto, se puede utilizar el comando ginput . Escribiendo >>[x,y]=ginput(N) Donde N es el numero de puntos cuyas coordenadas queremos obtener. Después de ejecutado el comando habrá que pulsar con el botón izquierdo del ratón sobre el dibujo tantas veces como puntos hayamos especificado. Las coordenadas de esos puntos quedaran almacenadas en las variables [x, y]. Para dibujar graficas de funciones definidas a trozos, necesitamos utilizar lo que vamos a denominar índices o variables lógicas. Veamos un ejemplo. Creamos un vector con los números del 1 al 7 >>x=1:7 x = 1 2
3
4
5
6
7
98
Y ahora escribimos >>x>4 ans = 0 0
0
0
1
1
1
Observamos que donde no se cumple la condición, aparece 0 y donde se cumple, aparece 1. Para crear estas variables lógicas se pueden utilizar los siguientes operadores relacionales: < > <= >= == ~=
menor que mayor que menor o igual mayor o igual igual distinto
Estos operadores se pueden combinar utilizando los operadores lógicos: & y | o ~ no Asì, por ejemplo, sobre el mismo x de antes, si escribimos >>(2
0
1
1
1
1
0
Obtenemos unos en los valores que verifican 2 < x <6. Ahora supongamos que queremos representar la función
f (x) =
x^2 1 -x + 2
si x < 0 si 0 <= x < 1 si 1 <=x
Generamos una tabla valores en el dominio en el que queramos dibujar la función. >>x=linspace(-2,3,3000); Y ahora definimos la función, multiplicando cada trozo por el índice lógico que describa el lugar en el que queremos dibujarlo, >>y=(x.^2).*(x<0)+1.*((0<=x)&(x<1))+(-x+2).*(1<=x); Y ahora la dibujamos. Resulta conveniente hacerlo con puntos, asteriscos o cruces porque, de otra forma, no aparecerán las discontinuidades
99
>>plot(x,y,’.’),grid on,title(’Funcion definida a trozos’) Y obtenemos la grafica de la figura 6.
Figura 33: Una función definida a trozos. Ejercicios gráficos 1: Dibujar las graficas de las siguientes funciones eligiendo, en cada caso, una tabla de valores adecuada para que aparezcan los aspectos más representativos de la función: a) f (x) = x(x 2 + 4)2 b) f (x) = x – (x)1/2 c) f (x) = log x x d) f (x) =
x(x - 2)….. (x + 1)(x – 2)
e) f (x) = sen(1/x) f ) f (x) = x / ( e |x-1|) x2 si x<0 g) f (x) = -1 si x>=0
100
h) f (x) =
i) f (x) =
-x si x<-1 1 si 02 (1-x)1/2 si x<-1 1- x 2 si -11
16.2.- Curvas en paramétricas Veamos ahora como se pueden representar curvas en el plano dadas en forma parametrica, es decir, de la forma
r (t) = (x (t); y(t))
t Є [a; b]
Empecemos con un ejemplo: queremos dibujar la grafica de la curva
t (t 2 1) 2t (t 2 1) r (t ) 2 , 2 ; t 1 t 1
5 t 5
En primer lugar generamos los valores de t en el intervalo indicado, >>t=linspace(-5,5,1000); Y ahora lo podemos dibujar de dos formas distintas: >>plot((t.*(t.^2-1))./(t.^2+1),(2*(t.^2-1))./(t.^2+1))
Figura 34: Curva en paramétricas.
101
Obtendremos la grafica de la figura 7. Y otra forma de hacerlo es utilizar el comando >>comet((t.*(t.^2-1))./(t.^2+1),(2*(t.^2-1))./(t.^2+1)) Los dos comandos producen el mismo resultado, sin embargo, la forma de ejecución es diferente, la segunda es mas divertida, aparece un circulito (el cometa) que va dibujando la curva. La velocidad de ejecución depende del numero de puntos que hayamos generado con el comando linspace. Dibujada una curva en paramétricas existe la posibilidad de dibujar sobre la misma los vectores velocidad, utilizando el comando quiver . Por ejemplo, para dibujar los vectores velocidad sobre la curva r(t) = (cos(t); sen(t)) ;
t
Є[0,2pi]
>>t=linspace(0,2*pi,20); >>quiver(cos(t),sin(t),-sin(t),cos(t)),axis square Produce la grafica de la figura 8. La sintaxis del comando es >>quiver(r(t),r’(t)). El número de vectores que aparecen en este caso es 20. Si el numero de puntos que se indica con el comando linspace es demasiado grande, puede que no se aprecie con claridad cla ridad la l a grafica, gr afica, ya que este será el numero n umero de vectores que se dibujen.
Figura 35: Vectores 35: Vectores velocidad sobre una circunferencia.
102
Ejercicios gráficos 2: Dibujar las curvas c urvas en e n paramétricas paramé tricas siguientes; en los apartados a) y b), dibujar dibuj ar además los vectores vectore s velocidad, utilizando el comando quiver : a ) r (t ) ( 2 cos 3 t, 2sen 3t ); b) r (t ) (3sent , 2sen( 2t ));
t t
t t 2 t 2 t 2 c ) r (t ) 12 9 , 1 16 2 ; 3 t 3 3 t d ) r (t ) cos t (cos t 1), 2sen(2t) ; 2 e) r (t ) sen( 2t ) sent cos( 2t ) cos t ; t t 4t f ) r (t ) e sen( 2t ), e 4 cos( 2t ) ; 7t 2 7 2 g ) r (t ) t cos( ), ), tsen( ) ; 2 3 2 3 22 11 h) r (t ) t sen(3t ), cos(3t ) ; 10 10
t t 3 t 3
16.3.- Curvas en polares Una curva en coordenadas polares es la imagen de la función r h( ),
1 , 2
Un punto de la curva en polares (r 0 , 0 ) tiene distancia al origen r 0 y el ángulo que forma el vector de posición del punto con el eje horizontal, medido en sentido positivo, es θ0. Por lo tanto, la relación entre las coordenadas polares y las coordenadas paramétricas es x = r cos (θ) (θ) y = r sen (θ) (θ) Para dibujar una curva en polares con Matlab se utiliza el comando polar. Por ejemplo, para dibujar la grafica de r 2 4co 4cos( ),
Generamos los valores del ángulo tetha >>tetha=linspace(-pi,pi,100);
103
Calculamos los valores de r >>r=2-4*cos(tetha);
Figura 36: Curva 36: Curva en polares. Y dibujamos la grafica >>polar(tetha,r) Ejercicios gráficos 3: Dibujar las la s graficas de las siguientes funciones, fun ciones, dadas en coordenadas polares: a ) r 7 7 sen( );
d ) r cos(8 );
e) r 5 cos(2 ) ;
b) r 3 6sen( ); c) r sen(6 );
16.4.- Cambios de coordenadas polares-cartesianas polares-cartesianas Hay dos comandos que permiten hacer cambios de coordenadas. Si queremos cambiar de coordenadas polares a coordenadas cartesianas hay que utilizar el comando
104
>>[x,y]=pol2cart(theta,r); Esto es, suponiendo que los puntos en coordenadas polares estén previamente almacenados en las variables theta y r. Los puntos ahora obtenidos se podrán dibujar utilizando el comando plot . Para hacer el cambio de coordenadas cartesianas a coordenadas polares, habrá que utilizar >>[theta,r]=cart2pol(x,y); Ejercicios gráficos 4: En los ejemplos del ejercicio anterior, utilizar el comando pol2cart para cambiar las coordenadas polares obtenidas a coordenadas cartesianas. Usar después el comando plot para obtener las graficas en las nuevas coordenadas. 17.- Métodos Numéricos en MatLab 17.1.- Solución de Ecuaciones no lineales de una variable
Para los métodos de bisección, regla falsa, secante, newton y punto fijo se utilizara la funcion siguiente: f(x) = 2x 2-x-5 function y=f(x)
y= 2*x^2-x-5; 17.1.1.- Método de la bisección function raiz=Biseccion(a,b)
error=0.0005; k=0; fxa=f(a); fxb=f(b); if fxa*fxb<=0 while abs(b-a)/2>error m=(a+b)/2; fprintf('%5d%10.5f%10.5f%10.5f\n',k,a,b,m); k=k+1; fxm=f(m); if fxa*fxm<=0 b=m; fxb=fxm; else a=m; fxa=fxm; end end raiz=m; else fprintf('cambiar limites'); end
105
Ejecución del Programa
>> biseccion(1,2) 0 1.00000 2.00000 1 1.50000 2.00000 2 1.75000 2.00000 3 1.75000 1.87500 4 1.81250 1.87500 5 1.84375 1.87500 6 1.84375 1.85938 7 1.84375 1.85156 8 1.84766 1.85156 9 1.84961 1.85156 ans = 1.8506
1.50000 1.75000 1.87500 1.81250 1.84375 1.85938 1.85156 1.84766 1.84961 1.85059
17.1.2.- Método de la Regla falsa function raiz=reglafalsa(a,b)
cc=0.001; ce=0.001; n=50; exito=0; k=0; while k0 a=m; end if f(a)*f(m)<0 b=m; end end end end if(exito==0)
106
fprintf('no se puede hallar la raiz'); end Ejecución del Programa
>> reglafalsa(1,2) 1 1.00000 2.00000 -4.00000 0.32000 2 1.80000 2.00000 -0.32000 0.01469 3 1.84848 2.00000 -0.01469 0.00066 ans =
1.00000
1.80000 -0.32000
1.00000
1.00000
1.84848 -0.01469
0.20000
1.00000
1.85068 -0.00066
0.15152
1.8507 17.1.3.- Método de Newton
Para este método además de la función f(x) se necesita también la derivada que es la que debemos colocar. function raiz=newton(x0)
error=0.001; NITER=50; exito=0; k=0; while k
107
Ejecución del Programa
>> newton(1) 1 1.00000 2 2.33333 3 1.90667 4 1.85172 ans = 1.8508
2.33333 1.90667 1.85172 1.85078
1.33333 0.42667 0.05494 0.00094
3.55556 0.36409 0.00604 0.00000
Otra Manera ingresando la función
f=input('Ingrese la Funcion: ','s'); df=input('Ingrese la derivada de la funcion :','s'); x0=input('Ingrese el valor Inicial x0: '); error=input('Ingrese el Error Maximo e : '); NITER=input('Numero maximo de iteraciones : '); exito=0; k=0; while k
108
Ejecución del Programa
>> newton1 Ingrese la Funcion: 2*x^2-x-5 Ingrese la derivada de la funcion :4*x-1 Ingrese el valor Inicial x0: 1 Ingrese el Error Maximo e : 0.001 Numero maximo de iteraciones : 50 1 1.00000 2.33333 1.33333 3.55556 2 2.33333 1.90667 0.42667 0.36409 3 1.90667 1.85172 0.05494 0.00604 4 1.85172 1.85078 0.00094 0.00000 La raiz aproximada es : 1.85078 17.1.4.- Método de la Secante
function raiz=secante(x0,x1) error=0.001; NITER=50; exito=0; k=0; while k
>> secante(1,2) 1 1.00000 2.00000 1.80000 0.20000 0.32000 2 2.00000 1.80000 1.84848 0.04848 0.01469 3 1.80000 1.84848 1.85082 0.00233 0.00024 ans = 1.8508
109
17.1.5.- Método del Punto Fijo
Calculo de una raíz de la ecuación 2x 2 – x -5 = 0 function y=g(x)
y= sqrt((x+5)/2); function raiz=puntofijo(x0)
error=0.0005; niter=50; exito=0; k=0; while k
>> puntofijo(1) 1 1.00000 2 1.73205 3 1.83467 4 1.84860 5 1.85049
1.73205 1.83467 1.84860 1.85049 1.85074
0.73205 0.10262 0.01393 0.00188 0.00025
ans = 1.8507 17.2.- Solución de n ecuaciones lineales con n incógnitas, calculo de matriz inversa y determinante de una matriz
Resolveremos el sistema 4x1 -9 x2 + 2x3 = 5 2x1 -4 x2 + 6x3 = 3 x1 - x2 + 3x3 = 4
110
17.2.1.- Método de Gauss con Pivoteo
function x=gausspivoteo(AA,b) [n n]= size(AA); x=zeros(n,1); A=[AA b']; n1=n+1; for i=1:n may=abs(A(i,i)); fila=i; for k=i+1:n if abs (A(k,i))>may may=abs(A(k,i)); fila=k; end end temp=A(i,:); A(i,:)=A(fila,:); A(fila,:)=temp; if A(i,i)==0 fprintf(' el sistema es singular, no tiene solución '); return end for k=i+1:n factor=A(k,i)/A(i,i); for j=i:n1 A(k,j)=A(k,j)-factor*A(i,j); end end end x(n)=A(n,n1)/A(n,n); for i=n-1:-1:1 suma=A(i,n1); for j=i+1:n suma=suma-A(i,j)*x(j); end x(i)=suma/A(i,i); end Ejecución del Programa
>> A=[4 -9 2;2 -4 6;1 -1 3]; >> b=[5 3 4]; >> x=gausspivoteo(A,b) x= 6.9500 2.5000 -0.1500
111
17.2.2.- Método de Gauss-Jordán para resolver un sistema de n ecuaciones con n incógnitas function x=gaussjordan(AA,b)
[n n]=size(AA); x=zeros(n,1); A=[AA b']; n1=n+1; for i=1:n may=abs(A(i,i)); fila=i; for k=i+1:n if abs (A(k,i))>may may=abs(A(k,i)); fila=k; end end temp=A(i,:); A(i,:)=A(fila,:); A(fila,:)=temp; if A(i,i)==0 fprintf(' el sistema singular, no tiene solucion '); return end factor=A(i,i); for j=i:n1; A(i,j)=A(i,j)/factor; end for k=1:n if k~=i piv=A(k,i); for j=i:n1 A(k,j)=A(k,j)-piv*A(i,j); end end end end for i=1:n x(i)=A(i,n+1); end Ejecución del Programa
>> A=[4 -9 2;2 -4 6;1 -1 3]; >> b=[5 3 4]; >> x=gaussJordan(A,b) x= 6.9500 2.5000 -0.1500
112
17.2.3.- Métodos Iterativos para el sistema de N ecuaciones con N incógnitas
Para estos aplicar estos métodos las matrices tienen que ser diagonalmente dominantes. Para el método de Jacobi y Seidel resolveremos el siguiente sistema: 4 x1 - x2 - x1 + 4 x2 - x3 - x2 + 4x3 - x4 - x3 + 4x4
= = = =
1 1 1 1
a) Método de Jacobi function x=jacobi(A,b)
% Datos % A = es la matriz % b = es el vector de la mano derecha % n = es el orden de la matriz % Resultados % x = vector solucion [n n]=size(A); x=zeros(n,1); y=zeros(n,1); error=0.0005; NTOL=50; k=0; fprintf('%5d',k); for m=1:n fprintf('%10.5f',x(m)); end while 1 flag=1; for i=1:n suma=0; for j=1:n if i~=j suma=suma+A(i,j)*x(j)/A(i,i); end end y(i)=b(i)/A(i,i)-suma; end k=k+1; fprintf('\n%5d',k); for i=1:n if abs(y(i)-x(i))>error
113
flag=0; end x(i)=y(i); fprintf('%10.5f',x(i)); end if (NTOL==k) | (flag==1) break; end end Ejecución del Programa
>> x=jacobi(A,b) 0 0.00000 0.00000 1 0.25000 0.25000 2 0.31250 0.37500 3 0.34375 0.42188 4 0.35547 0.44141 5 0.36035 0.44922 6 0.36230 0.45239 7 0.36310 0.45367 8 0.36342 0.45419 9 0.36355 0.45440 x= 0.3635 0.4544 0.4544 0.3635
0.00000 0.25000 0.37500 0.42188 0.44141 0.44922 0.45239 0.45367 0.45419 0.45440
0.00000 0.25000 0.31250 0.34375 0.35547 0.36035 0.36230 0.36310 0.36342 0.36355
b) Método de Seidel function x=seidel(A,b)
% Datos % A = es la matriz % b = es el vector de la mano derecha % n = es el orden de la matriz % Resultados % x = vector solucion [n n]=size(A); x=zeros(n,1); y=zeros(n,1); error=0.0005; NTOL=50; k=0; fprintf('%5d',k); for m=1:n fprintf('%10.5f',x(m)); end while 1
114
flag=1; for i=1:n suma=0; for j=1:n if i~=j suma=suma+A(i,j)*x(j)/A(i,i); end end y(i)=b(i)/A(i,i)-suma; if abs(y(i)-x(i))>error flag=0; end x(i)=y(i); end k=k+1; fprintf('\n%5d',k); for i=1:n fprintf('%10.5f',x(i)); end if (NTOL==k) | (flag==1) break end end Ejecución del Programa
>> A=[4 -1 0 0;-1 4 -1 0; 0 -1 4 -1;0 0 -1 4]; >> b=[1 1 1 1]; >> x=seidel(A,b) 0 0.00000 0.00000 0.00000 0.00000 1 0.25000 0.31250 0.32813 0.33203 2 0.32813 0.41406 0.43652 0.35913 3 0.35352 0.44751 0.45166 0.36292 4 0.36188 0.45338 0.45407 0.36352 5 0.36335 0.45436 0.45447 0.36362 6 0.36359 0.45451 0.45453 0.36363 x= 0.3636 0.4545 0.4545 0.3636 17.2.4.- Calculo de la matriz Inversa usando el Método de Jordan function x=inversaJordan(AA)
[n n]=size(AA); A=[AA eye(n)]; n1=2*n; for i=1:n may=abs(A(i,i));
115
fila=i; for k=i+1:n if abs (A(k,i))>may may=abs(A(k,i)); fila=k; end end temp=A(i,:); A(i,:)=A(fila,:); A(fila,:)=temp; if A(i,i)==0 fprintf(' el sistema singular, no tine solucion '); return end factor=A(i,i); for j=i:n1; A(i,j)=A(i,j)/factor; end for k=1:n if k~=i piv=A(k,i); for j=i:n1 A(k,j)=A(k,j)-piv*A(i,j); end end end end x=zeros(n,n); for i=1:n for j=n+1:n1 x(i,j-n)=A(i,j); end end Ejecución del Programa
>> A=[4 -9 2; 2 -4 6; 1 -1 3]; >> R=inversaJordan(A) R= 0.3000 -1.2500 2.3000 0 -0.5000 1.0000 -0.1000 0.2500 -0.1000 17.2.5.- Calculo del determinante de una matriz function y=determinante(A)
[n n]=size(A); for k=1:n if A(k,k)==0 r=k+1; while r<=n & A(r,k)==0
116
r=r+1; end if(r<=n) temp=A(k,:); A(k,:)=A(r,:); A(r,:)=temp; else fprintf('El sistema es singular no se puede resolver'); return; end end for i=k+1:n pivote=A(i,k)/A(k,k); for j=k:n A(i,j)=A(i,j)-pivote*A(k,j); end end end det=1; for i=1:n det=det*A(i,i); end y=det; Ejecución del Programa
>> A=[4 -9 2; 2 -4 6; 1 -1 3]; >> determinante(A) ans = -20 17.2.6.- Solución de un sistema de n ecuaciones con n incógnitas usando el método de kramer function y=obtener(A,n,b,col)
temp=A; for i=1:n temp(i,col)=b(i); end y=temp; kramer.m
clear n=input('Numero de ecuaciones: '); A=zeros(n,n);
117
b=zeros(n,1); for i=1:n for j=1:n fprintf('A(%d,%d):',i,j); A(i,j)=input(''); end fprintf('b(%d): ',i); b(i)=input(''); end temp=A; d=determinante(temp,n); fprintf('El determinante es : %f \n',d); for i=1:n temp=obtener(A,n,b,i); x(i)=determinante(temp,n)/d; end disp('La solucion es '); for i=1:n; fprintf('x(%d) : %f\n',i,x(i)); end Ejecución del Programa
>> kramer Numero de ecuaciones: 3 A(1,1):4 A(1,2):-9 A(1,3):2 b(1): 5 A(2,1):2 A(2,2):-4 A(2,3):6 b(2): 3 A(3,1):1 A(3,2):-1 A(3,3):3 b(3): 4 El determinante es : -20.000000 La solucion es x(1) : 6.950000 x(2) : 2.500000 x(3) : -0.150000 17.3.- Métodos de Interpolación de funciones 17.3.1.- Método de Lagrange function p=lagrange(x,y,x0)
% x arreglo donde van las x
118
% y arreglo donde van las y % x0 valor donde se desea interpolar n=length(x); L=zeros(n,1); for k=1:n prod1=1; prod2=1; for i=1:n if i~=k prod1=prod1*(x0-x(i)); prod2=prod2*(x(k)-x(i)); end end l(k)=prod1/prod2; end p=0; for k=1:n p=p+l(k)*y(k); end Ejecución del Programa
>> x=[0 1 3 6]; >> y=[-3 0 5 7]; >> lagrange(x,y,1.8) ans = 2.2176 17.3.2.- Método de Diferencias Divididas
function p=difDivNewton(x,y,x0); % x arreglo donde van las x % y arreglo donde van las f(x) % x0 valor donde se desea interpolar % Resultados % F tabla de diferencias divididas % p valor interpolado n=length(x); F=zeros(n,n); for i=1:n F(i,1)=y(i); end for j=2:n k=j-1; for i=1:n+1-j F(i,j)=(F(i+1,k)-F(i,k))/(x(i+j-1)-x(i)); end end
119
prod=1; suma=0; for j=1:n suma=suma+F(1,j)*prod; prod=prod*(x0-x(j)); end % tabla fprintf('\n x F[]\n'); fprintf('============'); for j=1:n fprintf('=========='); end fprintf('\n'); for i=1:n fprintf('%10.6f',x(i)); for j=1:n+1-i; fprintf('%10.6f',F(i,j)); end fprintf('\n'); end p=suma; fprintf('\nEl Valor de la funcion es : %f',p); Ejecución del Programa
>> x=[0 1 4 6]; >> y=[1 -1 1 -1]; >> difDivNewton(x,y,2) x F[] ==================================================== 0.000000 1.000000 -2.000000 0.666667 -0.166667 1.000000 -1.000000 0.666667 -0.333333 4.000000 1.000000 -1.000000 6.000000 -1.000000 El Valor de la funcion es : -1.000000 ans = -1 17.3.3.- Método de Neville
function p=Neville(x,y,x0) % Datos % x = es el vector x % y = es el vector f(x) % x0 = es el valor donde se va a evaluar el Polinomio % Resultados
120
% p = valor interpolado n=length(x); Q=zeros(n,n); for i=1:n Q(i,1)=y(i); end for i=2:n for j=2:i Q(i,j)= ((x0-x(i-j+1))*Q(i,j-1)-(x0-x(i))*Q(i-1,j-1))/(x(i)-x(i-j+1)); end end for i=1:n fprintf('\n'); for j=1:n if j<=i fprintf('%10.5f',Q(i,j)); end end fprintf('\n'); end p=Q(n,n) Ejecución del Programa
>> p=neville(x,y,2) 1.00000 -1.00000 -3.00000 1.00000 -0.33333 -1.66667 -1.00000 3.00000 0.33333 -1.00000 p= -1 17.4.- Método de Newton para ecuaciones multivariable function y=funcion(x)
fun(1,1) = 3*x(1) - cos(x(2)*x(3)) - 0.5; fun(2,1) = x(1)^2 - 625*x(2)^2; fun(3,1) = exp(-x(1)*x(2)) + 20*x(3) + (10*pi-3)/3; y=fun; function y=jacobiano(x)
jac(1,1) = 3; jac(1,2) = x(3)*sin(x(2)*x(3)); jac(1,3) = x(2)*sin(x(2)*x(3)); jac(2,1) = 2*x(1); jac(2,2) = -1250*x(2);
121
jac(2,3) = 0; jac(3,1) = -x(2)*exp(-x(1)*x(2)); jac(3,2) = -x(1)*exp(-x(1)*x(2)); jac(3,3) = 20; y=jac; Newton Multivariable
clear tolerancia=0.0001; n=3; disp('Valores del Punto Inicial'); for i=1:n fprintf('x(%d): ',i); x0(i)=input(' '); end ban=0; k=0; while ban==0 k=k+1; j=jacobiano(x0); inversajac=inv(j); negfuncion=-funcion(x0); prod=inversajac*negfuncion; temp= x0' + prod; x=temp'; suma=0; for i=1:n suma = suma+ (x(i)-x0(i))^2; end valor=sqrt(suma); if valor<=tolerancia disp('La solucion aproximada es '); x ban=1; else x0=x; end end Ejecución del Programa
>> newtonMultiv Valores del Punto Inicial x(1): 1 x(2): 1 x(3): 1 La solución aproximada es x= 0.5000 0.0200 -0.5231
122
18.- Optimización de Funciones 18.1.- Optimización de funciones de una sola Variable (Método de la Sección Dorada)
Un individuo ha invertido en acciones de cierta compañía durante los últimos 10 años. El valor de su cartera a lo largo del tiempo (dinero invertido más beneficios obtenidos, en miles) viene dado por la siguiente expresión (x en años) F(x) = (x-2)2.(1-2x) + 252x + 116
0<=x<=10
El individuo retira sus ingresos transcurridos los 10 años ¿ Cual hubiera sido realmente el mejor momento para haberlo hecho? ¿Cuánto pierde por no haberlo retirado en el momento óptimo? Solución function y=f(x)
y= ((x-2)^2)*(1-2*x)+252*x+116; Método de la sección dorada
clear all clc R=(sqrt(5)-1)/2; a = input('Valor de a : '); b = input('Valor de b : '); tol=0.001; i=0; while 1 i=i+1; d=R*(b-a); x1 = a+d; x2 = b-d; if f(x1) > f(x2) xopt=x1; else xopt=x2; end ea=(1-R)*abs((b-a)/xopt)*100; if ea <=tol disp('El x optimo es :'); disp(xopt); disp('El maximo de la funcion es : '); disp(f(xopt)); break; end; if f(x1)>f(x2)
123
a=x2; else b=x1; end end Corrida del Programa Valor de a : 0 Valor de b : 10 El x optimo es : 8.0000 El maximo de la funcion es : 1592.00 Resultados
El mejor momento para retirar hubiera sido a los 8 años, entonces si el Individuo lo retiro a los 10 años F(10)= 1420 Por lo tanto pierde optimo.
1592- 1420 = 172 por no haberlo retirado en el momento
18.2.- Método de Optimización para funciones multivariable a) Método usando el gradiente function y=f(x)
y=100*(x(2)-x(1)^2)^2 + (1-x(1))^2; function y=gradiente(x)
grad(1) = -400*(x(2)-x(1)^2)*x(1)-2+2*x(1); grad(2) = 200*x(2)-200*x(1)^2 y=grad; Multivariable Gradiente
clear error=0.000000001; lambda=0.001; n=2; fprintf('Punto inicial : \n'); for i=1:n fprintf('x(%d): ',i); x0(1,i)=input(' '); end exito=0; while exito==0 x = x0-lambda*gradiente(x0); dif=abs(f(x)-f(x0)); if dif <=error
124
fprintf('El xoptimo es :\n'); disp(x); fprintf('El minimo es : %10.6f\n',f(x)); exito=1; else x0=x; end end Ejecución del Programa
>> optimizacion01 Punto inicial : x(1): 2 x(2): 1 El xoptimo es : 0.9989 0.9978 El minimo es : 0.000001 >> b) Optimización usando el método de newton function y=f(x)
y=100*(x(2)-x(1)^2)^2 + (1-x(1))^2; function y=gradiente(x)
grad(1) = -400*(x(2)-x(1)^2)*x(1)-2+2*x(1); grad(2) = 200*x(2)-200*x(1)^2; y=grad; function y=hessiano(x)
hess(1,1) = -400*x(2) + 1200*x(1)^2+2; hess(1,2) = -400*x(1); hess(2,1) = -400*x(1); hess(2,2) = 200; y=hess; Algoritmo de Optimización de Newton
clear error=0.00000001; lambda=0.001; n=2; iter=0; fprintf('Punto inicial : \n'); for i=1:n fprintf('x(%d): ',i); x0(1,i)=input(' ');
125
end exito=0; while exito==0 iter=iter+1; h=hessiano(x0); ih=inv(h); x = x0-lambda*gradiente(x0)*ih; dif=abs(f(x)-f(x0)); % fprintf('El valor de f(x0) es : %10.6f y el de f(x) = %10.6f\n',f(x0),f(x)); if dif <=error fprintf('El xoptimo es :\n'); disp(x); fprintf('El minimo es : %10.6f\n',f(x)); exito=1; else x0=x; end end Ejecución del Programa
>> optiNewton Punto inicial : x(1): 2 x(2): 1 El xoptimo es : 1.0022 1.0045 El minimo es : 0.000005 >>
126