You are on page 1of 127

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.

Prompt

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 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 de doble precisión.

Algunos comentarios generales que siempre se 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 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 Infinito
NaN Not a Number
i,j 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 Valor de pi
long 3.14159265358979
short e 3.1416e+000
long e 3.14159265358979e+000
hex 400921fb54442d18
bank 3.14
+ +
rat 355/113
short 3.1416

Figura 3: Formatos de salida

4.- Comandos para mostrar datos

4.1 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 asigna un valor de 15 a la variable x

Se utiliza el comando disp para visualizar el contenido de la variable


x

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 Carácter de borrado
\t 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 Descripción


Para la bandera
- (signo menos) Justificación izquierda del número dentro del campo
+ (signo más) Visualiza el carácter de signo (+ o - ) delante del número
0 (cero) 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 exponencial en minúsculas

E Notación exponencial en mayúsculas

f Notación de punto fijo

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 Comentario
sin(x) Seno
cos(x) Coseno
tan(x) Tangente
asin(x) arco seno
acos(x) arco coseno
atan(x) arco tangente (devuelve un ángulo entre –pi/2 y +pi/2)
atan2(y, x) Devuelve un ángulo entre –pi y pi; se le pasan 2 argumentos,
proporcionales al seno y al coseno
sinh(x) seno hiperbólico
cosh(x) coseno hiperbólico
tanh(x) tangente hiperbólica
asinh(x) arco seno hiperbólico
acosh(x) arco coseno hiperbólico
atanh(x) arco tangente hiperbólica

log(x) logaritmo natural


log10(x) logaritmo decimal
exp(x) función exponencial
sqrt(x) raíz cuadrada
sign(x) 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
rem(x, y) resto de la división de x entre y
round(x) redondea hacia el entero mas próximo
fix(x) redondea hacia el entero más próximo a 0
floor(x) valor entero más próximo hacia menos infinito
ceil(x) valor entero más próximo hacia más infinito
gcd(x, y) máximo común divisor
lcm(x, y) mínimo común múltiplo
real(x) parte real

7
imag(x) parte imaginaria
abs(x) valor absoluto
angle(x) Á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.

if condicion1
instrucciones1
elseif condicion2
instrucciones2
elseif condicion3
instrucciones3
elseif condición4
instrucciones4

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

Practica Nº 2

1. Hacer un programa para que se ingrese 2 números y se reporte el mayor


de ellos.
2. Escriba un programa para determinar sí un número entero A es divisible
por otro B.
3. 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 C=0;
Y en el proceso
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 3 4 (n+1)
+ + + + ..... +
A A+B A + 2B A + 3B A + nB

2.- Escribir un programa que lea 3 números enteros positivos A, B, N>0,


calcule la sumatoria de:

1 2 3 4 (N+1)
- + - + .....
A A+B A + 2B 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! 4! (n+1)!
- + - + .....
A A+B A + 2B A + 3B A + nB

4.- Escribir un programa que calcule el valor del número "e" como la suma
de la serie:

1 1 1
e =  1/i = + + + .............
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:

X2 X3
1+ X+ + + ...............
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<X2. Se


debe calcular e imprimir el valor de f(x) para todos los valores de X ,
desde X=X1 hasta x=X2

X X2 X3 X4
f(x) = 1 + - + - + .....
3! 5! 7! 9!
La sumatoria termina cuando se tiene un término: | Xn/Y! | < 0.001.
7.- Escriba un programa que permita calcular el valor de f(x) para valores
desde X=X1 hasta X=X2.

X3 X5 X7 X9
f(x) = X + - + - + .....
3! 5! 7! 9!
Cada sumatoria termina cuando se tiene un término : | Xn/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)! (n-2)! (n-3)! 1!


- + - + ........
A A+B A+2B A+3B A+(n-1)B

9.- 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 3 4 5 n
+ + + + + ....... +
2 3 4 5 6 n+1
2.- 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.
6.- Escribir un programa que calcule e imprima el valor de los n términos de
la serie:

2, 1, 1, 2, 8, 64.......

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.
7.- 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 1 3 + 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 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000 1.8000 1.9000
2.0000

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 2a 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) Crea una matriz de m filas y n columnas,
elementos ceros.
ones(m,n) Crea una matriz de m filas y n columnas,
elementos unos.
eye(n) 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] Define un vector fila VF


VF =
5 7 9

>> VC=VF'
Define un vector columna VC
VC =
A partir de la transpuesta de VF
5
7
9

>> MA= [1 2 3 4; 5 6 7 8; 9 10 11 12] Define una matriz MA con 3 filas


MA = Y 4 columnas.
1 2 3 4
5 6 7 8
9 10 11 12

>> MB=MA'
MB = Define una matriz MB con 4 filas
Y 3 columnas. A partir de la
1 5 9 transpuesta de la matriz MA
2 6 10
3 7 11
4 8 12
>>

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 Define un vector V


V=
1 4 7 10 13 16 19

>> V(5)
ans = Visualiza el quinto elemento

13
>> V (1) =2 Asigna un nuevo valor al primer elemento
V=

2 4 7 10 13 16 19

>> V (5)^V(1)+sqrt(V(6))
Utilización de los elementos del vector en
ans =
Operaciones matemáticas
173

>>

13.5.2.- Matrices

>> M=[3:6;linspace(10,40,4);15:-1:12]
Crea una matriz 3x4
M=
3 4 5 6
10 20 30 40
15 14 13 12

>> M(2,3)=25
M= Asigna un nuevo valor al elemento (2,3)
3 4 5 6
10 20 25 40
15 14 13 12

>> M(2,4)-M(3,1)
ans = Utilización de los elementos de la matriz
en operaciones matemáticas
25
>>

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 Se crea el vector VC


VC =
10 20 30 40 50 60 70 80 90

>> NV=VC(3:7) Se crea un vector NV a partir de los elementos


NV = de las posiciones 3 a 7 del vector VC
30 40 50 60 70

>> MA=[1:2:11;2:2:12;3:3:18;4:4:24;5:5:30]
MA = Se define una matriz MA con 5 filas y 6
1 3 5 7 9 11 columnas
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,:) Se define un vector fila A a partir de los


A= elemento de la fila 4 de la matriz MA
4 8 12 16 20 24

50
>> B=MA(:,3)
B= Se define un vector columna B a partir
5 de los elementos de la columna 3 de la
6 matriz MA
9
12
15

>> C=MA(2:4,:) Se define una matriz C a partir de los


C= elementos de las filas 2 a 4 de la
2 4 6 8 10 12 matriz MA
3 6 9 12 15 18
4 8 12 16 20 24

>> D=MA(3:5,4:6) Se define una matriz D a partir de los


D= elementos de las filas 3 a 5, columnas
12 15 18 4 a 6 de la matriz MA
16 20 24
20 25 30

13.7.- Adición de nuevos elementos a variables ya creadas

Adición de elementos a un vector:

>> V=5:8
V= Define un vector V con 4 elementos

5 6 7 8

>> V(5:10)=15:3:30 Añade 6 elementos, empezando en la quinta posición


V=

5 6 7 8 15 18 21 24 27 30

>> W=[10 11 12] Define un vector W con 3 elementos


W=

10 11 12

>> W(7)=13
Asigna un nuevo valor al séptimo elemento
W=

10 11 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) Define una matriz N de 3x3


N=

1 0 0
0 1 0
0 0 1

>> L=[M N] Crea una nueva matriz L resultado de


L= añadir la matriz M y la matriz N. El número
de filas de M y N deben coincidir.
11 12 13 1 0 0
14 15 16 0 1 0
1 2 3 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

>> X(4)=[ ] Elimina el cuarto elemento


X=

21 22 23 25 26 27 El vector tiene ahora 6 elementos

>> X(2:4)=[ ] Elimina los elementos de las posiciones 2 a la 4.


X=

21 26 27 El vector tiene ahora 3 elementos

>> Y=[31 32 33 34;35 36 37 38;39 40 41 42] Define una matriz de 3x4


Y=

31 32 33 34

52
35 36 37 38
39 40 41 42

>> Y(:,2:3)=[ ] Elimina los elementos de las columnas 2 y 3.


Y=

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 Ejemplo


length(X) Devuelve el numero de elementos >> X=[1 2 3 4 5 6];
de X >> length(X)
ans =

6
size(X) Devuelve un vector fila [m,n] >> X=[4 6 8;7 9 11]
donde m y n representan el tamaño X=
mxn del arreglo X 4 6 8
7 9 11

>> size(X)

ans =

2 3
reshape(X,m,n) Reordena una matriz X, que tiene r >> X=[11 12 13;14 15 16]
filas y s columnas, a una matriz de X=
m filas y n columnas. El valor de rxs 11 12 13
debe ser igual al de mxn 14 15 16

>> Y=reshape(X,3,2)
Y=

11 15
14 13
12 16
diag(x) Cuando x es un vector, este >> x=[9 7 5];
comando crea una matriz cuadrada >> diag(x)
ans =
con los elementos de x en la diagonal
9 0 0
0 7 0
0 0 5
diag(X) Cuando X es una matriz, este >> X=[15 14 13;9 8 7;4 3 2]
comando crea un vector a partir de X=

15 14 13
los elementos de la diagonal X

53
9 8 7
4 3 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 forman 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 =

>> C(16)
ans =

>> C(12:17)='Miguel' Utilización de los dos puntos para asignar nuevos


C= 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]; Se define dos vectores.


>> vect3=vect1+vect2 Se define un vector vect3 que es igual
vect3 = a la suma vect1 + vect2

12 15 7

>> A=[10 11 12;19 18 17] Se define dos matrices A y B de 2x3


A=

10 11 12
19 18 17

>> B=[21 22 23;16 17 18]


B=

21 22 23
16 17 18

>> A-B Se realiza la resta de matrices A-B


ans =

-11 -11 -11


3 1 -1

>> C=A+B Se define una matriz C que es igual


C= al resultado de la suma A + B

31 33 35
35 35 35

>> C-5 Se resta el número 5 de la matriz C


ans =

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] Se define un matriz M de 3x3


M=
6 5 4
7 8 9
3 2 1

>> N=[1 2;5 6;7 9] Se define una matriz N de 3x2


N=
1 2
5 6
7 9

>> P=M*N Se multiplica la matriz M por la matriz N


P= y se asigna el resultado a la variable P
59 78
110 143
20 27

>> Q=N*M Se intenta multiplicar la matriz N por la matriz M


??? Error using ==> * la operación retorna un error, ya que el número
Inner matrix dimensions must agree. de columnas de N es 2, y el número de filas de M
es 3
>> R=[5 6;3 2]
R= Se definen dos matrices, R y S, de 2x2
5 6
3 2

>> S=[3 3;2 2]


S=
3 3
2 2

>> R*S Se multiplica R*S


ans =
27 27
13 13

>> S*R Se multiplica S*R


ans = Como puede comprobarse, el resultado de
24 24 multiplicar R*S no es el mismo que multiplicar
16 16 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] Se define un vector fila X de tres elementos


X=

5 8 9

>> Y=[1;2;3] Se define un vector columna Y de tres elementos


Y=

1
2
3

>> X*Y Se multiplica X por Y. El resultado es un escalar

ans =
48

>> Y*X Se multiplica Y por X. El resultado es una matriz


ans = 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 A12 A13   B11 B12 


Si tenemos las matrices A   A21 A22 
A23  y B   B21 B22 
 A31 A32 A33   B31 B32 

La matriz que se obtiene de la operación A*B tienen dimensión 3x2 y sus


elementos son:

57
 ( A11 B11  A12 B21  A13 B31 ) ( A11B12  A12 B22  A13 B32 ) 
( A B  A B  A B ) ( A B  A B  A B ) 
 21 11 22 21 23 31 21 12 22 22 23 32 

 ( A31 B11  A32 B21  A33 B31 ) ( A31B12  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 A12 A13   x1   B1 


A A22 A23  x   B 
 21  2  2
 A31 A32 A33   x3   B3 

Y en notación matricial:

 A11 A12 A13   x1   B1 


AX  B donde A   A21 A22   
A23  , X   x2  y B   B2 
 A31 A32 A33   x3   B3 

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] Se crea la matriz M


M=

2 1 4
4 1 8
2 -1 3

>> N=inv(M) Se utiliza la función inv para calcular


N= 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 El resultado de multiplicar M por N nos da la


ans = la matriz identidad

1 0 0
0 1 0
0 0 1

>> M*M^-1 Se calcula el inverso de M, elevando a esta


ans = matriz a -1. Además se multiplica por M, lo
que nos da la matriz identidad
1 0 0
0 1 0
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
m m12  6 2
M   11   m11m22  m12 m21 , por ejemplo,    6.9  2.4  46
 m21 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
3x  y  2 z  4

 2 4 6   x  18  2 4 3 
 4 5 6   y    24 z   4 5 1   18 24 4
     o x y
 3 1 2   z   4   6 6 2

>> A=[2 4 6;4 5 6;3 1 -2]; Forma AX=B

>> B=[18;24;4];

>> X=A\B Resolución X=A\B (División izquierda)


X=
4.0000
-2.0000
3.0000

>> Xb=inv(A)*B Resolución X=A-1B (utilizando inversa de A)


Xb =

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 Resolución X=D/C (División derecha)


Xc =

4.0000 -2.0000 3.0000

>> Xd=D*inv(C) Resolución X=DC-1 (utilizando inversa de 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] Define un arreglo M de 2x3


M=

1 2 3
4 5 6

>> N=[7 8 9;2 4 6] Define un arreglo N de 2x3


N=

7 8 9
2 4 6

>> M.*N Multiplicación elemento a elemento de MxN


ans =

7 16 27
8 20 36

>> P=M./N División elemento a elemento de M entre N


P= El resultado se le asigna a la variable P

61
0.1429 0.2500 0.3333
2.0000 1.2500 1.0000

>> M.^2 Exponenciación elemento a elemento de M


ans = 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] Se crea un vector con 5 elementos


x=

1 2 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] Se crea un vector con 8 elementos


z=

1 3 5 7 9 11 13 15

>> Y=(z.^3+5*z)./(4*z.^2-10) 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 Descripción Ejemplo


mean(A) Si A es un vector, retorna el valor >> A=[4 6 8 7];
medio de los elementos >> mean(A)
ans =
6.2500

62
C=max(A) Si A es un vector, C contendrá el >> A=[4 8 1 6 3 21 13 58];
Elemento mayor de A. Si A es una >> C=max(A)
C=
Matriz, C contendrá un vector fila 58
Que representa el elemento mayor
De cada columna
[d,n]=max(A) Si A es un vector, d contendrá el >> A=[4 8 1 6 3 21 13 58];
Elemento mayor de A, y n la posición >> [d,n]=max(A)
d=
Del elemento (la posición de la primera 58
Aparición, si el mayor valor se repite n=
Varias veces en el vector) 8
min(A) Lo mismo que max(A), pero para el >> A=[4 6 8 7];
Elemento menor >> min(A)
ans =
4
[d,n]=min(A) Lo mismo que [d,n]= max(A), pero >> A=[4 6 8 7];
para el elemento menor >> [d,n]=min(A)
d=
4
n=
1
sum(A) Si A es un vector, calcula la suma de >> A=[4 6 8 7];
Sus elementos >> sum(A)
ans =
25
sort(A) Si A es un vector, devuelve el mismo >> A=[4 6 8 7];
Vector ordenado en orden ascendente >> sort(A)
ans =
4 6 7 8
median(A) Si A es un vector, devuelve el valor >> A=[4 6 8 7];
de la mediana de los elementos del >> median(A)
ans =
vector. 6.5000
std(A) Si A es un vector, devuelve la >> A=[4 6 8 7];
desviación estándar de los elementos >> std(A)
ans =
del vector. 1.7078
det(A) Devuelve el valor del determinante de >> A=[4 6 ;8 7];
la matriz cuadrada A >> det(A)
ans =
-20
dot(a,b) Calcula el producto escalar de dos >> a=[4 6 8 7];
vectores a y b. Los vectores pueden >> b=[1 2 3 4];
>> dot(a,b)
ser de tipo fila o columna. ans =
68
cross(a,b) Calcula el producto cruzado de dos >> a=[4 6 8];
vectores a y b, (axb). Ambos vectores >> b=[1 2 3];
>> cross(a,b)
deben tener 3 elementos ans =
2 -4 2
inv(A) Devuelve la inversa de una matriz >> A=[4 6 8;7 2 1;1 1 1];
cuadrada A >> 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 Descripción Ejemplo


rand Genera un número aleatorio entre >> rand
0y1 ans =
0.9501
rand(1,n) Genera un vector fila de n números >> a=rand(1,4)
aleatorios entre 0 y 1 a=
0.2311 0.6068 0.4860 0.8913
rand(n) Genera una matriz n x n de números >> b=rand(3)
aleatorios entre 0 y 1 b=
0.7621 0.8214 0.7919
0.4565 0.4447 0.9218
0.0185 0.6154 0.7382
rand(m,n) Genera una matriz m x n de números >> c=rand(2,4)
aleatorios entre 0 y 1 c=
0.1763 0.9355 0.4103 0.0579
0.4057 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 1
Enteros entre 1 y n

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 – 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)<men
men=x(i);
end
end
end
p=s/n;
fprintf('El mayor es : %.2f\n',may);
fprintf('El menor es : %.2f\n',men);
fprintf('El promedio es : %.2f\n',p);

2.- Programa para ingresar n valores reales en un arreglo y calcular la


desviación estándar.

n=input('Numero de elementos del arreglo : ');


for i=1:n
fprintf(' x(%d) : ',i);
x(i)=input('');
end
s=0;
for i=1:n
s=s+x(i);
end
p=s/n;
sc=0;
for i=1:n
sc=sc+(x(i)-p)^2;
end
ds=sqrt(sc/(n-1));
fprintf('La desviacion estandar es : %.5f\n',ds);

3.- Programa para ingresar n valores reales en un arreglo y luego invierta el


arreglo.

n=input('Numero de elementos del arreglo : ');


for i=1:n

66
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 de enteros


menores al promedio.

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 las 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)<menor
menor=M(i,j);
end
end
end
end
prom=s/(f*c);
fprintf('El mayor es : %.2f\n',mayor);
fprintf('El menor es : %.2f\n',menor);
fprintf('El promedio es %.2f\n',prom);

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 fila.
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 tuvo la mayor venta en el mes de Julio, incluyendo
el monto de la venta.
c) El mes en el que se obtuvieron las mayores y menores ventas del
departamento I, donde I se debe ingresar.

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, 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 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 y abajo de la diagonal secundaria.

13.- Programa para ingresar una matriz 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 y orden de los argumentos de entrada y salida

La forma que tiene la línea de definición es:

function [argumentos de salida]= nombre_funcion(argumentos 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:

function [a, b]=calculo(r,s,t) 3 argumentos de entrada y 2 de salida

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: ax2+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 =

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=πr2h,
S=2πr2+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 resistencias calcule su


resistencia total conectadas en paralelo y en serie

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

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 =

>> esPrimo(68)

ans =

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 falso

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 =

>> esPerfecto(7)
ans =

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 =

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 codifica(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 y


forma de trazo de la grafica. Por ejemplo, el comando:

>>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<x<2 y -1<y<1.

Con >>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 el


etiquetado de las graficas. Veámoslo con un ejemplo (ver figura 5):

>>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<x)&(x<=6)
ans =

0 0 1 1 1 1 0

Obtenemos unos en los valores que verifican 2 < x <6.

Ahora supongamos que queremos representar la función

x^2 si x < 0
f (x) = 1 si 0 <= x < 1
-x + 2 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(x2 + 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
-x si x<-1
h) f (x) = 1 si 0<x<2
-x2 si x>2

(1-x)1/2 si x<-1
i) f (x) = 1- x2 si -1<x<1
(x -1)1/2 si x>1

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 ; 5  t  5
 t 1 t 1 

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 la grafica, ya que este será el numero de vectores que
se dibujen.

Figura 35: Vectores velocidad sobre una circunferencia.

102
Ejercicios gráficos 2: Dibujar las curvas en paramétricas siguientes;
en los apartados a) y b), dibujar además los vectores velocidad,
utilizando el comando quiver:

a ) r (t )  (2 cos3 t , 2 sen3t );   t  
b) r (t )  (3sent , 2 sen(2t ));   t  
 t   t 2     t 2   t 
2

c) r (t )   12    9  ,      116    2  ;  3  t  3
         
 
 
  
 
3 
d ) r (t )   cos t (cos t  1), 2 sen(2t )  ;  t 
2 
e) r (t )   sen(2t )  sent  cos(2t )  cos t  ;    t  
 4t t

f ) r (t )   e sen(2t ), e cos(2t )  ;
4
  t  
 
2 7t 2 7 
g ) r (t )   t cos( ), tsen( )  ;   t  
3 2 3 2 
 11 22 
h) r (t )   t  sen(3t ),  cos(3t )  ;  3  t  3
 10 10 

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 (r0 ,0 ) tiene distancia al origen r0 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  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 en polares.

Y dibujamos la grafica

>>polar(tetha,r)

Ejercicios gráficos 3: Dibujar las graficas de las siguientes funciones,


dadas en coordenadas polares:

a) r  7  7 sen( );     
b) r  3  6 sen( );     
c) r  sen(6 );     
d ) r  cos(8 );     
e) r  5cos(2 );     

16.4.- Cambios de coordenadas 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) = 2x2-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.50000
1 1.50000 2.00000 1.75000
2 1.75000 2.00000 1.87500
3 1.75000 1.87500 1.81250
4 1.81250 1.87500 1.84375
5 1.84375 1.87500 1.85938
6 1.84375 1.85938 1.85156
7 1.84375 1.85156 1.84766
8 1.84766 1.85156 1.84961
9 1.84961 1.85156 1.85059
ans =
1.8506

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 k<n & exito==0
k=k+1;
m=(a*f(b)-b*f(a))/(f(b)-f(a));
va1=abs(b-a);
va2=abs(f(m));

fprintf('%5d%10.5f%10.5f%10.5f%10.5f%10.5f%10.5f%10.5f%10.5f\n',k,a,b,f(a)
,f(b),m,f(m),va1,va2)
if va1<cc
exito=1;
raiz=m;
else
if va2<ce
exito=1;
raiz=m;
else
if f(a)*f(m)>0
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 1.00000 1.80000 -0.32000 1.00000
0.32000
2 1.80000 2.00000 -0.32000 1.00000 1.84848 -0.01469 0.20000
0.01469
3 1.84848 2.00000 -0.01469 1.00000 1.85068 -0.00066 0.15152
0.00066
ans =

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<NITER & exito==0
k=k+1;
x=x0-f(x0)/df(x0);
va1=abs(x-x0);
va2=abs(f(x));
fprintf('%5d%10.5f%10.5f%10.5f%10.5f\n',k,x0,x,va1,va2);
if va1<=error
raiz=x;
exito=1;
else
if va2<=error
raiz=x;
exito=1;
else
x0=x;
end
end
end
if exito==0
fprintf('No se encontro la raiz en 50 iteraciones');
end

107
Ejecución del Programa
>> newton(1)
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
ans =
1.8508

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<NITER & exito==0
k=k+1;
x=x0;
fx0=eval(f);
dfx0=eval(df);
x1=x0-fx0/dfx0;
va1=abs(x1-x0);
x=x1;
fx1=eval(f);
va2=abs(fx1);
fprintf('%5d%10.5f%10.5f%10.5f%10.5f\n',k,x0,x1,va1,va2);
if va1<=error
raiz=x1;
exito=1;
else
if va2<=error
raiz=x1;
exito=1;
else
x0=x1;
end
end
end
if exito==0
fprintf('No se encontro la raiz en 50 iteraciones');
else
fprintf('La raiz aproximada es : %10.5f',raiz);
end

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<NITER & exito==0
k=k+1;
x=(x0*f(x1)-x1*f(x0))/(f(x1)-f(x0));
va1=abs(x-x1);
va2=abs(f(x));
fprintf('%5d%10.5f%10.5f%10.5f%10.5f%10.5f\n',k,x0,x1,x,va1,va2);
if va1<=error
raiz=x;
exito=1;
else
if va2<=error
raiz=x;
exito=1;
else
x0=x1;
x1=x;
end
end
end
if exito==0
fprintf('No se encontro la raiz');
end

Ejecución del Programa


>> 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 2x2 – 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<niter & exito==0
k=k+1;
x=g(x0);
va=abs(x-x0);

fprintf('%5d%10.5f%10.5f%10.5f\n',k,x0,x,va);
if va<=error
exito=1;
raiz=x;
else
x0=x;
end
end

if exito==0
fprintf('no se pudo encontrar la raiz');
end

Ejecución del Programa


>> puntofijo(1)
1 1.00000 1.73205 0.73205
2 1.73205 1.83467 0.10262
3 1.83467 1.84860 0.01393
4 1.84860 1.85049 0.00188
5 1.85049 1.85074 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 = 1
- x1 + 4 x2 - x3 = 1
- x2 + 4x3 - x4 = 1
- x3 + 4x4 = 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 0.00000 0.00000
1 0.25000 0.25000 0.25000 0.25000
2 0.31250 0.37500 0.37500 0.31250
3 0.34375 0.42188 0.42188 0.34375
4 0.35547 0.44141 0.44141 0.35547
5 0.36035 0.44922 0.44922 0.36035
6 0.36230 0.45239 0.45239 0.36230
7 0.36310 0.45367 0.45367 0.36310
8 0.36342 0.45419 0.45419 0.36342
9 0.36355 0.45440 0.45440 0.36355
x=
0.3635
0.4544
0.4544
0.3635

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 1592- 1420 = 172 por no haberlo retirado en el momento
optimo.

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
Bibliografía

1. Luis Joyanes Aguilar. Fundamentos de Programación. McGraw-


Hill/Interamericana de España. 3ra Edición. 2003
2. Luis Joyanes Aguilar, Matilde Fernández Azuela, Lucas Sánchez García,
Ignacio Zahonero Martínez. Estructura de Datos en C. McGraw-
Hill/Interamericana de España. 1era Edicion. 2005.
3. Félix García Caballeira, Alejandro Calderón Mateos, Jesús Carretero
Pérez, Javier Fernández Muñoz, José Pérez Menor. Problemas
resueltos de Programación en Lenguaje C. Thomson Editores. 1era
Edición. 2003.
4. Osvaldo Cairó. Metodología de Programación. Editorial Alfaomega. 3era
Edición. 2005
5. Francisco Javier Ceballos. Programación en C++. Editorial Alfaomega.
3ra Edición. 2004.
6. Osvaldo Cairó. Fundamentos de Programación, Piensa en C.
Pearson/Prentice Hall. 1era Edición. 2006
7. Harver M. Deitel, Paul J. Deitel. C++ como programar. Pearson/Prentice
Hall. 4ta Edición. 2003
8. Luis Joyanes Aguilar. C++ a su alcance. Mc Graw-Hill. 1era Edición.
1995

127

You might also like