% Activate the following line by filling in the right side. If for example the name of the root file is Main.tex, write
% "...root = Main.tex" if the chapter file is in the same directory, and "...root = ../Main.tex" if the chapter is in a subdirectory.
 
%!TEX root = ../Metodos_Numericos.tex  

\chapter[Introducción]{Introducción a la Programación en Matlab}

\section{Introducción (Variables y Operadores)}

\subsection{Introducción}

 Matlab puede considerarse como un lenguaje de programación tal como C, Fortran, Java, etc. Algunas de las características de Matlab son:
 
\begin{itemize}
\item La programación es mucho mas sencilla.
\item  Hay continuidad entre valores enteros, reales y complejos.
\item La amplitud del intervalo y la exactitud de los números es mayor.
\item Cuenta con una biblioteca matemática amplia.
\item  Abundantes herramientas gráficas, incluidas funciones de interfaz gráfica con el usuario.
\item Capacidad de vincularse con los lenguajes de programación tradicionales.
\item Transportabilidad de los programas.
\end{itemize}
 

Algunas de sus desventajas son:

\begin{itemize}
\item  Necesita de muchos recursos de sistema como son Memoria, tarjeta de videos, etc. para funcionar correctamente.
\item El tiempo de ejecución es lento.
\item No genera código ejecutable.
\item  Es caro.
\end{itemize}
 
En una estación de trabajo UNIX, MATLAB puede abrirse tecleando

> matlab

En el caso de sistemas LINUX, existe una versión similar al MATLAB , llamado OCTAVE, el cual tiene las mismas funciones y desempeño que el MATLAB. En este caso para iniciar la sesión se da:

> octave

En Macintosh o Windows, haga clic en el icono de MATLAB.

\subsection{Ayuda}

Si no entiende el significado de un comando, teclee help y el nombre del comando que desea revisar. Este comando desplegara información concisa respecto que será de utilidad para el usuario. Así por ejemplo cuando se da el comando

» help help

Se despliega en la pantalla.

    HELP On-line help, display text at command line.
    HELP, by itself, lists all primary help topics.  Each primary topic
    corresponds to a directory name on the MATLABPATH.

    "HELP TOPIC" gives help on the specified topic.  The topic can be a
    command name, a directory name, or a MATLABPATH relative partial
    pathname (see HELP PARTIALPATH).  If it is a command name, HELP
    displays information on that command.  If it is a directory name,
    HELP displays the Table-Of-Contents for the specified directory.
    For example, "help general" and "help matlab/general" both list
    the Table-Of-Contents for the directory toolbox/matlab/general.

    HELP FUN displays the help for the function FUN.

    T = HELP('topic') returns the help text in a $\backslash$ n separated string.

    LOOKFOR XYZ looks for the string XYZ in the first comment line
    of the HELP text in all M-files found on the MATLABPATH.  For all
    files in which a match occurs, LOOKFOR displays the matching lines.

    MORE ON causes HELP to pause between screenfuls if the help text
    runs to several screens.

    In the online help, keywords are capitalized to make them stand
    out.  Always type commands in lowercase since all command and
    function names are actually in lowercase.

    For tips on creating help for your m-files 'type help.m'. 

    See also LOOKFOR, WHAT, WHICH, DIR, MORE.

El comando what (Qué) muestra una lista de archivos M, MAT y MEX presentes en el directorio de trabajo. Otra manera de realizar esta operación es utilizar el comando dir.

El comando who (Quien) lista las variables utilizadas en el espacio de trabajo actual.

\subsection{Tipos de Datos y Variables}

 

No es necesario declarar los nombres de la variables ni sus tipos. Esto se debe a que los nombres de la variables en Matlab no son diferentes para los números enteros, reales y complejos.  Sin embargo esto da lugar a conflictos cuando se utilizan los nombres de variables de palabras reservadas para:

1.       nombres de variables especiales.

\begin{center}
\begin{tabular}{|c|c|}
	\hline
	Nombre de variable & Significado \\
	\hline
	eps & Épsilon de la máquina (2.2204e-16) \\
	pi & pi (3.14159...) \\
	i y j & Unidad imaginaria \\
	inf & infinito \\
	NaN & no es número \\
	date & fecha \\
	flops & Contador de operaciones de punto flotante \\
	nargin & Número de argumentos de entrada a una función\\
	nargout & Número de argumentos de salida de una función\\
	\hline
\end{tabular}
\end{center}
	
2.       nombres de funciones.

Trigonométricas
\begin{center}
\begin{tabular}{|c|c|}
	\hline
	Nombre de variable & Significado \\
	\hline
	sin & Seno \\
	sinh & Seno Hiperbólico\\
	asin & Seno Inverso\\
	asinh & Seno hiperbólico inverso \\
	cos  & Coseno \\
	cosh & Coseno Hiperbólico \\
	acos  & Coseno inverso\\
	acosh & Coseno hiperbólico inverso \\
	tan &Tangente \\
	tanh & Tangente Hiperbólica\\
	atan & Tangente inversa.\\
	atan2 &Tangente inversa en cuatro cuadrantes\\
	atanh  & Tangente hiperbólica  inversa\\
	sec  & Secante \\
	sech & Secante Hiperbólica\\
	asec & Secante inversa\\
	 asech & Secante hiperbólica Inversa \\
	 csc  & Cosecante \\
	 csch & cosecante hiperbólica \\
	 acsc  &  Cosecante Inversa \\
	 acsch & Inverse hyperbolic cosecant\\
	 cot  & Cotangent\\
	 coth & Hyperbolic cotangent\\
	 acot  & Inverse cotangent\\
	 acoth & Inverse hyperbolic cotangent\\
	 \hline
\end{tabular}
\end{center}
 
Exponencial.

\begin{center}
\begin{tabular}{|c|c|}
	\hline
	Nombre de variable & Significado \\
	\hline
	exp & Exponencial \\
	log  & Logaritmo Natural \\
	log10 & logaritmo común (base 10)\\
	log2  & Logaritmo base 2 \\
	pow2 & Potenciacion en Base 2\\
	sqrt  & Raíz Cuadrada \\
	nextpow2  & Próxima potencia de 2 \\
	 \hline
\end{tabular}
\end{center}


Complejos.
\begin{center}
\begin{tabular}{|c|c|}
	\hline
	Nombre de variable & Significado \\
	\hline
	abs & Valor Absoluto\\ 
	angle & Ángulo de Fase\\ 
	complex & Constructor de números complejos\\
	conj & Conjugado de un complejo\\
	imag & Parte imaginaria \\
	real & Parte real \\
	unwrap & Desenvolvimiento de fase\\
	isreal & Verifica si un arreglo es real\\
	cplxpair & Ordena números complejos\\
	 \hline
\end{tabular}
\end{center}
 

Redondeo y residuos.
\begin{center}
\begin{tabular}{|c|c|}
	\hline
	Nombre de variable & Significado \\
	\hline
	fix & Parte entera de un número \\
	floor & Parte fraccionaria \\
	ceil & Parte entere de un número\\
	round & Redondea al siguiente entero\\
	mod  & Residuo con signo de una división \\
	rem & Residuo sin signo de una división\\
	sign & Signo\\
	 \hline
\end{tabular}
\end{center}
 
3.       nombres de comandos.

Comandos
\begin{center}
\begin{tabular}{|c|c|}
	\hline
	Nombre de comando & Significado \\
	\hline	
	what  & Lista archivos en el directorio \\
	dir & Lista archivos en el directorio \\
	who& Variables utilizadas \\
	clear &  Borra variables utilizadas \\
	etc & etc \\
	 \hline
\end{tabular}
\end{center}

\subsection{Ejemplo}

Calcular el volumen en una esfera.
\begin{verbatim}
clear;
r = 2
vol = (4/3)*pi*r^3
\end{verbatim}

\subsection{Operadores}

Los operadores aritméticos como +, -, *, / son los mismos que en los lenguajes tradicionales como C, Java, Fortran, etc., así como la precedencia de estos.

 
\begin{center}
\begin{tabular}{|c|c|}
	\hline
	Operador & Simbolo \\
	\hline	 
	suma & + \\
	resta & - \\
	multiplicación & *\\
	división & / \\
	reciproco & $\backslash$ \\
	 \hline
\end{tabular}
\end{center}
 

Un operador no convencional es el reciproco

\begin{verbatim} 
clear;
c = 3 \ 1
\end{verbatim}

Los operadores condicionales que existen en Matlab son:

\begin{center}
\begin{tabular}{|c|c|}
	\hline
	Operador & Simbolo \\
	\hline 
	Mayor que & $>$ \\
	Menor que & $<$ \\
	Mayor igual & $>=$ \\
	Menor igual & $<=$ \\
	Igual a & $==$ \\
	Diferente de & \text{\~{}}$= $\\
	\hline
\end{tabular}
\end{center}
 
Los cuales son utilizados para hacer condicionales con la sentencia if

\begin{verbatim}
clear;
r = -2
if  r > 0, (4/3)*pi*r\^3
end
\end{verbatim}

Note que todas las sentencias if deben ir acompañadas por un end.

Los operadores lógicos and y or se denotan con $\&$ y $\|$

\begin{verbatim}
g = 5
if g>3 | g <0, a = 6
end
\end{verbatim}

y se puede hacer agrupamiento con los operadores $\&$ y $\|$

\begin{verbatim}
clear;
a = 2
b = 3
c = 5
if((a==2 | b==3) & c < 5) g=1; end;
\end{verbatim}

\section{Instrucciones Secuenciales}

\section{Instrucciones Condicionales}

Para hacer condicionales se utiliza la sentencia if, la cual,  siempre debe ir terminada con la sentencia end

\begin{verbatim}
r = -2
if r > 0, (4/3)*pi*r^3
end
\end{verbatim}
 
Los enunciados lógicos and y or se denotan con $\&$ y $\|$, pueden ser utilizados para implementar condicionales de la manera siguiente.

\begin{verbatim}
clear;
g = 5
if g>3 | g <0, a = 6
end
pause;
\end{verbatim}

además los operadores $\&$ y $\|$ se puede agrupar como

\begin{verbatim}
clear;
a = 2
b = 3
c = 5

if((a==2 | b==3) & c < 5) g=1; end;

pause;
\end{verbatim}
 
Las condicionales if se pueden utilizar con else o elseif
 
\begin{verbatim}
clear;

r = 2;

if r > 3       b = 1;
elseif r == 3  b = 2;
else           b = 0;
end;
\end{verbatim}

Ver código ejem001.m

\section{Instrucciones de Repetición}

En Matlab existen dos maneras de implementar ciclos. La primera con los comandos for/end y la segundo con los comandos while/end, de manera muy similar a los lenguajes de alto nivel.

\subsection{Ciclos for/end}

La sintaxis de este comando es

\begin{verbatim}
for r=inicio: incremento: fin
   instrucciones_a_repetir
   instrucciones_a_repetir
   instrucciones_a_repetir
   instrucciones_a_repetir
   instrucciones_a_repetir
end;
\end{verbatim}

imprimir los números del 1 a 100 se hace :

\begin{verbatim}
for x=1: 1:100

  x

end;
\end{verbatim}

El siguiente conjunto de instrucciones realiza una cuenta de 100 a 80 con decrementos de 0.5.

\begin{verbatim}
for x=100:-0.5: 80

  x

end;
\end{verbatim}

en el caso de decrementos o incrementos unitarios, se puede omitir el valor del incremento.

\begin{verbatim}
for x=1: 1:100, x, end
\end{verbatim}
 

\subsection{Ejemplo 1}

Utilizando el comando for/end, calcular el volumen de cinco esferas de radio 1, 2, 3, 4 y 5 se hace:

\begin{verbatim} 
for r=1:5
   vol = (4/3)*pi*r^3;
   disp([r, vol])
end;
\end{verbatim}

 
Los ciclos pueden hacerse anidados de la siguiente manera.

\begin{verbatim}
for r=1:5
   for s=1:r
      vol = (4/3)*pi*(r^3-s^3);
      disp([r, s, vol])
   end
end
\end{verbatim}

Podemos utilizar el comando break para detener la ejecución de un ciclo

\begin{verbatim}
for i=1:6
   for j=1:20
      if j>2*i, break, end
      disp([i, j])
   end
end
\end{verbatim}

Ver código esferas.m

\subsection{Ciclos while/end}

La sintaxis de esta comando es

\begin{verbatim}
while condición
  instrucciones_a_repetir
end
\end{verbatim}

Así por ejemplo podemos implementar al igual que con los ciclos for/end, un pequeño programa que imprima los números del 1 al 100.

\begin{verbatim}
x = 1;
while x <= 100
  x
  x = x + 1;
end
\end{verbatim}
 
Ver ejemplo\_while.m
 
El ejemplo para desplegar el volumen de una esfera con radios de 1, 2, 3, 4 y 5 queda.


\begin{verbatim}
r = 0;
while r<5
   r = r+1;                        
   vol = (4/3)*pi*r^3;
   disp([r, vol])
end;
\end{verbatim}

otro ejemplo interesante es:

\begin{verbatim}
clear;
r = 0
while r<10
   r = input('Teclee el radio (o -1 para terminar): ');
   if  r< 0, break, end
   vol = (4/3)*pi*r*3;
   fprintf('volumen = \%7.3f\n', vol)
end
\end{verbatim}

Ver esferas\_while.m

\subsection{Ejemplo 2}

Hacer un programa que permita imprimir un triángulo rectángulo formado por asteriscos.

\begin{verbatim}
% Codigo para imprimir un triangulo

fprintf('\ntriangulo\n\n') 

for k=1:7
   for l=1:k
      fprintf('*')
   end;
   fprintf('\n')
end
\end{verbatim}
 
Ver triangulo.m

\subsection{Ejemplo 3}

Hacer un programa para desplegar un rectángulo de base 6 y altura 7.

\begin{verbatim}
% Codigo para imprimir un rectangulo

fprintf('\nrectangulo\n\n')

for k=1:7
   for l=1:6
      fprintf('*')
   end;
   fprintf('\n')
end
\end{verbatim}

Ver rectangulo.m
 
\subsection{Ejemplo 4}

Hacer un programa para imprimir un pino utilizando un solo carácter.

\begin{verbatim}
a=10; %altura del follaje del pino
n=12; %Posición horizontal del vértice.
t=3;  %altura del tronco del pino
d=4;  %diámetro del tronco del pino

% Dibujar el follaje del pino, de altura 'a'

for i=1:a
   clear cad2 cad1
   num_ast=2*i-1;
   num_esp=n-i;
   cad1(1:num_esp)=' ';
   cad2(1:num_ast)='*';
   fprintf('\%s\%s\n',cad1,cad2)  
end

% Dibujar el tronco del pino, de altura 't'

   clear cad2 cad1
   num_ast=d;
   num_esp=n-d/2;
   cad1(1:num_esp)=' ';
   cad2(1:num_ast)='I';

 for i=1:t
   fprintf('\%s\%s\n',cad1,cad2)
 end
\end{verbatim}
 
Ver pino.m

\subsection{Ejemplo 5}

Hacer un programa para imprimir el triángulo de Pascal.

\begin{verbatim}
nr=8;   % Numero de renglones del triangulo de Pascal.
n=15;   % Numero de espacios en blanco antes del vértice.
x(1)=1;
cad1(1:n)=' ';
fprintf('%s%3.0f\n\n',cad1,x(1)); % vertice del triangulo
for k=2:nr-1;
    clear cad1 cad2
    num_esp=n-2*k+1;
    cad1(1:num_esp)=' ';
    clear x
    x(1)=1;
    for c=2:k;
    x(c)=x(c-1)*(k-c+1)/(c-1);
    end
    fprintf('\%s',cad1)
    for c=1:k
    fprintf(' \%3.0f',x(c))
    end
    fprintf('\n\n')
end
\end{verbatim}

Ver pascal.m

\section{Manejo de Matrices y Vectores}

Un vector de datos puede definirse como

\begin{verbatim}
x = [0, 0.1, 0.2, 0.3, 0.4, 0.5]
\end{verbatim}
 
si se desea imprimir un dato en particular se teclea

\begin{verbatim}
x(3)
\end{verbatim}

el cual imprimirá el número en la tercer posición del arreglo, el primer elemento se numera con el uno.

Una forma equivalente de definir la misma x es

\begin{verbatim}
clear;
for i=1:6
   x(i) = (i-1)*0.1;
end
 
x
x(3)
\end{verbatim}
 
Otra forma de escribir un arreglo es

\begin{verbatim}
clear;

x = 2: -0.4: -2

pause;
\end{verbatim}

Podemos definir arreglos en fila o columna

\begin{verbatim}
clear; 

z = [0; 0.1; 0.2; 0.3; 0.4; 0.5]

z = [0, 0.1, 0.2, 0.3, 0.4, 0.5]'
\end{verbatim}
 
podemos realizar operaciones entre arreglos fila o columna con

\begin{verbatim}
clear;

x = [1, 2, 3, 4]
y = [4, 3, 2, 1]

suma  = x + y
resta = x - y
mult  = x .* y
div   = x ./ y
\end{verbatim}
 

Las operaciones de suma y resta son iguales que para el álgebra lineal. En cambio .* y ./ son operadores nombrados para la división de arreglos. Si se omite el punto el significado es diferente lo cual es equivalente a

\begin{verbatim}
clear;

x = [1, 2, 3, 4]
y = [4, 3, 2, 1]

\end{verbatim}

Para la suma hacemos 

\begin{verbatim}
for i=1:4; suma(i)  = x(i) + y(i); end;
\end{verbatim}
 
En la resta 

\begin{verbatim}
for i=1:4; resta(i) = x(i) - y(i); end;
\end{verbatim}
 
Multiplicación

\begin{verbatim}
for i=1:4; mult(i)  = x(i) * y(i); end;
\end{verbatim}
 
y División

\begin{verbatim}
for i=1:4; div(i)   = x(i) / y(i); end;
\end{verbatim}
 
Ver arreglos.m 
 
Propiedades de los arreglos

Concatenación

\begin{verbatim}
clear;

x = [2, 3]
x = [x, 4]
\end{verbatim}

en el caso de arreglos columna

\begin{verbatim}
clear; 

y = [2, 3]'
y = [y; 4]
\end{verbatim}

para extraer la una parte de un vector

\begin{verbatim}
clear;

y = [1,2,3,4,5,6,7,8,9]
w = y(3:6)
\end{verbatim}
 
para obtener la longitud de un arreglo se utiliza

\begin{verbatim}
clear;

y = [1,2,3,4,5,6,7,8,9]
length(y)
\end{verbatim}
 
La variables de cadena también puede tener caracteres

\begin{verbatim}
clear;

v = 'Hola Mundo'

w = ['H', 'o', 'l', 'a', ' ', 'M', 'u', 'n', 'd', 'o']
\end{verbatim}
 

y podemos cambiar el orden de impresión haciendo

 
\begin{verbatim}
clear;

v = 'Hola Mundo'
v = v'

w = ['H', 'o', 'l', 'a', ' ', 'M', 'u', 'n', 'd', 'o']
w = w'
\end{verbatim}
 
 Ver arreglos\_propiedades.m

\subsection{Ejemplo 1}

Dado un arreglo de datos calcular el promedio de este y el mayor de los valores.

 
\begin{verbatim}
x = [3 9 5 8 2]
n = length(x);
suma =0;
max = x(1);
for k=1:n
   suma = suma + x(k);
   if(max < x(k)); max = x(k); end;
end;
suma = suma/n;

fprintf('El promedio es = \%5.2f\n', suma);
fprintf('El mayor es    = \%5.2f\n', max);
\end{verbatim}
 
Ver promedio\_mayor.m

\subsection{Ejemplo 2}

Escribir un programa que verifique si una cadena de caracteres e un palíndromo.

\begin{verbatim}
x = '10011'
y = x(length(x):-1:1)
if(x == y)
   fprintf('Es palíndromo \n');
else
   fprintf('No es palíndromo \n');
end;
\end{verbatim}
 
Ver palindroma.m

\subsection{Arreglos Bidimensionales}

Para definir arreglos bidimensionales o matrices hacemos

\begin{verbatim}
m = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9]
\end{verbatim}
 
otra manera de definirlos es utilizar

\begin{verbatim}
clear;
m(1,1) = 0.1;
m(1,2) = 0.2;
m(1,3) = 0.3;
m(2,1) = 0.4;
m(2,2) = 0.5;
m(2,3) = 0.6;
m(3,1) = 0.7;
m(3,2) = 0.8;
m(3,3) = 0.9;
\end{verbatim}
 
Podemos listar columnas de la matriz haciendo

\begin{verbatim}
m(:,1)
m(:,2)
m(:,3)
\end{verbatim}
 
o también renglones

\begin{verbatim}
m(1,:)
m(2,:)
m(3,:)
\end{verbatim}
 
podemos realizar operaciones de +. -, * y / con matrices

 \begin{verbatim}
a = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9]
b = [0.3, 0.4, 1.3; 0.6, -0.7, 1.0; -2.0, 1.8, 9]

suma  = a + b
resta = a - b
mult  = a .* b
div   = a ./ b
\end{verbatim}
 

lo cual es equivalente a

\begin{verbatim}
a = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9]
b = [0.3, 0.4, 1.3; 0.6, -0.7, 1.0; -2.0, 1.8, 9]

for i=1:3
   for j=1:3
      suma(i,j) = a(i,j) + b(i,j);
   end
end

%suma

for i=1:3
   for j=1:3
      resta(i,j) = a(i,j) - b(i,j);
   end
end

%resta

for i=1:3
   for j=1:3
      mult(i,j) = a(i,j) * b(i,j);
   end
end

%multiplicación

for i=1:3
   for j=1:3
      div(i,j) = a(i,j) / b(i,j);
   end
end

%división

pause;
\end{verbatim}

también podemos utilizar el operador de potenciación en arreglos

 
\begin{verbatim}
clear;

a = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9]

g = a .^2

pause;
\end{verbatim}
 
el cual es equivalente

\begin{verbatim}
a = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9]

for i=1:3
   for j=1:3
      g(i,j) = a(i,j)^2;
   end
end
\end{verbatim}

Ver arreglos\_2d.m

Algebra de Matrices

Cuando queremos realizar las operaciones del álgebra lineal de suma, resta, multiplicación y división hacemos

la suma y resta son iguales pero la multiplicación cambia

\begin{verbatim}
A = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9]

x = [1, 2, 3]'

b = A*x
\end{verbatim}

para la división tendremos
 
\begin{verbatim}
A = [1, 4; 3, 5]

x = [2, 3]'

b = A\x
\end{verbatim}

\section{Estructuras de Programa y Funciones}

Las funciones en MATLAB, que se guardan como archivos independientes, equivalen a las subrutinas y funciones de otros lenguajes.

\subsection{Funciones que devuelven una sola variable}

Consideremos el ejemplo de escribir la función

f(x)= 2x3+4x2+ 3

podemos escribir en MATLAB un archivo con el nombre fun00.m como

\begin{verbatim}
function y = fun01(x)
	y = 2*x^3+4*x^2+ 3;
\end{verbatim}


Para ejecutar esta función, desde el ambiente de MATLAB podemos valuar f(2) como

fun01(2)

\subsection{Funciones que devuelven mas de una variable}

Una función puede devolver más de una variable y la sintaxis para escribir esta función es

\begin{verbatim}
function [Y1, Y2, ..., Yn ] = fun_regresa_varias(X)
...
...
...
Y1 = ....
Y2 = ....
...
...
\end{verbatim}

Supongamos que dado un conjunto de datos queremos realizar una función que devuelva la media y la desviación estándar. Primero escribimos un archivo llamado fun02.m, que tenga las siguientes instrucciones.

\begin{verbatim}
function [media, des] = fun02(x)
n = length(x);
suma = 0;
for k=1:n
	suma = suma + x(k);
end;
media = suma/n;
suma = 0;
for k=1:n
	suma = (x(k) - media)^2;
end;
des = sqrt(suma/n );
\end{verbatim}

Guardamos el archivo y ejecutamos desde el MATLAB con:

[m d] = fun02(x)

y la ejecución regresa.

\begin{verbatim}
m =

2

d =

0.5774
\end{verbatim}

Note que la función recibe dos argumentos a los que llamamos m y d. De hacer el llamado de la función sin poner estos dos, no se genera error alguno pero solo se imprime el primer parámetro que devuelve la función.

fun02(x)

ans =

2

\subsection{Ejemplo 1}

Se tiene un circuito eléctrico formado por una fuente de voltaje variable en el tiempo $v(t) = 10 cos(20t)$, una resistencia $R = 5$ y un diodo conectados en serie tal como se muestra en la figura \ref{fig:Cto_diodo}. 

Para este circuito hacer 
\begin{itemize}
\item Escribir la función que modela el circuito,
\item Escribir el código para resolver el problema y
\item Graficar la corriente como función del tiempo
\end{itemize}

\begin{figure}[!htp]
   \centering
   \centerline{\psfig{figure=Matlab/figuras/diodo.eps, width=8.0cm}}
   \caption{Circuito serie con diodo}
   \label{fig:Cto_diodo}
\end{figure}

La función para modelar el diodo en el circuito es:

\begin{verbatim}
function it = diodo(vt) 
   R = 5;
   
   if vt > 0.7 
       vd = 0.7;
   else
       vd = vt;
   end
   
   it = (vt - vd)/R;
end
\end{verbatim}

Dado que tenemos un operador condicional, no es posible hacer la sectorización. Es este caso utilizamos la función arrayfun de matlab tal como se muestra en el siguiente código.

\begin{verbatim}
 t = [0:0.01:2];            % tiempo 
 vt = 10*cos(20*t);         % Voltaje variante en el tiempo
 it = arrayfun(@diodo, vt); % Calculo de la corriente
 
 plot(t, it, t, vt);        % Corriente Calculada
 
 xlabel('t (seg.)');
 ylabel('v(t) y i(t)');
 title ('Solución de un circuito con Diodo');
\end{verbatim}

La Figura \ref{fig:Sol_Cto_diodo} muestra la solución encontrada en función del tiempo

\begin{figure}[!htp]
   \centering
   \centerline{\psfig{figure=Matlab/figuras/sol_diodo.eps, width=8.0cm}}
   \caption{Solución gráfica del circuito con Diodo}
   \label{fig:Sol_Cto_diodo}
\end{figure}

\subsection{Ejemplo 2}

Determinar el cruce por cero de la función f(x) = x – cos(x), utilizando el método de Newton Raphson. Este algoritmo iterativo se resuelve haciendo

\[
x_{k+1} = x_k - \frac{f(x_k)}{f’(x_k)}
\]

La implementación en MATLAB es:

\begin{verbatim}
function z = cero(x0)
 
 for k = 1: 100
   xnva = x0 - f(x0)/df(x0);
   x0 = xnva;
   fprintf('Iteracion \%d f(\%f) = \%f\n', k, x0, f(x0));
   if(abs(f(x0)) < 0.00001) break; end;
 end;
 
z =x0;
 
function y = f(x)
  y = x-cos(x);
 
function dy = df(x)
 dy = 1+sin(x);
\end{verbatim}
 

\subsection{Ejemplo 3}.

Determinar el cruce por cero de la función f(x) = x – cos(x), utilizando el método de Bisecciones.

La implementación en MATLAB es:

\begin{verbatim} 
function b = biseccion(x0,x1)
 n=x0:0.1:x1;
 plot(n,f(n))
 xlabel('eje x');    
 ylabel('eje y');
 hold on;
 fmin = min(f(n));
 fmax = max(f(n));
 
 for  S = 1:100
     mau=((x1+x0)/2);
     a=f(x0);
     b=f(x1);
     fmau=f(mau);
     fprintf('Iteracion %d f(mau)(%f) = %f\n', S, mau, f(mau));
    
     plot(x0, fmin:0.01:fmax, x1, fmin:0.01:fmax);
     pause;
    
     if       a*fmau > 0   x0=mau;
     elseif   a*fmau==0    x0=mau;
     elseif   a*fmau==0    x1=mau;   
     elseif   a*fmau < 0   x1=mau;
 
     if (abs(fmau) < 0.0001), break, end;
  end;
end;
  disp(['La solucion esta en:'])
  disp([mau]);

function y = f(x)
  y = x-cos(x);
 \end{verbatim}