Metodos Numericos Notas Felix PDF

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 211

Métodos Numéricos

Dr. Félix Calderon Solorio

3 de junio de 2017
Índice general

Introducción 1
1.1. Introducción (Variables y Operadores) . . . . . . . . . . . . . . . . . . . . . 1
1.1.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.2. Ayuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.3. Tipos de Datos y Variables . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.4. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.5. Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2. Instrucciones Secuenciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.3. Instrucciones Condicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4. Instrucciones de Repetición . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4.1. Ciclos for/end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4.2. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.4.3. Ciclos while/end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.4.4. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4.5. Ejemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4.6. Ejemplo 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4.7. Ejemplo 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.5. Manejo de Matrices y Vectores . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.5.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.5.3. Arreglos Bidimensionales . . . . . . . . . . . . . . . . . . . . . . . . 16
1.6. Estructuras de Programa y Funciones . . . . . . . . . . . . . . . . . . . . . 19
1.6.1. Funciones que devuelven una sola variable . . . . . . . . . . . . . . . 19
1.6.2. Funciones que devuelven mas de una variable . . . . . . . . . . . . . 19
1.6.3. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.6.4. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.6.5. Ejemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

Modelos 25
2.1. Modelos y Computadoras . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
ÍNDICE GENERAL

2.2. Serie de Taylor y Errores de Truncamiento . . . . . . . . . . . . . . . . . . . 25


2.2.1. La serie de Taylor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.2. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.2.3. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2.4. Ejemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.5. Ejemplo 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.2.6. Uso de la serie de Taylor para estimar errores de Truncamiento . . . 31

SE No Lineales 33
3.1. Método Gráfico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1.2. Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2. Método de Bisección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.3. Método de la falsa posición (Regula Falsi) . . . . . . . . . . . . . . . . . . . 36
3.3.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.4. Método de iteración de punto fijo . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.4.2. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.5. Método de Newton-Raphson . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.5.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6. Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6.1. Cálculo de la Raiz Cuadrada . . . . . . . . . . . . . . . . . . . . . . 41
3.6.2. Solución de un circuito con un diodo . . . . . . . . . . . . . . . . . . 43
3.6.3. Solución del problema de flujos de Pontencia . . . . . . . . . . . . . 46
3.7. Evaluación de Polinomios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.7.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.7.2. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.7.3. Cálculo de derivadas . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.7.4. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.7.5. Calculo de la integral . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.7.6. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.7.7. Ejemplo cálculo de raı́ces de un polinomio . . . . . . . . . . . . . . . 53
3.8. Deflación de polinomios y División de Polinomios . . . . . . . . . . . . . . . 55
3.8.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.8.2. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.8.3. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.8.4. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.9. Solución de un polinomio de orden 2 en la forma general . . . . . . . . . . . 62
3.10. Método de Bairstow para la solución de polinomios . . . . . . . . . . . . . 63
3.10.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
ÍNDICE GENERAL

3.10.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
3.10.3. Ejemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

Sistemas de Ecuaciones 73
4.1. Solución de Sistemas lineales . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.1.1. Método iterativo de Jacobi . . . . . . . . . . . . . . . . . . . . . . . 73
4.1.2. Algoritmo iterativo de Gauss-Seidel . . . . . . . . . . . . . . . . . . 75
4.1.3. Ejemplo matrices dispersas . . . . . . . . . . . . . . . . . . . . . . . 77
4.1.4. Eliminación Gaussiana . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.1.5. Gauss-Jordan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.2. Métodos para sistemas no lineales . . . . . . . . . . . . . . . . . . . . . . . . 100
4.2.1. Método de iteración de punto fijo para sistemas . . . . . . . . . . . . 100
4.2.2. Método de Newton-Raphson para sistemas . . . . . . . . . . . . . . 105
4.2.3. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

Optimización 115
5.1. Optimización no-restringida. Método de búsqueda de la sección dorada . . . 115
5.1.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
5.1.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
5.2. Optimización no-restringida. Método de Newton . . . . . . . . . . . . . . . 118
5.2.1. Método de Newton en una dimensión . . . . . . . . . . . . . . . . . 118
5.2.2. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
5.2.3. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
5.2.4. Método de Newton en N dimensiones . . . . . . . . . . . . . . . . . 121
5.2.5. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
5.2.6. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
5.2.7. Propiedades del Método de Newton . . . . . . . . . . . . . . . . . . 127
5.2.8. Ejemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
5.2.9. Ejemplo 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
5.2.10. Problemas de convergencia del Método de Newton . . . . . . . . . . 130
5.2.11. Ejemplo 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
5.2.12. Método de Newton Modificado . . . . . . . . . . . . . . . . . . . . . 131
5.3. Metodo Simplex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
5.3.1. Forma estándar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
5.3.2. Método Simplex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
5.3.3. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
5.3.4. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
5.3.5. Ejemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

Ajuste de curvas 147


6.1. Regresión lineal por el método de mı́nimos cuadrados . . . . . . . . . . . . 147
ÍNDICE GENERAL

6.1.1. Ajuste por mı́nimos cuadrados . . . . . . . . . . . . . . . . . . . . . 148


6.1.2. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
6.1.3. Regresión polinomial . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
6.1.4. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
6.2. Interpolación lineal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
6.2.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
6.3. Interpolación cuadrática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
6.3.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
6.3.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
6.4. Formulas de interpolación de Newton . . . . . . . . . . . . . . . . . . . . . . 160
6.4.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
6.4.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
6.5. Interpolación de Polinomios de Lagrange . . . . . . . . . . . . . . . . . . . . 164
6.5.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
6.5.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

Diferenciación e Integración 169


7.1. Derivadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
7.2. Derivadas Mejoradas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
7.3. Integración por el método de barras . . . . . . . . . . . . . . . . . . . . . . 170
7.3.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
7.4. Integración por el método de trapezoides . . . . . . . . . . . . . . . . . . . . 171
7.4.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
7.5. Integración por el método de regla Simpson 1/3 . . . . . . . . . . . . . . . . 173
7.5.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
7.6. Integración por el método de regla Simpson 3/8 . . . . . . . . . . . . . . . 174
7.6.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
7.7. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
7.7.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
7.7.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

Ecuaciones diferenciales ordinarias 177


8.1. Integración por el método de Euler . . . . . . . . . . . . . . . . . . . . . . . 177
8.2. Integración por el método de Heun con solo uno y con varios predictores . . 178
8.3. Integración por el método del punto medio . . . . . . . . . . . . . . . . . . 179
8.4. Runge-Kutta 2do orden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
8.5. Runge-Kutta 3er orden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
8.6. Runge-Kutta 4to orden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
8.7. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
8.7.1. Una ecuación diferencial sencilla . . . . . . . . . . . . . . . . . . . . 183
8.7.2. Circuito RL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
ÍNDICE GENERAL

8.7.3. Movimiento parabólico . . . . . . . . . . . . . . . . . . . . . . . . . . 189


8.7.4. Sistema Masa Resorte . . . . . . . . . . . . . . . . . . . . . . . . . . 192

Ecuaciones diferenciales parciales 197


9.1. Fórmula de integración por el método explı́cito de diferencias divididas finitas197
9.1.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

Tareas 201
11.1. Tarea 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
11.2. Tarea 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
11.3. Tarea 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
11.4. Tarea 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
11.5. Tarea 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
11.6. Tarea 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
11.7. Tarea 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
11.8. Tarea 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
11.9. Tarea 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
11.10.Tarea 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
11.11.Tarea 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
11.12.Tarea 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Introducción a la Programación en Matlab

1.1. Introducción (Variables y Operadores)

1.1.1. 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:
La programación es mucho mas sencilla.
Hay continuidad entre valores enteros, reales y complejos.
La amplitud del intervalo y la exactitud de los números es mayor.
Cuenta con una biblioteca matemática amplia.
Abundantes herramientas gráficas, incluidas funciones de interfaz gráfica con el usua-
rio.
Capacidad de vincularse con los lenguajes de programación tradicionales.
Transportabilidad de los programas.
Algunas de sus desventajas son:
Necesita de muchos recursos de sistema como son Memoria, tarjeta de videos, etc.
para funcionar correctamente.
El tiempo de ejecución es lento.
No genera código ejecutable.
Es caro.
En una estación de trabajo UNIX, MATLAB puede abrirse tecleando
¿matlab

1
2 INTRODUCCIÓN

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.

1.1.2. 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 PARTIAL-
PATH). 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 \ 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 com-
mands 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.
1.1. INTRODUCCIÓN (VARIABLES Y OPERADORES) 3

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.

1.1.3. 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.

Nombre de variable Significado


eps Épsilon de la máquina (2.2204e-16)
pi pi (3.14159...)
iyj 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

2. nombres de funciones.

Trigonométricas
4 INTRODUCCIÓN

Nombre de variable Significado


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

Exponencial.

Nombre de variable Significado


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

Complejos.
1.1. INTRODUCCIÓN (VARIABLES Y OPERADORES) 5

Nombre de variable Significado


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

Redondeo y residuos.

Nombre de variable Significado


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

3. nombres de comandos.

Comandos

Nombre de comando Significado


what Lista archivos en el directorio
dir Lista archivos en el directorio
who Variables utilizadas
clear Borra variables utilizadas
etc etc

1.1.4. Ejemplo

Calcular el volumen en una esfera.

clear;
r = 2
vol = (4/3)*pi*r^3
6 INTRODUCCIÓN

1.1.5. 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.
Operador Simbolo
suma +
resta -
multiplicación *
división /
reciproco \
Un operador no convencional es el reciproco
clear;
c = 3 \ 1
Los operadores condicionales que existen en Matlab son:
Operador Simbolo
Mayor que >
Menor que <
Mayor igual >=
Menor igual <=
Igual a ==
Diferente de =
Los cuales son utilizados para hacer condicionales con la sentencia if
clear;
r = -2
if r > 0, (4/3)*pi*r\^3
end
Note que todas las sentencias if deben ir acompañadas por un end.
Los operadores lógicos and y or se denotan con & y k
g = 5
if g>3 | g <0, a = 6
end
y se puede hacer agrupamiento con los operadores & y k
clear;
a = 2
b = 3
1.2. INSTRUCCIONES SECUENCIALES 7

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

1.2. Instrucciones Secuenciales

1.3. Instrucciones Condicionales

Para hacer condicionales se utiliza la sentencia if, la cual, siempre debe ir terminada con
la sentencia end
r = -2
if r > 0, (4/3)*pi*r^3
end
Los enunciados lógicos and y or se denotan con & y k, pueden ser utilizados para imple-
mentar condicionales de la manera siguiente.
clear;
g = 5
if g>3 | g <0, a = 6
end
pause;
además los operadores & y k se puede agrupar como
clear;
a = 2
b = 3
c = 5

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

pause;
Las condicionales if se pueden utilizar con else o elseif
clear;

r = 2;

if r > 3 b = 1;
elseif r == 3 b = 2;
8 INTRODUCCIÓN

else b = 0;
end;
Ver código ejem001.m

1.4. 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.

1.4.1. Ciclos for/end

La sintaxis de este comando es


for r=inicio: incremento: fin
instrucciones_a_repetir
instrucciones_a_repetir
instrucciones_a_repetir
instrucciones_a_repetir
instrucciones_a_repetir
end;
imprimir los números del 1 a 100 se hace :
for x=1: 1:100

end;
El siguiente conjunto de instrucciones realiza una cuenta de 100 a 80 con decrementos de
0.5.
for x=100:-0.5: 80

end;
en el caso de decrementos o incrementos unitarios, se puede omitir el valor del incremen-
to.
1.4. INSTRUCCIONES DE REPETICIÓN 9

for x=1: 1:100, x, end

1.4.2. Ejemplo 1

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


se hace:
for r=1:5
vol = (4/3)*pi*r^3;
disp([r, vol])
end;
Los ciclos pueden hacerse anidados de la siguiente manera.
for r=1:5
for s=1:r
vol = (4/3)*pi*(r^3-s^3);
disp([r, s, vol])
end
end
Podemos utilizar el comando break para detener la ejecución de un ciclo
for i=1:6
for j=1:20
if j>2*i, break, end
disp([i, j])
end
end
Ver código esferas.m

1.4.3. Ciclos while/end

La sintaxis de esta comando es


while condición
instrucciones_a_repetir
end
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.
10 INTRODUCCIÓN

x = 1;
while x <= 100
x
x = x + 1;
end
Ver ejemplo while.m
El ejemplo para desplegar el volumen de una esfera con radios de 1, 2, 3, 4 y 5 queda.
r = 0;
while r<5
r = r+1;
vol = (4/3)*pi*r^3;
disp([r, vol])
end;
otro ejemplo interesante es:
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
Ver esferas while.m

1.4.4. Ejemplo 2

Hacer un programa que permita imprimir un triángulo rectángulo formado por asteris-
cos.
% Codigo para imprimir un triangulo

fprintf(’\ntriangulo\n\n’)

for k=1:7
for l=1:k
fprintf(’*’)
end;
1.4. INSTRUCCIONES DE REPETICIÓN 11

fprintf(’\n’)
end
Ver triangulo.m

1.4.5. Ejemplo 3

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


% Codigo para imprimir un rectangulo

fprintf(’\nrectangulo\n\n’)

for k=1:7
for l=1:6
fprintf(’*’)
end;
fprintf(’\n’)
end
Ver rectangulo.m

1.4.6. Ejemplo 4

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


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
12 INTRODUCCIÓN

% 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

Ver pino.m

1.4.7. Ejemplo 5

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

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

Ver pascal.m
1.5. MANEJO DE MATRICES Y VECTORES 13

1.5. Manejo de Matrices y Vectores

Un vector de datos puede definirse como


x = [0, 0.1, 0.2, 0.3, 0.4, 0.5]
si se desea imprimir un dato en particular se teclea
x(3)
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
clear;
for i=1:6
x(i) = (i-1)*0.1;
end

x
x(3)
Otra forma de escribir un arreglo es
clear;

x = 2: -0.4: -2

pause;
Podemos definir arreglos en fila o columna
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]’


podemos realizar operaciones entre arreglos fila o columna con
clear;

x = [1, 2, 3, 4]
y = [4, 3, 2, 1]
14 INTRODUCCIÓN

suma = x + y
resta = x - y
mult = x .* y
div = x ./ y
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
clear;

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

Para la suma hacemos


for i=1:4; suma(i) = x(i) + y(i); end;
En la resta
for i=1:4; resta(i) = x(i) - y(i); end;
Multiplicación
for i=1:4; mult(i) = x(i) * y(i); end;
y División
for i=1:4; div(i) = x(i) / y(i); end;
Ver arreglos.m
Propiedades de los arreglos
Concatenación
clear;

x = [2, 3]
x = [x, 4]
en el caso de arreglos columna
clear;

y = [2, 3]’
y = [y; 4]
1.5. MANEJO DE MATRICES Y VECTORES 15

para extraer la una parte de un vector


clear;

y = [1,2,3,4,5,6,7,8,9]
w = y(3:6)
para obtener la longitud de un arreglo se utiliza
clear;

y = [1,2,3,4,5,6,7,8,9]
length(y)
La variables de cadena también puede tener caracteres
clear;

v = ’Hola Mundo’

w = [’H’, ’o’, ’l’, ’a’, ’ ’, ’M’, ’u’, ’n’, ’d’, ’o’]


y podemos cambiar el orden de impresión haciendo
clear;

v = ’Hola Mundo’
v = v’

w = [’H’, ’o’, ’l’, ’a’, ’ ’, ’M’, ’u’, ’n’, ’d’, ’o’]


w = w’
Ver arreglos propiedades.m

1.5.1. Ejemplo 1

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


x = [3 9 5 8 2]
n = length(x);
suma =0;
max = x(1);
for k=1:n
suma = suma + x(k);
16 INTRODUCCIÓN

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);
Ver promedio mayor.m

1.5.2. Ejemplo 2

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


x = ’10011’
y = x(length(x):-1:1)
if(x == y)
fprintf(’Es palı́ndromo \n’);
else
fprintf(’No es palı́ndromo \n’);
end;
Ver palindroma.m

1.5.3. Arreglos Bidimensionales

Para definir arreglos bidimensionales o matrices hacemos


m = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9]
otra manera de definirlos es utilizar
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;
Podemos listar columnas de la matriz haciendo
1.5. MANEJO DE MATRICES Y VECTORES 17

m(:,1)
m(:,2)
m(:,3)
o también renglones
m(1,:)
m(2,:)
m(3,:)
podemos realizar operaciones de +. -, * y / con matrices
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
lo cual es equivalente a
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);
18 INTRODUCCIÓN

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;
también podemos utilizar el operador de potenciación en arreglos
clear;

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

g = a .^2

pause;
el cual es equivalente
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
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
A = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9]
1.6. ESTRUCTURAS DE PROGRAMA Y FUNCIONES 19

x = [1, 2, 3]’

b = A*x
para la división tendremos
A = [1, 4; 3, 5]

x = [2, 3]’

b = A\x

1.6. Estructuras de Programa y Funciones

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

1.6.1. 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
function y = fun01(x)
y = 2*x^3+4*x^2+ 3;
Para ejecutar esta función, desde el ambiente de MATLAB podemos valuar f(2) como
fun01(2)

1.6.2. 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
function [Y1, Y2, ..., Yn ] = fun_regresa_varias(X)
...
...
...
20 INTRODUCCIÓN

Y1 = ....
Y2 = ....
...
...

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.

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 );

Guardamos el archivo y ejecutamos desde el MATLAB con:

[m d] = fun02(x)

y la ejecución regresa.

m =

d =

0.5774

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
1.6. ESTRUCTURAS DE PROGRAMA Y FUNCIONES 21

1.6.3. Ejemplo 1

Se tiene un circuito eléctrico formado por una fuente de voltaje variable en el tiempo
v(t) = 10cos(20t), una resistencia R = 5 y un diodo conectados en serie tal como se
muestra en la figura 3.7.
Para este circuito hacer
Escribir la función que modela el circuito,
Escribir el código para resolver el problema y
Graficar la corriente como función del tiempo

Figura 1.1: Circuito serie con diodo

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


function it = diodo(vt)
R = 5;

if vt > 0.7
vd = 0.7;
else
vd = vt;
end

it = (vt - vd)/R;
end
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.
22 INTRODUCCIÓN

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’);
La Figura 1.2 muestra la solución encontrada en función del tiempo

Solución de un circuito con Diodo


10

2
v(t) y i(t)

−2

−4

−6

−8

−10
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
t (seg.)

Figura 1.2: Solución gráfica del circuito con Diodo

1.6.4. 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

f (xk )
xk+1 = xk −
f 0 (xk )

La implementación en MATLAB es:


function z = cero(x0)

for k = 1: 100
1.6. ESTRUCTURAS DE PROGRAMA Y FUNCIONES 23

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);

1.6.5. 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:

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;
24 INTRODUCCIÓN

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);
Modelos, computadoras y errores

2.1. Modelos y Computadoras

2.2. Serie de Taylor y Errores de Truncamiento

En matemáticas, una serie de Taylor es una representación de una función como una infinita
suma de términos. Estos términos se calculan a partir de las derivadas de la función para un
determinado valor de la variable (respecto de la cual se deriva), lo que involucra un punto
especı́fico sobre la función. Si esta serie está centrada sobre el punto cero, se le denomina
serie de McLaurin.

2.2.1. La serie de Taylor

Si la función f y sus primeras n + 1 derivadas son continuas, en un intervalo que contiene


a y x, entonces el valor de la función esta dado por:

0 1 00 1 000 1
f (x) = f (a)+f (a)(x−a)+ f (a)(x−a)2 + f (a)(x−a)3 +· · ·+ f n (a)(x−a)n (2.1)
2! 3! n!

La cual puede representarse como una sumatoria para N términos mediante

N
X f n (a)
f (x) = (x − a)n
n!
n=0


dn f (x)
donde f 0 (a) = f (x)|x=a y f n (a) = dxn x=a

25
26 MODELOS

Con frecuencia es conveniente simplificar la serie de Taylor definiendo un paso h como


h = x(i+1) − x(i) con a = x(i) . Con esto podemos expresar la serie de Taylor como:

0 1 00 (i) 2 1 000 1
f (x(i+1) ) = f (x(i) ) + f (x(i) )h + f (x )h + f (x(i) )h3 + · · · + f n (x(i) )hn (2.2)
2! 3! n!

2.2.2. Ejemplo 1

Dada la función f (x) = ex hacer la implementación utilizando la serie de Taylor dada por
(2.1) considerando que a = 0.

f 0 (x) = f (x) = ex
df (x)
f 1 (x) = = ex
dx
d2 f (x)
f 2 (x) = = ex
dx2
d3 f (x)
f 3 (x) = = ex
dx3
d4 f (x)
f 4 (x) = = ex
dx4

Hacemos la evaluación de la derivadas en a = 0


Orden n f n (a) f n (0)
0 ex 1
1 ex 1
2 ex 1
3 ex 1
.. .. ..
. . .
N ex 1
Sustituyendo en la ecuación (2.1) tenemos

0 1 00 1 000 1
ex = f (a) + f (a)(x − a) +
f (a)(x − a)2 + f (a)(x − a)3 + · · · + f n (a)
2! 3! n!
1 1 1
e = 1 + 1 × (x − 0) + × 1 × (x − 0) + × 1 × (x − 0) + × 1 × (x − 0)4 + · · ·
x 2 3
2! 3! 4!
2.2. SERIE DE TAYLOR Y ERRORES DE TRUNCAMIENTO 27

La aproximación polinomial final, para la función ex es:

x2 x3 x4 x5 x6 x7
ex = 1 + x + + + + + + + ···
2! 3! 4! 5! 6! 7!

En forma compacta podemos representar la serie como:

N
x
X xk
e =
k!
k=0

La implementación en Matlab es:


function y = exponencial(x)
y =0;
for k= 0:40
y = y + x.^k/factorial(k);
end;
Ver exponencial.m

2.2.3. Ejemplo 2

Dada la función f (x) = cos(x) hacer la implementación utilizando la serie de Taylor dada
por (2.1) considerando que a = 0.

f 0 (x) = f (x) = cos(x)


df (x)
f 1 (x) = = −sin(x)
dx
d2 f (x)
f 2 (x) = = −cos(x)
dx2
d3 f (x)
f 3 (x) = = −sin(x)
dx3
d4 f (x)
f 4 (x) = = −cos(x)
dx4

Sustituyendo para x = a = 0
28 MODELOS

Orden n f n (a) f n (0)


0 cos(a) 1
1 −sen(a) 0
2 −cos(a) -1
3 sen(a) 0
4 cos(a) 1
5 −sen(a) 0
6 −cos(a) -1
7 sen(a) 0
8 cos(a) 1
9 −sen(a) 0
10 −cos(a) -1

La aproximación polinomial final, para la función coseno es:

x2 x4 x6 x8 x10
cos(x) = 1 − + − + −
2! 4! 6! 8! 10!

En forma compacta podemos representar la serie como:

N
X (−1)k x2k
cos(x) =
(2k)!
k=0

La implementación en Matlab es:

function y = coseno(x)
y =0;
N=80
for k= 0:N
y = y + (-1)^k*x.^(2*k)/factorial(2*k);
end;
end

Ver coseno.m

En la Figura 2.3 podemos ver la gráfica generada por nuestra función coseno marcada
con +, sobre impuesta a la gráfica de la función cos(x) de Matlab. Note la cálida de la
aproximación.
2.2. SERIE DE TAYLOR Y ERRORES DE TRUNCAMIENTO 29

Figura 2.3: Implementación de la función coseno utilizando serie de Taylor

2.2.4. Ejemplo 3

Utilizar los términos de la serie de Taylor para n = 0 hasta 6, para aproximar la función
f (x) = cos(x) en x(i+1) = π/3 y como condición inicial sus derivadas en x(i) = π/4.
Para nuestra implementación tenemos que el incremento h = π/3 − π/4 = π/12. La apro-
ximación en serie de Taylor utilizando (2.2) es:

0 1 00 (i) 2 1 000 1
f (x(i+1) ) = f (x(i) ) + f (x(i) )h + f (x )h + f (x(i) )h3 + · · · + f n (x(i) )hn
2! 3! n!

Sustituyendo valores tenemos

π  0
 π  π 1 00  π   π 2 1 000  π   π 3 1  π   π n
f (x(i+1) ) = f +f + f + f +· · ·+ f n
4 4 12 2! 4 12 3! 4 12 n! 4 12

La cual puede ser aproximada por la sumatoria

N
(i+1)
X 1 n  π   π n
f (x )= f
n! 4 12
n=0
30 MODELOS

La evaluación para diferentes valores de n es

N =0
f (x(i+1) ) = 0.7071
N =1
π
f (x(i+1) ) = 0.7071 + (−0.7071) × = 0.5219
12
N =2
(i+1) π 1  π 2
f (x ) = 0.7071 + (−0.7071) × + × (−0.7071) = 0.4977
12 2 12

Los valores de las derivadas y el error de aproximación se presenta en la siguiente ta-


bla.
Orden n f n ( π4 ) f (x(i+1) ) error ( %)
0 cos(π/4) 0.707106781 -41.4
1 -sen(π/4) 0.521986659 -4.4
2 -cos(π/4) 0.497754491 0.449
3 sen(π/4) 0.499869147 2.62x10-2
4 cos(π/4) 0.500007551 -1.51x10-3
5 -sen(π/4) 0.500000304 -6.08x10-5
6 -cos(π/4) 0.499999988 2.40x10-6
Note, que a medida que se introducen más términos, la aproximación se vuelve más exacta
y el porcentaje de error disminuye.

2.2.5. Ejemplo 4

Hacer la implementación en Serie de Taylor para la función f (x) = sen(x).


De acuerdo con lo anterior la serie de Taylor para el seno esta dada como

x3 x5 x7 x9
sen(x) = x − + − + + ···
3! 5! 7! 9!

N
X (−1)k x2k+1
sen(x) =
(2k + 1)!
k=0

La implementación en Matlab es:


2.2. SERIE DE TAYLOR Y ERRORES DE TRUNCAMIENTO 31

function y = seno(x)
y = 0;
N = 40;
for k= 0:N
y = y + (-1)^k*x.^(2*k+1)/factorial(2*k+1);
end
end
ver seno.m

2.2.6. Uso de la serie de Taylor para estimar errores de Truncamien-


to

La serie de Taylor es muy útil para hacer la estimación de errores de truncamiento. Esta
estimación ya la realizamos en los ejemplos anteriores. Recordemos que la serie de Taylor
la podemos representar como:

0 1 00 1
v(xi+1 ) = v(xi ) + v (xi )(xi+ − xi ) + v (xi )(xi+ − xi )2 + · · · + v n (xi )(xi+ − xi )n
2! n!

Ahora, truncando la serie después del término con la primera derivada, se obtiene:

0
v(xi+1 ) = v(xi ) + v (xi )(xi+ − xi ) + R1

Despejando el valor de v 0 , tenemos:

0 v(xi+1 ) − v(xi ) R1
v (xi ) = −
(xi+ − xi ) (xi+ − xi )

El primer término de la ecuación represente la aproximación de la derivada y el segundo el


error de truncamiento. Note que el error de truncamiento se hace más pequeño a medida
que xi+1 –xi (incremento) se hace pequeño. Ası́ que podemos hacer una buena aproxima-
ción de derivadas utilizando el primer término, siempre y cuando se utilicen incrementos
pequeños
32 MODELOS
Solución de Ecuaciones no-lineales

3.1. Método Gráfico

Un método simple para obtener, visualmente la raı́z de la ecuación f (x) = 0, consiste en


graficar la función y observar en donde cruza el eje x. Este punto que representa el valor
de x para el cual f (x) = 0, proporciona una aproximación inicial de la raı́z.

3.1.1. Ejemplo

Utilice el método gráfico para observar algunas de las raı́ces de la función f (x) = sen10x +
cos3x, en el intervalo [0, 5]

1.5

0.5
f(x)

−0.5

−1

−1.5

−2
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
x

Figura 3.4: Método Gráfico

33
34 SE NO LINEALES

En la Figura 3.4 se muestran los cruces por cero de la función en el intervalo dado.

3.1.2. Implementación

La implementación en Matlab es
function Metodo_Grafico(funcion, x)
f = funcion;
y = f(x);
plot(x, y);
xlabel(’x’);
ylabel(’f(x)’)
grid on
Ver Metodo Grafico.m. La implementación de la función
function y = f1(x)
y = sin (10*x) + cos(3*x);
La corrida del método es
Metodo_Grafico(@f1, 0:0.01:5)

3.2. Método de Bisección

Para este método debemos considerar una función continua dentro de un intervalo [a, b] tal
que f (a) tenga diferente signo f (a) ∗ f (b) < 0.
El proceso de decisión para encontrar la raı́z consiste en dividir el intervalo [inicio, f in] a
la mitad mitad = (inicio + f in)/2 y luego analizar las tres posibilidades que se pueden
dar.
1. Si f (inicio) y f (mitad) tienen signos opuestos, entonces hay un cero entre [inicio, mitad].
2. Si f (mitad) y f (f in) tienen signos opuestos, entonces, hay un cero en [mitad, f in].
3. Si f (mitad) es igual a cero, entonces mitad es un cero
La implementación en Matlab es:
function r = Biseccion(f, inicio, fin)
mitad = 0;
while abs((fin - inicio)/fin) > 0.0001
mitad = (fin+inicio)/2.0;
3.2. MÉTODO DE BISECCIÓN 35

if(f(mitad) == 0)
r = mitad;
return;
end;

if f(inicio)*f(mitad) < 0
fin = mitad;
else
inicio = mitad;
end;
end;

r= mitad;

3.2.1. Ejemplo

Calcular los ceros de la función f (x) = x − cos(x) utilizando el algoritmo de Bisección en


el intervalo [0, 1].

iter a c b f(a) f( c) f(b)


0 0.000000 0.500000 1.000000 -1.000000 -0.377583 0.459698
1 0.500000 0.750000 1.000000 -0.377583 0.018311 0.459698
2 0.500000 0.625000 0.750000 -0.377583 -0.185963 0.018311
3 0.625000 0.687500 0.750000 -0.185963 -0.085335 0.018311
4 0.687500 0.718750 0.750000 -0.085335 -0.033879 0.018311
5 0.718750 0.734375 0.750000 -0.033879 -0.007875 0.018311
6 0.734375 0.742188 0.750000 -0.007875 0.005196 0.018311
7 0.734375 0.738281 0.742188 -0.007875 -0.001345 0.005196
8 0.738281 0.740234 0.742188 -0.001345 0.001924 0.005196
9 0.738281 0.739258 0.740234 -0.001345 0.000289 0.001924
10 0.738281 0.738770 0.739258 -0.001345 -0.000528 0.000289
11 0.738770 0.739014 0.739258 -0.000528 -0.000120 0.000289
12 0.739014 0.739136 0.739258 -0.000120 0.000085 0.000289
13 0.739014 0.739075 0.739136 -0.000120 -0.000017 0.000085

Para ver los resultados correr

Biseccion(@f2, 0, 1)
36 SE NO LINEALES

3.3. Método de la falsa posición (Regula Falsi)

Una de las razones de la introducción de este método es que la velocidad de convergencia


del método de Bisecciones es bastante baja. En el método de Bisección se usa el punto
medio del intervalo [a, b] para llevar a cabo el siguiente paso. Suele conseguirse una mejor
aproximación usando el punto [c, 0] en el que la recta secante L, que pasa por los puntos
[a, f (a)] y [b, f (b)].
En la Figura 3.5 se puede ver como funciona el método. En esta figura en azul esta la
función de la cual queremos calcular el cruce por cero y en negro dos lı́neas rectas que
aproximan la solución.

Figura 3.5: Método Regula Falsi

Para calcula la ecuación de la lı́nea secante hacemos

p1 = [a, f (a)]
p2 = [b, f (b)]

y sustituimos en la ecuación de la lı́nea recta.

y–f (a) = (f (b)–f (a)) ∗ (x–a)/(b–a)

El cruce por cero de esta ecuación esta en


3.3. MÉTODO DE LA FALSA POSICIÓN (REGULA FALSI) 37

c = a–f (a) ∗ (b − a)/(f (b)–f (a))

Entonces el método de Bisecciones puede ser modificado, en lugar de calcular c = (a + b)/2


hacemos c = a–f (a)∗(b−a)/(f (b)–f (a)) y aplicamos las mismas tres reglas de la Bisección.
La implementación en Matlab es:

function r = Regula_Falsi(f, a, b)

while abs((b - a)/a) > 0.0001


c = a - f(a)*(b-a)/(f(b) - f(a));

if(f(c) == 0)
r = c;
return;
end;

if f(a)*f(c) < 0
b = c;
else
a = c;
end;
end;

r= c;

Para ejecutar hacer

Regula_Falsi(@f2, 0, 1)

3.3.1. Ejemplo

Calcular los ceros de la función f (x) = x − cos(x) utilizando el algoritmo de regula falsi en
el intervalo [0, 1].
38 SE NO LINEALES

iter. a c b f(a) f(c ) f(b)


0 0.0000 0.6851 1.0000 -1.0000 -0.0893 0.4597
1 0.6851 0.7363 1.0000 -0.0893 -0.0047 -0.0893
2 0.7363 0.7389 1.0000 -0.0047 -0.0002 -0.0047
3 0.7389 0.7391 1.0000 -0.0002 0.0000 -0.0002
4 0.7391 0.7391 1.0000 0.0000 0.0000 0.0000
5 0.7391 0.7391 1.0000 0.0000 0.0000 0.0000
6 0.7391 0.7391 1.0000 0.0000 0.0000 0.0000

3.4. Método de iteración de punto fijo

Los métodos de punto fijo son métodos que predicen la raı́z de la ecuación a partir de una
formula dada. La formula puede ser desarrollada por una sustitución sucesiva al rearreglar
la ecuación f (x) = 0 de tal modo que x quede del lado izquierdo de la ecuación

f (x) ≡ x − g(x) = 0

Lo que es igual a

x = g(x)

Esta transformación se puede llevar a cabo mediante operaciones algebraicas o simplemente


agregando x a cada lado de la ecuación original. Por ejemplo:

x2 − 2x + 3 = 0
x2 + 3
x=
2
x = g(x)

mientras que sen(x) = 0 puede transformarse haciendo

x = sen(x) + x

Las iteraciones del método dado un punto inicial x0 , se pueden llevar a cabo calculando
xk+1

xk+1 = g(xk )
3.4. MÉTODO DE ITERACIÓN DE PUNTO FIJO 39

La implementación en Matlab es:


function r = Punto_Fijo(g, x1)

while 1
x2 = g(x1)
error = abs((x2-x1)/x2);
if(error < 0.0001) break
else x1 = x2;
end;
end;
r = x2;

3.4.1. Ejemplo

Utilizando la iteración de punto fijo calcular las raı́ces f (x) = e−x − x, para un valor inicial
x0 = 0.
De acuerdo con lo revisado la función g(x) = e−x y las iteraciones hasta convergencia
son:
k xk error(xk )
1 1.0000 1.0000
2 0.3679 1.7183
3 0.6922 0.4685
4 0.5005 0.3831
5 0.6062 0.1745
6 0.5454 0.1116
7 0.5796 0.0590
8 0.5601 0.0348
9 0.5711 0.0193
.. .. ..
. . .
19 0.5672 6.7008e-05
Para hacer la ejecución correr:
Punto_Fijo(@g1, 0)
con
function y = g4(x)

y = exp(-x);
40 SE NO LINEALES

3.4.2. Ejemplo

Calcular utilizando iteración de punto fijo, un cero de la función f (x) = sen(10x) +


cos(3x)
Para llevar a cabo la iteración de punto fijo hacemos

x = sen(10x) + cos(3x) + x

La implementación en Matlab es
function y = g1(x)

y = sin(10*x)+cos(3*x) +x;
Para ejecutar hacer:
Punto_Fijo(@g1, 0)

3.5. Método de Newton-Raphson

Dada una función f (x) : R → R continua, con un valor inicial x0 cerca de una raı́z x∗ y si la
derivada f 0 (x) existe, entonces puede utilizarse esta información para desarrollar algoritmos
que produzcan sucesiones xk que converjan a x∗ más rápidamente que los algoritmos como
los vistos en la secciones anteriores.
El método considera que dada una función f (x), podemos hacer una representación lineal
utilizando la serie de Taylor. Ası́ la representación lineal en Serie de Taylor es:

f (xk+1 ) = f (xk ) + f 0 (xk )(xk+1 − xk ) + R1

Si de la ecuación anterior despejamos el valor de xk+1 , suponemos que fk+1 = 0 y despre-


ciamos el residuo R1 , tenemos que la sucesión x0 , x1 , x2 , . . . , xk que nos lleva a la solución,
esta dada por:

f (xk )
xk+1 = xk −
f 0 (xk )

La implementación del Método en Matlab es:


3.6. APLICACIONES 41

function r = Newton_Raphson(f, df, x1)

while 1
x2 = x1 - f(x1)/df(x1)
if abs((x2-x1)/x2) < 0.0001 break;
else x1 = x2;
end;
end;
r = x2;

3.5.1. Ejemplo

Calcular los ceros de la función f (x) = x − cos(x) utilizando el algoritmo de Newton


Raphson con x0 = 0.
k xk
0 0.0000
1 1.0000
2 0.7504
3 0.7391
4 0.7391
5 0.7391
6 0.7391
7 0.7391
En estas Figura 3.6 se muestra tres iteraciones del método. En la figura de la izquierda
mostramos la lı́nea recta que es tangente a la función f (x) (en negro) en x0 = 0, note que la
lı́nea recta cruza el eje x en x1 = 1. En el centro la tenemos la segunda iteración tomando
como valor inicial x1 = 1 y solución x2 = 0.7504. Finalmente a la izquierda tenemos la linea
recta y la solución para x3 = 0.7391. Note como poco a poco se acerca a la solución.
Para correr este ejemplo dar:
Newton_Raphson(@f2, @df2, 0)

3.6. Aplicaciones

3.6.1. Cálculo de la Raiz Cuadrada

Hacer un algoritmo iterativo que permita hacer el cálculo de la raı́z cuadrada de A.


42 SE NO LINEALES

(a) x0 = 0 (b) x1 = 1 (c) x2 = 0.7391

Figura 3.6: Iteraciones del Método de Newton-Raphson

2
√ caso nuestra función a resolver es f (x) = x − A. La solución cuando f (x) = 0
Para este
es x = A. Para nuestro calculo hacemos

f (x) = x2 − A
f 0 (x) = 2x

Los cálculos numéricos suponiendo para calcular la raı́z cuadrada de 5 son:

k xk
0 2.0000
1 2.2500
2 2.2361
3 2.2361
4 2.2361
5 2.2361
6 2.2361
7 2.2361
8 2.2361
9 2.2361
10 2.2361

Para ver la ejecución dar

Newton_Raphson(@f3, @df3, 2)

Si para este ejemplo ponemos sustituimos en la formulación original los valores de la deri-
vada y de la función tenemos:
3.6. APLICACIONES 43

f (xk ) x2k − A
xk+1 = xk − = x k −
f 0 (xk ) 2xk

Reduciendo términos tenemos

x2k + A
xk+1 =
2xk

La función en Matlab queda:


function y = Raiz_Cuadrada(A)
r = A;
while abs(r*r - A) > 0.00001
r = (r*r+A)/(2*r);
end;

3.6.2. Solución de un circuito con un diodo

Consideremos un circuito de corriente alterna formado por una fuente, una resistencia y
un diodo tal como se muestra en la figura 3.7.

Figura 3.7: Circuito de corriente alterna con un diodo

La ecuación que modela al diodo esta dada por (3.3) y la curva se muestra en la figura
3.8:

id = Is (evd /Vt − 1) (3.3)

donde Is = 1−12 y Vt = 25.85−3


44 SE NO LINEALES

155
x 10
12

10

6
Id

0
5 5.5 6 6.5 7 7.5 8 8.5 9 9.5 10
Vd

Figura 3.8: Comportamiento del diodo

Para este ejemplo la ecuación que hay que resolver es:

V (t) − Ri(t) − Vd (t) = 0


 log(Id (t)/Is + 1) ∗ Vt Si Id (t) ≥ 0
Vd (t) =
V sino Id(t) < 0

La solución implementada se muestra en el siguiente código y la solución se muestra en la


Fig. 3.9
function Simula_Circuito_Diodo()
% Paramentros del Cicuito

Vmax = 10; % Volts;


R = 1.8; % ohms

%tiempo de evaluación
t = [0:0.001:0.1];
%Voltaje en función del tiempo
v = Vmax*sin(377*t);
3.6. APLICACIONES 45

for k = 1:length(t)
I(k) = ReglaFalsa(@Circuito_Diodo, -Vmax/R, Vmax/R, [v(k), R]);
end

plot(t, v, t, I);
title(’Solución de un circuito con Diodo’);
xlabel(’tiempo s’);
legend(’Voltaje’, ’Corriente’);
end

function di = Circuito_Diodo(I, p)
V = p(1);
R = p(2);
di = V - R*I - Vd(V, I);
end

function r = ReglaFalsa(f, a, b, p)
%ReglaFalsa(f, a, b, p)
% f : función a evaluar
% a : inicio del intervalo
% b : fin frl intervalo
% p : parametros

while 1
c = a - f(a,p)*(b-a)/(f(b,p) - f(a,p));
if(abs(f(c,p)) <= 1e-06)
break;
end;
if f(a,p)*f(c,p) < 0
b = c;
else
a = c;
end;
end;
r = c;
end

function V = Vd(Vf, I)
% V = Vd(Vf, I)
46 SE NO LINEALES

% Vf voltaje de la Fuente
% I Corriente en el circuito

Is = 1e-12;
Vt = 25.85e-3;

if I>=0
V = log(I/Is+1)*Vt;
else
V = Vf;
end
end

Solución de un circuito con Diodo


10
Voltaje
Corriente
8

−2

−4

−6

−8

−10
0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1
tiempo s

Figura 3.9: Solución al circuito con diodo

3.6.3. Solución del problema de flujos de Pontencia

Se tiene un circuito formado por tres elementos: una fuente de voltaje V , una resistencia R
y una carga PL en una combinación en serie. Dados los valores V = 10 volts, R = 2 ohms
y PL = 12 Wats, calcular la corriente que circula por el circuito.

La ecuación de voltaje del circuito es:


3.6. APLICACIONES 47

V − Ri − VL = 0

multiplicado por la corriente i en el circuito tenemos

V i − Ri2 − PL = 0

La solución implementada es:


function Simula_Flujos_Potencia()
% Parametros del Cicuito

V = 20; % Volts
R = 2; % ohms
P = 12; % Watts

fprintf(’La solución es %10.6f\n’, NR(@fp, @der_fp, V/R, [V, R, P]));


end

function d = fp(I, p)
V = p(1);
R = p(2);
PL = p(3);
d = V*I - R*I*I - PL;
end

function der = der_fp(I, p)


V = p(1);
R = p(2);
PL = p(3);
der = V-2*R*I;
end

function r = NR(f, df, x1, p)


k=1;
while 1
x2 = x1 - f(x1, p)/df(x1, p);
if abs(f(x2, p)) < 1e-6 break;
else x1 = x2;
end;
k = k+1;
48 SE NO LINEALES

end;
r = x2;
end
La solución obtenida de la corrida es:
>> Simula_Flujos_Potencia
La solución es 3.000000

3.7. Evaluación de Polinomios

Consideremos como ejemplo el siguiente polinomio.

f3 (x) = a0 + a1 x + a2 x2 + a33

En este caso los coeficientes del polinomio los podemos poner en un vector de datos dado co-
mo a = [a0, a1, a2, a3], y realizar la evaluación polinomial utilizando ciclos. Adicionalmente
necesitamos de una función que nos permita calcular la potencias de x.
Manipulando el polinomio, podemos dar una forma eficiente de realizar la evaluación. Ası́
el mismo polinomio, lo podemos representar como:

f3 (x) = a0 + x(a1 + x(a2 + xa3 ))

De manera general podemos expresar como

fN (x) = a0 + x(a1 + x(a2 + · · · + x(aN −1 + x(aN ))))

Note que ahora ya no tenemos potencia de x y su implementación resulta mas eficiente. La


implementación en Matlab es:
function y = Evalua_Polinomio(x, a)

n = length(a);
p = 0.0;

for i=n:-1: 1
p = p.*x + a(i);
end
3.7. EVALUACIÓN DE POLINOMIOS 49

y = p;

3.7.1. Ejemplo

Consideremos el siguiente polinomio f2 (x) = 1 + 2x + 3x2, el cual deseamos evaluar en


x = 20. Para implementarlo hacemos
i p = p ∗ x + ai p=0
2 p = 0 ∗ 20 + 3 p=3
1 p = 3 ∗ 20 + 2 p = 62
0 p = 62 ∗ 20 + 1 p = 1241

3.7.2. Ejemplo

Hacer la evaluación del polinomio f5 (x) = x5 − 3.5x4 + 2.75x3 + 2.125x2 − 3.875x + 1.25
en x = 2.5
i p = p ∗ x + ai p=0
5 p = 0.000000 ∗ 2.500000 + 1.000000 1.000000
4 p = 1.000000 ∗ 2.500000 − 3.500000 -1.000000
3 p = −1.000000 ∗ 2.500000 + 2.750000 0.250000
2 p = 0.250000 ∗ 2.500000 + 2.125000 2.750000
1 p = 2.750000 ∗ 2.500000 − 3.875000 3.000000
0 p = 3.000000 ∗ 2.500000 + 1.250000 8.750000

3.7.3. Cálculo de derivadas

Cuando se buscan los ceros de una función, como es el caso del método de Newton, es
necesario no solo hacer la evaluación del polinomio sino calcular también su derivada. En
este caso la derivada de cualquier polinomio la podemos calcular como:

fn (x) = a0 + a1 x + a2 x2 + a3 x3 + · · · + an−1 xn−1 + an xn

fn0 (x) = a1 + 2a2 x + 3a3 x2 + · · · + (n − 1)an−1 xn−2 + nan xn−1

Note que el polinomio f 0 n(x) es un polinomio de menor grado.


Los coeficientes a del polinomio original pueden tomarse para calcular los coeficiente del
nuevo polinomio, para esto tomamos en cuenta lo siguiente
50 SE NO LINEALES

a = [a0 , a1 , a2 , a3 , a4 , · · · , an−1 , an ]

a0 = [a1 , 2a2 , 3a3 , 4a4 , · · · , (n − 1)an−1 , nan ]

Con esto tenemos que dado a los coeficientes de del polinomio de derivadas pueden ser cal-
culados y la evaluación de la derivada se reduce a una simple evaluación polinomial.
Ası́ por ejemplo considerando el polinomio f3 (x) = 1 + 2x + 3x2 + 4x3 , tenemos que
a = [1, 2, 3, 4] y los coeficiente de f30 (x) son a0 = [2, 6, 12]. La evaluación del polinomio
resultante lo podemos hacer para x = 20 utilizando:
i p = p ∗ x + a0i p
2 0*20 +12 12
1 12*20 + 6 246
0 246*20 + 2 4922

3.7.4. Ejemplo

Dado el polinomio de la serie de Taylor correspondiente a la función f (x) = seno(x), hacer


la evaluación de la derivada en x = 0.5.
El polinomio de la serie de Taylor para seno es:

x3 x5 x7 x9
f (x) = x − + − + + ···
3! 5! 7! 9!

Los coeficientes de este polinomio son a = [0, 1, 0, −1/3!, 0, 1/5!, 0, −1/7!, 0, 1/9!], por lo
tanto los coeficientes para la derivada son a∗ = [1, 0, −3/3!, 0, 5/5!, 0, −7/7!, 0, 9/9!]
i p = p ∗ x + a∗i p
8 p = 0.000000 ∗ 0.500000 + 0.000025 0.000025
7 p = 0.000025 ∗ 0.500000 + 0.000000 0.000012
6 p = 0.000012 ∗ 0.500000 − 0.001389 -0.001383
5 p = −0.001383 ∗ 0.500000 + 0.000000 -0.000691
4 p = −0.000691 ∗ 0.500000 + 0.041667 0.041321
3 p = 0.041321 ∗ 0.500000 + 0.000000 0.020660
2 p = 0.020660 ∗ 0.500000 − 0.500000 -0.489670
1 p = −0.489670 ∗ 0.500000 + 0.000000 -0.244835
0 p = −0.244835 ∗ 0.500000 + 1.000000 0.877583
La implementación en Matlab es
3.7. EVALUACIÓN DE POLINOMIOS 51

function y = Evalua_Derivada(x, a)

N = length(a);
b = a(2:N).*[1:N-1];

y = Evalua_Polinomio(x, b);

end

3.7.5. Calculo de la integral

Dado un polinomio de grado fn (x)

fn (x) = a0 + a1 x + a2 x2 + a3 x3 · · · + an−1 xn−1 + an xn

La integral de fn (x) se calcula de manera analı́tica como


Z
a1 2 a2 3 a3 4 an−1 n an n+1
f (x)dx = CT E + a0 x + x + x + x ··· + x + x
2 3 4 n n+1

Note que los coeficiente del nuevo polinomio a∗ pueden calcularse a partir de los coeficientes
a de polinomio original :

a = [a0 , a1 , a2 , a3 , a4 , · · · , an−1 , an ]

a∗ = [CT E, a10 , a21 , a32 , a43 , a54 , · · · , an−1 an


n , n+1 ]

Ası́ la evaluación de la integral del polinomio se reduce a calcular los nuevos coeficientes
del nuevo polinomio y hacer la evaluación del nuevo polinomio con coeficientes a∗ .
En el caso de tener una integral definida debemos notar:

x1
an n+1 x1
Z  
a1 2 a2 3 a3 4 an−1 n
f (x)dx = CT E + a0 x + x + x + x · · · + x + x
x0 2 3 4 n n+1
x0

Lo que significa que debemos evaluar el polinomio con coeficientes a∗ en x1 y restar la


evaluación en x2 .
La implementación en Matlab para este queda
52 SE NO LINEALES

function y = Evalua_Integral(x1, x2, a)


N = length(a);
b = [0, a./[1:N]];
y = Evalua_Polinomio(x2, b) - Evalua_Polinomio(x1, b);
end

3.7.6. Ejemplo

Para la serie de Taylor de la función seno hacer la evaluación de la integral:

Z π/2
sin(x)dx
0

El polinomio de la serie de Taylor para seno es:

x3 x5 x7 x9
f (x) = x − + − + + ···
3! 5! 7! 9!

Los coeficientes de este polinomio son a = [0, 1, 0, −1/3!, 0, 1/5!, 0, −1/7!, 0, 1/9!], por lo
tanto los coeficientes para la integral serán :

−1 −1
a∗ = [0, 0, 21 , 0, 4×3! 1
, 0, 6×5! , 0, 8×7! 1
, 0, 10×9! ]

a∗ = [0, 0, 0.5, 0, −0.041667, 0, 0.001389, 0, −0.000025, 0]

La evaluación del polinomio es x = π/2 con los coeficientes a∗ se muestra a continuación y


la evaluación con x = 0 .
i p = p ∗ x + a∗i p
10 p = 0.000000 * 1.570796 + 0.000000 0.000000
9 p = 0.000000 * 1.570796 + 0.000000 0.000000
8 p = 0.000000 * 1.570796 - 0.000025 -0.000024
7 p = -0.000024 * 1.570796 + 0.000000 -0.000038
6 p = -0.000038 * 1.570796 + 0.001389 0.001329
5 p = 0.001329 * 1.570796 + 0.000000 0.002088
4 p = 0.002088 * 1.570796 - 0.041667 -0.038387
3 p = -0.038387 * 1.570796 + 0.000000 -0.060297
2 p = -0.060297 * 1.570796 + 0.500000 0.405285
1 p = 0.405285 * 1.570796 + 0.000000 0.636620
0 p = 0.636620 * 1.570796 + 0.000000 1.000000
3.7. EVALUACIÓN DE POLINOMIOS 53

i p = p ∗ x + a∗i p
10 p = 0.000000 * 0.000000 + 0.000000 0.000000
9 p = 0.000000 * 0.000000 + 0.000000 0.000000
8 p = 0.000000 * 0.000000 - 0.000025 -0.000025
7 p = -0.000025 * 0.000000 + 0.000000 0.000000
6 p = 0.000000 * 0.000000 + 0.001389 0.001389
5 p = 0.001389 * 0.000000 + 0.000000 0.000000
4 p = 0.000000 * 0.000000 - 0.041667 -0.041667
3 p = -0.041667 * 0.000000 + 0.000000 0.000000
2 p = 0.000000 * 0.000000 + 0.500000 0.500000
1 p = 0.500000 * 0.000000 + 0.000000 0.000000
0 p = 0.000000 * 0.000000 + 0.000000 0.000000
Con esto tenemos que el valor de la integral es igual a 1 − 0 = 1.

La solución en Matlab queda

>> a = [0, 1, 0, -1/factorial(3), 0, 1/factorial(5),


0, -1/factorial(7), 0, 1/factorial(9)]

>> Evalua_Integral(0, pi/2, a)

ans =

1.0000

3.7.7. Ejemplo cálculo de raı́ces de un polinomio

Dado un polinomio de grado n

fn (x) = a0 + a1 x + a2 x2 + ... + an xn .

es posible realizar una factorización de la siguiente forma

fn (x) = (x + s) ∗ (a00 + a01 x + a02 x2 + ... + a0n−1 xn−1 ).

y podemos comprobar que tenemos un monomio de la forma x − s, si evaluando la función


fn (x) en x = −s, el resultado es fn (−s) = 0. Una manera de resolverlo es utilizar un
método de prueba que serı́a la manera mas tediosa.
54 SE NO LINEALES

El problema lo podemos solucionar utilizando el método de Newton-Raphson, sin embargo


hay que hacer un pequeño cambio en la formulación dado que el argumento de la función
es negativo. A partir de la serie de Taylor tenemos:

f (x(k+1) ) ≈ f (x(k) ) + f 0 (x(k) )(x(k+1) − x(k) ) = 0

haciendo x(k) = −s(k) tenemos

f (−s(k+1) ) ≈ f (−s(k) ) + f 0 (−s(k) )(−s(k+1) + s(k) ) = 0

Despejando para s(k+1) tenemos la iteración de Newton-Raphson para este problema.

f (−s(k) )
s(k+1) = s(k) +
f 0 (−s(k) )

Para hacer la solución más eficiente evaluaremos la función utilizando evaluación polinomial
tanto para la función como para la derivada.

function sn = factor_NR(s0, a)
% factor_NR(s0, a) Calcula el factor (x+s) de un polinomio con
% coeficiente a dado un valor inicial s0 mediante el
% metodo de Newton-Raphson

for iter = 1: 100000


sn = s0 + Evalua_Polinomio(-s0, a)/Evalua_Derivada(-s0, a);

if abs(Evalua_Polinomio(sn, a)) < 1e-6


break;
else
s0 = sn
end
end;
end

Como ejemplo numérico calculamos la raı́z del polinomio f6 (x) = x6 −1 con un valor inicial
s(0) = 10
3.8. DEFLACIÓN DE POLINOMIOS Y DIVISIÓN DE POLINOMIOS 55

999999.000000
s1 = 10.000000 + −600000.000000 = 8.333335

334897.378558
s2 = 8.333335 + −241126.784337 = 6.944450

112156.191251
s3 = 6.944450 + −96903.735989 = 5.787052

37560.618299
s4 = 5.787052 + −38943.785362 = 4.822569

12578.711852
s5 = 4.822569 + −15651.050576 = 4.018871

4212.321940
s6 = 4.018871 + −6290.306217 = 3.349218

1410.434918
s7 = 3.349218 + −2528.533032 = 2.791411

472.088718
s8 = 2.791411 + −1016.880869 = 2.327159

157.838757
s9 = 2.327159 + −409.526161 = 1.941741

52.597923
s10 = 1.941741 + −165.618133 = 1.624156

17.355481
s11 = 1.624156 + −67.809321 = 1.368210

5.560199
s12 = 1.368210 + −28.768380 = 1.174936

1.630779
s13 = 1.174936 + −13.434500 = 1.053548

0.367497
s14 = 1.053548 + −7.787952 = 1.006360

0.038774
s15 = 1.006360 + −6.193251 = 1.000100

0.000598
s16 = 1.000100 + −6.002990 = 1.000000

Como resultado tenemos que x6 − 1 = (x + 1)(a5 x5 + a4 x4 + a3 x3 + a2 x2 + a1 x + a0 ).

3.8. Deflación de polinomios y División de Polinomios

La deflación polomial se define como el cálculo de un polinomio de grado fn1 (x) tal que
fn (x) = (x − s) ∗ fn−1 (x). Para esto suponga que conoce, una de las raı́ces de un polinomio
56 SE NO LINEALES

y que podemos realizar la división de este polinomio para obtener un polinomio de grado
menor. Ası́ por ejemplo si tenemos

fn (x) = a0 + a1 x + a2 x2 + ... + an xn .

Y una de sus raı́ces es s, entonces podemos escribir

fn (x) = (x + s) ∗ (a00 + a01 x + a02 x2 + ... + a0n−1 xn−1 ).

En este caso el residuo de la división es cero y podemos calcular un polinomio de grado


n − 1. Para un polinomio de orden 3 tenemos que
a3 x2 (a2 − a3 s)x a1 − (a2 − a3 s)s
x+s a3 x3 +a2 x2 +a1 x +a0
−a3 x3 −a3 sx2
0 (a2 − a3 s)x2 +a1 x +a0
−(a2 − a3 s)x2 −(a2 − a3 s)sx
0 (a1 − (a2 − a3 s)s)x +a0
−(a1 − (a2 − a3 s)s)x −(a1 − (a2 − a3 s)s)s
0 a0 − (a1 − (a2 − a3 s)s)s
La división sintética, es una manera de hacer lo mismo, pero de forma compacta. Ası́
tenemos:
x+s an an−1 an−2 an−3
−an s −(a2 − a3 s)s −(an−2 − (an−1 − san )s)s
an an−1 − an s an−2 − (an−1 − an s)s an−3 − (an−2 − (an−1 − an s)s)s
renombrado términos tenemos

bn = an
bn−1 = an−1 − an s = an−1 − bn s
bn−2 = an−2 − (an−1 − an s)s = an−2 − bn−1 s
.. .
. = ..
b2 = a2 − b3 s
b1 = a1 − b2 s
b0 = a0 − b1 s

La implementación en Matlab es:


3.8. DEFLACIÓN DE POLINOMIOS Y DIVISIÓN DE POLINOMIOS 57

function y = Division_Sintetica (a, s)

n = length(a);
b = zeros(1,n);

b(n) = a(n);

for k= n-1: -1: 1


b(k) = a(k) - b(k+1) * s;
end;

disp(’residuo ’);
disp(b(1));

y = b(2:n);
Y para realizar la ejecución hacemos
Division_Sintetica([-120, -46, 79, -3, -7, 1], -4)

3.8.1. Ejemplo

Dado el polinomio f5 (x) = x5 − 7x4 –3x3 + 79x2 –46x–120 encontrar la división sintética con
el monomio (x − 4).
x−4 1 -7 -3 79 -46 -120
4 -12 -60 76 120
1 -3 -15 19 30 0
Para este ejemplo dar en Matlab
Division_Sintetica([-120, -46, 79, -3, -7, 1], -4)

El resultado es

30 19 -15 -3 1
El polinomio resultante, en este caso, es f4 (x) = x4 − 3x3 –15x2 + 19x + 30. Note que el
residuo es cero y en este caso tenemos una deflación polinomial.
En algunos casos en deseable hacer la división sintética de la función fn (x) entre un po-
linomio de segundo orden de la forma f2 (x) = x2 + rx + s. Aplicando la técnica anterior
podemos realizar la división fn (x)/f2 (x) como
58 SE NO LINEALES

a5 x3 +(a4 − a5 r)x2 +((a3 − sa5 ) − (a4 − a5 r)r)x


x2 + rx + s a5 x5 +a4 x4 +a3 x3 +a2 x2 ...
−a5 x5 −a5 rx4 −a5 sx3
(a4 − a5 r)x4 +(a3 − sa5 )x3 +a2 x2 ...
−(a4 − a5 r)x4 −(a4 − a5 r)rx3 −(a4 − a5 r)sx2 ...
(a3 − sa5 ) − (a4 − a5 r)r +(a2 − (a4 − a5 r)s)x2
Si en la ecuación anterior sustituimos

b5 = a5
b4 = a4 − a5 r = a4 − rb5
b3 = a3 − sa5 − (a4 − a5 r)r = a3 − sb5 − rb4
b2 = a2 − sb4 − rb3
b1 = a1 − sb3 − rb2
b0 = a0 − sb2 − rb1

En general para un polinomio de grado fn (x) tenemos que podemos hacer la división
sintética aplicando la siguiente recurrencia

bn = an
bn−1 = an − rbn
bk = ak − rbk+1 − sbk+2
∀i ∈ {n − 2, n − 3, · · · 1}

Finalmente el residuo de la división se calcula como

R = b1 (x + r) + b0

La implementación en Matlab es:


function [c, r] = Division_Sintetica2(a, r, s)

n = length(a);

b=zeros(n,1);
3.8. DEFLACIÓN DE POLINOMIOS Y DIVISIÓN DE POLINOMIOS 59

b(n) = a(n);
b(n-1) = a(n-1) - r*b(n);

for k=n-2: -1:1


b(k) = a(k) - r*b(k+1) - s*b(k+2);
end;

fprintf(1,’Residuo %6.4f x + %6.4f\n’, b(2), b(1)+r*b(2));

c = b(3:n);
r = [b(2); b(1)+r*b(2)];
end

3.8.2. Ejemplo

Hacer la división sintética del polinomio f3 (x) = x3 − 1, entre el polinomio f2 (x) = x2 +


3x + 4
De acuerdo con la sucesión

b3 = a3 = 1.0
b2 = a2 − rb3 = 0 − (1)(3) = −3
b1 = a1 − rb2 − sb3 = 0 − (3)(−3) − (4)(1) = 5
b0 = a0 − rb1 − sb2 = −1 − (3)(5) − (4)(−3) = −4

El residuo de acuerdo con lo expuesto es

R = b1 (x + r) + b0 = 5(x + 3) − 4 = 5x + 11

La corrida correspondiente en Matlab queda


>> [b, r] = Division_Sintetica2([-1, 0, 0, 1], 3, 4)
Residuo 5.0000 x + 11.0000

b =

-3
1
60 SE NO LINEALES

r =

11
5

3.8.3. Ejemplo

Hacer la división sintética del polinomio f5 (x) = x5 −3.5x4 +2.75x3 +2.125x2 −3.875x+1.25,
entre el polinomio f2 (x) = x2 + x − 2
De acuerdo con la sucesión

b5 = a5 = 1.0
b4 = a4 − rb5 = −3.5 − (1)(1) = −4.5
b3 = a3 − rb4 − sb5 = 2.75 − (1)(−4.5) − (−2)(1) = 2.75 + 6.5 = 9.25
b2 = a2 − rb3 − sb4 = 2.125 − (1)(9.25) − (−2)(−4.5) = −16.125
b1 = a1 − rb2 − sb3 = −3.875 − (1)(−16.125) − (−2)(9.25) = 30.75
b0 = a0 − rb1 − sb2 = 1.25 − (1)(30.75) − (−2)(−16.125) = 61.75

Nuestro residuo queda

R = b1 (x + r) + b0 = 30.75 × (x + 1) + (−61.75) = 30.75x − 31.00

La siguiente tabla muestra el resumen de los coeficientes calculados. Note que el residuo
no es cero.
1 -3.5 2.75 2.125 -3.875 1.25
x2 + x − 2 -1 6.5 -18.25 34.625 -63.00
1 -4.5 9.25 -16.125 30.75 -61.75
La ejecución en Matlab serı́a
[b, r] = Division_Sintetica2([1.25, -3.875, 2.125, 2.75, -3.5, 1], 1, -2)
Residuo 30.7500 x - 31.0000

b =

-16.1250
9.2500
3.8. DEFLACIÓN DE POLINOMIOS Y DIVISIÓN DE POLINOMIOS 61

-4.5000
1.0000

r =

-31.0000
30.7500
Lo cual significa que

x5 − 3.5x4 + 2.75x3 + 2.125x2 − 3.875x + 1.25


= x3 − 4.5x2 + 9.25x − 16.125
x2 + x − 2

3.8.4. Ejemplo

Repetir el problema anterior pero suponiendo que f2 (x) = x2 − x − 2


Pare este ejemplo tenemos la sucesión

b5 = a5 = 1.0
b4 = a4 − rb5 = −3.5 − (−1)(1) = −2.5
b3 = a3 − rb4 − sb5 = 2.75 − (−1)(−2.5) − (−2)(1) = 2.25
b2 = a2 − rb3 − sb4 = 2.125 − (−1)(2.25) − (−2)(−2.5) = −0.625
b1 = a1 − rb2 − sb3 = −3.875 − (−1)(−0.625) − (−2)(2.25) = 0
b0 = a0 − rb1 − sb2 = 1.25 − (−1)(0) − (−2)(−0.625) = 0

1 -3.5 2.75 2.125 -3.875 1.25


x2 − x − 2 1 -0.5 -2.75 3.875 -1.25
1 -2.5 2.25 -0.625 0 0
con un residuo

R = 0 × (x − 1) + 0 = 0
La corrida en Matlab es
[b, r] = Division_Sintetica2([1.25, -3.875, 2.125, 2.75, -3.5, 1], -1, -2)
Residuo 0.0000 x + 0.0000

b =
62 SE NO LINEALES

-0.6250
2.2500
-2.5000
1.0000

r =

0
0

Note que los residuos son iguales a cero, por lo tanto

x5 − 3.5x4 + 2.75x3 + 2.125x2 − 3.875x + 1.25


= x3 − 2.5x2 + 2.25x − 0.625
x2 − x − 2

3.9. Solución de un polinomio de orden 2 en la forma gene-


ral

Un polinomio de segundo orden lo podemos expresar como

f2 (n) = a0 + a1 x + a2 x2

La solución utilizando la formula general tenemos que

p
−a1 ± a21 − 4a2 a0
x=
2a2

Para su implementación en Matlab hacemos

function [x1, x2] = Formula_General(a)


x1 = (-a(2)+ sqrt(a(2)^2 - 4*a(3)*a(1)))/(2*a(3));
x2 = (-a(2)- sqrt(a(2)^2 - 4*a(3)*a(1)))/(2*a(3));
3.10. MÉTODO DE BAIRSTOW PARA LA SOLUCIÓN DE POLINOMIOS 63

3.10. Método de Bairstow para la solución de polinomios

El método de Bairstow es un método iterativo, basado en el método de Newton Raphson.


Dado un polinonio fn (x) se encuentran dos factores, un polinomio cuadrático f2 (x) =
x2 + rx + s y un polinomio fn−2 (x). El procedimiento general para el método de Bairstow
es:
1. Dado fn (x) y r0 y s0
2. Utilizando el método de NR calculamos f2 (x) = x2 + r0 x + s0 y fn−2 (x), tal que, el
residuo de f n(x)/f2 (x) sea igual a cero.
3. Se determinan la raı́ces f2 (x), utilizando la formula general.
4. Se calcula fn−2 (x) = fn (x)/f2 (x)
5. Hacemos fn (x) = fn−2 (x)
6. Si el grado del polinomio es mayor que tres regresamos al paso 2
7. Si no terminamos
La principal diferencia de este método, respecto a otros, es que permite calcular todas las
raı́ces de un polinomio (reales e imaginarias).
Para calcular la división de polinomios, hacemos uso de la división sintética. Ası́ dado

fn (x) = an xn + an−1 xn−1 + . . . + a2 x2 + a1 x + a0

Al dividir entre f2 (x) = x2 –rx–s, tenemos como resultado el siguiente polinomio

fn−2 (x) = bn xn−2 + bn−1 xn−3 + . . . + b3 x + b2

con un residuo R = b1 x + b0 , el residuo será cero solo si b1 y b0 lo son.


Los términos b, los calculamos utilizamos división sintética, la cual puede resolverse utili-
zando la siguiente relación de recurrencia

bn = an
bn−1 = an−1 − rbn
bi = ai − rbi+1 − sbi+2
64 SE NO LINEALES

Una manera de determinar los valores de r y s que hacen cero el residuo es utilizar el
Método de Newton-Raphson. Para ello necesitamos una aproximación lineal de b1 y b0
respecto a r y s la cual calculamos utilizando la serie de Taylor

∂b1 (rk , sk ) ∂b1 (rk , sk )


b1 (rk+1 , sk+1 ) = b1 (rk , sk ) + (rk − rk+1 ) + (sk − sk+1 )
∂r ∂s
∂b0 (rk , sk ) ∂b0 (rk , sk )
b0 (rk+1 , sk+1 ) = b0 (rk , sk ) + (rk − rk+1 ) + (sk − sk+1 )
∂r ∂s

donde los valores de rk y sk están dados y calculamos los nuevos valores rk+1 y sk+1 que
hacen a b1 (rk+1 , sk+1 ) y b0 (rk+1 , sk+1 ) igual a cero. El sistema de ecuaciones que tenemos
que resolver es:

∂b1 (rk , sk ) ∂b1 (rk , sk )


0 = b1 (rk , sk ) + (rk − rk+1 ) + (sk − sk+1 )
∂r ∂s
∂b0 (rk , sk ) ∂b0 (rk , sk )
0 = b0 (rk , sk ) + (rk − rk+1 ) + (sk − sk+1 )
∂r ∂s

En forma matricial tenemos

" #
∂b1 (rk ,sk ) ∂b1 (rk ,sk )   
∂r ∂s drk −b1 (rk , sk )
∂b0 (rk ,sk ) ∂b0 (rk ,sk ) =
dsk −b0 (rk , sk )
∂r ∂s

donde drk = rk − rk+1 y dsk = sk − sk+1

Bairtow muestra que los coeficientes c del polinomio de derivadas parciales fn0 (x) = c0 +
c1 x + c2 x2 + · · · pueden obtenerse haciendo un procedimiento similar a la división sintética,
ası́

cn = bn
cn−1 = bn−1 − rcn
ci = bi − rci+1 − sci+2
3.10. MÉTODO DE BAIRSTOW PARA LA SOLUCIÓN DE POLINOMIOS 65

donde
∂b0 (rk , sk )
= c1 (rk , sk )
∂r
∂b1 (rk , sk )
= c2 (rk , sk )
∂r
∂b0 (rk , sk )
= c2 (rk , sk )
∂s
∂b1 (rk , sk )
= c3 (rk , sk )
∂s

El código en Matlab para implementar la división sintética y calculo de los coeficientes del
polinomio de derivadas es
function [b, c] = Division_Sintetica_Derivadas(a, r, s)

n = length(a);

b=zeros(n,1);
c=zeros(n,1);

b(n) = a(n);
b(n-1) = a(n-1) - r*b(n);
c(n) = b(n);
c(n-1) = b(n-1) - r*c(n);
for k=n-2: -1:1
b(k) = a(k) - r*b(k+1) - s*b(k+2);
c(k) = b(k) - r*c(k+1) - s*c(k+2);
end;
Finalmente el sistema de ecuaciones que debe resolverse es:

    
c2 (rk , sk ) c3 (rk , sk ) drk −b1 (rk , sk )
=
c1 (rk , sk ) c2 (rk , sk ) dsk −b0 (rk , sk )

y cada una de las iteraciones de Newton Raphson

     −1  
rk+1 rk c2 (rk , sk ) c3 (rk , sk ) −b1 (rk , sk )
= −
sk+1 sk c1 (rk , sk ) c2 (rk , sk ) −b0 (rk , sk )

La codificación en Matlab para llevar a cabo este procedimiento es:


66 SE NO LINEALES

function [c, r, s] = Itera_Bairstow(a, r0, s0)

N = length(a);
res =[r0, s0]’;

for k=1:100
[b, c] = Division_Sintetica_Derivadas(a, res(1), res(2));

A = [c(3) c(4); c(2) c(3)];


d = [-b(2); -b(1)];

res = res - inv(A)*d;


if sqrt(norm(d)) < 0.0001 break; end
end;

r = res(1);
s = res(2);
c = b(3:N);

3.10.1. Ejemplo 1

Dado el polinomio f5 (x) = x5 − 3.5x4 + 2.75x3 + 2.125x2 − 3.875x + 1.25, determinar los
valores de r y s que hacen el resido igual a cero. Considere r0 = 1 y s0 = −2.
Solución.
Iteración 1
La división sintética con el polinomio f2 (x) = x2 + x − 2.0 da como resultado

f3 (x) = x3 − 4.5x2 + 9.25x − 16.125

Residuo = [30.75, −61.75]

El polinomio de derivadas es

c = [−257.6250, 108.1250, −43.8750, 16.7500, −5.5000, 1.0000]

Aplicando el método de Newton tenemos


3.10. MÉTODO DE BAIRSTOW PARA LA SOLUCIÓN DE POLINOMIOS 67

     −1    
r1 1 −43.875 16.750 −30.7500 −1.7637
= − =
s1 −2 108.125 −43.875 61.7500 −7.4034

Iteración 2
La división sintética con el polinomio f2 (x) = x2 −1.7637x−7.4034 da como resultado

f3 (x) = x3 − 1.7363x2 + 7.0911x − 1.7768

Residuo = [51.7564, 105.6858]

Los coeficiente del polinomio de derivadas es

c2 = [677.3337, 208.1484, 27.6280, 14.5427, 0.0274, 1.0000]

Aplicando el método de Newton tenemos

     −1    
r2 −1.7637 27.62800 14.5427 −51.75640 −1.7164
= − =
s2 −7.4034 208.1484 27.6280 −105.68578 −3.9343

Iteración 3
La división sintética con el polinomio f2 (x) = x2 −1.7164x−3.9343 da como resultado

f3 (x) = x3 − 1.7836x2 + 3.6229x + 1.3262

Residuo = [12.6547, 28.1881]

Los coeficientes del polinomio de derivadas son

c3 = [195.3505, 65.6792, 13.8350, 7.4418, −0.0672, 1.0000]

Aplicando el método de Newton tenemos

     −1    
r3 −1.7164 13.8350 7.4418 −12.6547 −1.5997
= − =
s3 −3.9343 65.6792 13.8350 −28.1881 −2.4507

En resumen
68 SE NO LINEALES

k r s b1 b0
0 1.0000 - 2.0000 30.7500 -61.7500
1 -1.7637 -7.4034 -61.7500 30.7500
2 -1.7164 -3.9343 105.6858 51.7564
3 -1.5997 -2.4507 28.1881 12.6547
4 -1.3335 -2.1867 8.1547 2.8996
5 -1.1183 -2.1130 2.5222 0.7601
6 -1.0271 -2.0232 0.6077 0.2719
7 -1.0017 -2.0015 0.1119 0.0431
8 -1.0000 -2.0000 0.0063 0.0028
9 -1.0000 -2.0000 0.0000 0.0000
10 -1.0000 -2.0000 0.0000 0.0000
La solución es:

f3 (x) = x3 − 2.5x2 + 2.25x − 0.625


f2 (x) = x2 − x − 2

Las raı́ces de f2 (x) = x2 − x − 2, son x1 = 2 y x2 = −1


Para replicar el ejemplo damos
[c r s] =Itera_Bairstow([1.25, -3.875, 2.125, 2.75, -3.5, 1], 1, -2)

c =

-0.6250
2.2500
-2.5000
1.0000

r =

-1.0000

s =

-2.0000
3.10. MÉTODO DE BAIRSTOW PARA LA SOLUCIÓN DE POLINOMIOS 69

Si repetimos el ejemplo pero ahora considerando el polinomio f3 (x) = x3 − 2.5x2 + 2.25x −


0.625, podemos calcular el total de las raı́ces del polinomio original.

La implementación del Método de Bairstow es:

function raices = Bairstow (b, r0, s0)

raices = [];

N = length(b);

while(N > 3)
[b r s] = Itera_Bairstow(b, r0, s0);
[x1, x2] = Formula_General(1, r, s);
raices = [raices, x1, x2];

N = N-2;
end;

if length(b) == 3
[x1, x2] = Formula_General(b(3), b(2), b(1));
raices = [raices, x1, x2];
end;

if length(b) == 2
raices = [raices, -b(1)/b(2)];
end;

3.10.2. Ejemplo 2

Dado el polinomio f5 (x) = x5 − 3.5x4 + 2.75x3 + 2.125x2 − 3.875x + 1.25, calcular la raı́ces
utilizando el Método de Bairstow con valores iniciales r0 = 1 y s0 = −2

Iteración 1

Calculamos la deflación Polinomial

f5 (x) = (−0.625 + 2.25x − 2.5x2 + x3 )(x2 − x − 2)

Las raı́ces calculadas son


70 SE NO LINEALES

x1 = 2.0000
x2 = −1.0000

Iteración 2
f3 (x) = (−0.625 + 2.25x − 2.5x2 + x3 ) = (x − 0.5)(x2 − 2x + 1.25)

Las raı́ces son


x3 = 1 + j0.5
x4 = 1 − j0.5

Iteración 3
Finalmente

f1 (x) = x − 0.5

tiene una raiz


x5 = 0.5

Para correr en Matlab hacer


Bairstow([1.25, -3.875, 2.125, 2.75, -3.5, 1], 1, -2)

ans =

2.0000 -1.0000 1.0000 + 0.5000i 1.0000 - 0.5000i 0.5000

3.10.3. Ejemplo 3

Dado el polinomio f5 (x) = x5 − 3.5x4 + 2.75x3 + 2.125x2 − 3.875x + 1.25, determinar las
raı́ces de este polinomio. Considere r0 = −1 y s0 = −1.
Iteración 1

f5 (x) = x5 − 3.5x4 + 2.75x3 + 2.125x2 − 3.875x + 1.25


f5 (x) = (x3 − 4x2 + 5.25x − 2.5) ∗ (x2 + 0.5x − 0.5)
3.10. MÉTODO DE BAIRSTOW PARA LA SOLUCIÓN DE POLINOMIOS 71

Las raı́ces de x2 + 0.5x − 0.5 = 0 son

x1 = 0.5
x2 = −1.0

Iteración 2

f3 (x) = x3 − 4x2 + 5.25x − 2.5


f3 (x) = (x − 2) ∗ (x2 − 2x + 1.25)

Las raı́ces de x2 − 2x + 1.25 = 0 son

x3 = 1.0 + j0.5
x4 = −1.0 − j0.5

Iteración 3

f1 (x) = (x − 2)

La raı́z de este polinomio es

x5 = 2;

Todas la raı́ces de f5 (x) son x = [0.5, −1.0, (1.0 + j0.5), (1 − j0.5), 2]. Para correr en Matlab
dar
>> Bairstow([1.25, -3.875, 2.125, 2.75, -3.5, 1], -1, -1)

ans =

2.0000 -1.0000 1.0000 + 0.5000i 1.0000 - 0.5000i 0.5000


72 SE NO LINEALES
Solución de sistemas de ecuaciones lineales
y no-lineales

4.1. Solución de Sistemas lineales

Se llama sistema de ecuaciones lineales a un conjunto de ecuaciones de la forma:


donde x1 , ..., xn son las incógnitas, b1 , ..., bn se denominan términos independientes y los
números ai,j se llaman coeficientes de las incógnitas, formando una matriz que denomina-
remos A, matriz de coeficientes.
    
a1,1 a1,2 · · · a1,n x1 b1
 a2,1 a2,2 · · · a2,n   x2   b2 
..   ..  =  .. 
    
 .. ..
 . . ··· .   .   . 
an,1 an,2 · · · an,n xn bn

En forma compacta

Ax = b

En las siguientes subsecciones se analizarán algunos de los métodos para resolver el sistema
de ecuaciones.

4.1.1. Método iterativo de Jacobi

Consideremos el siguiente sistema de ecuaciones.

    
a1,1 a1,2 a1,3 x1 b1
 a2,1 a2,2 a2,3   x2  =  b2 
a3,1 a3,2 a3,3 x3 b3

73
74 SISTEMAS DE ECUACIONES

Vamos a representar cada una de las variables en términos de ellas mismas.

b1 − a1,2 x2 − a1,3 x3
x1 =
a1,1
b2 − a2,1 x1 − a2,3 x3
x2 =
a2,2
b3 − a3,1 x1 − a3,2 x2
x3 =
a3,3

Lo cual nos sugiere el siguiente esquema iterativo de solución.

(t) (t)
(t+1) b1 − a1,2 x2 − a1,3 x3
x1 =
a1,1
(t) (t)
(t+1) b2 − a2,1 x1 − a2,3 x3
x2 =
a2,2
(t) (t)
(t+1) b3 − a3,1 x1 − a3,2 x2
x3 =
a3,3

En general podemos escribir como

PN (t)
(t+1) bk – l=1,l6=k ak,l xl
xk =
ak,k

La implementación en Matlab es
function y = Jacobi(A, x, b)

N = length(x);
y = zeros(N,1);

for iter=1:100000
for k = 1:N
suma =0;
for l= 1:N
if k ~= l
4.1. SOLUCIÓN DE SISTEMAS LINEALES 75

suma = suma + A(k,l)*x(l);


end;
end;
y(k) = (b(k) - suma)/A(k,k);
end;
if sqrt(norm(x-y)) < 1e-6
break;
else
x = y;
end;
end;

4.1.2. Algoritmo iterativo de Gauss-Seidel

El cambio que debemos hacer respecto al de Jacobi, es que las variables nuevas son uti-
lizadas una vez que se realiza el cálculo de ellas ası́, para un sistema de tres ecuaciones
tendremos:

(t) (t)
(t+1) b1 − a1,2 x2 − a1,3 x3
x1 =
a1,1
(t+1) (t)
(t+1) b2 − a2,1 x1 − a2,3 x3
x2 =
a2,2
(t+1) (t+1)
(t+1) b3 − a3,1 x1 − a3,2 x2
x3 =
a3,3

La implementación en Matlab es
function y = Gauss_Seidel(A, x, b)

N = length(x);
y = zeros(N,1);

for iter=1:100000
for k = 1:N
suma =0;
for l= 1:N
if k ~= l
76 SISTEMAS DE ECUACIONES

suma = suma + A(k,l)*x(l);


end;
end;
x(k) = (b(k) - suma)/A(k,k);
end;
if sqrt(norm(x-y)) < 1e-6
break;
else
y=x;
end;
end;

Ejemplo

Resolver el siguiente sistema de ecuaciones utilizando el método de Jacobi y comparar con


el método de Gauss-Seidel.

    
4 −1 1 x1 7
 4 −8 1   x2  =  −21 
−2 1 5 x3 15

Las primeras 20 iteraciones del algoritmo de Jacobi son :


k x1 x2 x3
1 1.0000 2.0000 2.0000
2 1.7500 3.3750 3.0000
3 1.8438 3.8750 3.0250
4 1.9625 3.9250 2.9625
5 1.9906 3.9766 3.0000
6 1.9941 3.9953 3.0009
7 1.9986 3.9972 2.9986
8 1.9996 3.9991 3.0000
9 1.9998 3.9998 3.0000
10 1.9999 3.9999 2.9999
11 2.0000 4.0000 3.0000
12 2.0000 4.0000 3.0000
Para correr hacer
>> Jacobi([4 -1 1; 4 -8 1; -2 1 5], [1,2,2]’, [7,-21, 15]’)
4.1. SOLUCIÓN DE SISTEMAS LINEALES 77

ans =

2.0000
4.0000
3.0000
La solución utilizando Gauss-Seidel es :
k x1 x2 x3
1 1.0000 2.0000 2.0000
2 1.7500 3.7500 2.9500
3 1.9500 3.9688 2.9863
4 1.9956 3.9961 2.9990
5 1.9993 3.9995 2.9998
6 1.9999 3.9999 3.0000
7 2.0000 4.0000 3.0000
8 2.0000 4.0000 3.0000
Note que Gauss-Seidel requiere de 7 iteraciones mientras Jacobi de 11, para convergir. Para
correr hacer
>> Gauss_Seidel([4 -1 1; 4 -8 1; -2 1 5], [1,2,2]’, [7,-21, 15]’)

ans =

2.0000
4.0000
3.0000

4.1.3. Ejemplo matrices dispersas

Resolver el sistema de ecuaciones utilizando matrices dispersas y los métodos de Jacobi y


Gauss-Seidel

    
10 −1 −1 −1 1 x1 1

 1 4 0 0 0   x2  
   2 

A=
 1 0 4 0 0   x3 
 
=
 3 

 1 0 0 4 0   x4   4 
1 0 0 0 3 x5 5
A = sparse(5,5);
A(1,1) = 10;
78 SISTEMAS DE ECUACIONES

A(1,2) = -1;
A(1,3) = -1;
A(1,4) = -1;
A(1,5) = 1;
A(2,1) = 1;
A(3,1) = 1;
A(4,1) = 1;
A(5,1) = 1;
A(2,2) = 4;
A(3,3) = 4;
A(4,4) = 4;
A(5,5) = 3;
disp(A);

size(A)

b = [1,2,3,4,5]’;

disp(b);
Jacobi(A,[0,0,0,0,0]’, b)
Gauss_Seidel(A,[0,0,0,0,0]’, b)

La solución para ambos métodos es:

ans =

0.1520
0.4620
0.7120
0.9620
1.6160

ans =

0.1520
0.4620
0.7120
0.9620
1.6160
4.1. SOLUCIÓN DE SISTEMAS LINEALES 79

4.1.4. Solución de sistemas lineales de ecuaciones por el método de Eli-


minación Gaussiana

Consideremos que tenemos un sistema lineal Ax=b, donde la matriz A no tiene las condi-
ciones de ser triangular superior.
    
a1,1 a1,2 a1,3 x1 b1
 a2,1 a2,2 a2,3   x2  =  b2 
a3,1 a3,2 a3,3 x3 b3

Comenzaremos por despejar x1 de la ecuación (I)

b1 − a1,2 x2 − a1,3 x3
x1 =
a1,1

y sustituimos en las ecuaciones (II)

 
b1 − a1,2 x2 − a1,3 x3
a2,1 + a2,2 x2 + a2,3 x3 = b2
a1,1

agrupando términos semejantes tenemos:

     
a2,1 ∗ a1,2 a1,3 b1
a2,2 − x2 + a2,3 − a2,1 x3 = b2 − a2,1
a1,1 a1,1 a1,1

Ahora sustituimos en la ecuación (III)

 
b1 − a1,2 x2 − a1,3 x3
a3,1 + a3,2 x2 + a3,3 x3 = b3
a1,1
     
a3,1 a1,2 a3,1 a1,3 b1
a3,2 − x2 + a3,3 − x3 = b3 − a3,1
a1,1 a1,1 a1,1

Lo cual nos da un nuevo sistema simplificado dada por

    
a1,1 a1,2 a1,3 x1 b1
 0 a02,2 a02,3   x2  =  b02 
0 a03,2 a03,3 x3 b03
80 SISTEMAS DE ECUACIONES

donde los valores de a0i,j los calculamos como:


ak,j
a0i,j = ai,j − ai,k
ak,k
bk
b0i = bi − ai,k
ak,k

Si repetimos el procedimiento, ahora para x1 , tendremos un sistema dado como:

    
a1,1 a1,2 a1,3 x1 b1
 0 a02,2 a02,3   x2  =  b02 
0 0 a003,3 x3 b003

Solución de un sistema Triangular superior

   
a1,1 a1,2 a1,3 a1,4 x1 b1
 0 a2,2 a2,3 a2,4   x2   b2 
  = 
 0 0 a3,3 a3,4   x3   b3 
0 0 0 a4,4 x4 b4

Podemos resolverlo empezando con la ecuación 4 cuya solución es la más simple, para luego
solucionar 3 y ası́ sucesivamente. Este esquema de solución queda

b4
x4 =
a4,4
b3 − a3,4 x4
x3 =
a3,3
b2 − a2,3 x3 − a2,4 x4
x2 =
a2,2
b1 − a1,2 x2 − a1,3 x3 − a1,4 x4
x1 =
a1,1

En general podemos calcular la solución haciendo

PN
bk − i=k+1 ak,i xi
xk =
ak,k

La implementación en Matlab queda


4.1. SOLUCIÓN DE SISTEMAS LINEALES 81

function x = Eliminacion_Gaussiana(A, b)

N = length(b);

x = zeros(N,1);

for k =1:1:N-1
for n = k+1:1:N
b(n) = b(n) - A(n,k)*b(k)/A(k,k);
for m=N:-1:k
A(n,m) = A(n,m) - A(n,k)*A(k,m)/A(k,k);
end;
end;
end;

for k=N:-1:1
suma = 0;
for m=k+1:1:N
suma = suma +A(k,m)*x(m);
end;
x(k) = (b(k)-suma)/A(k,k);
end;

que corresponde a un sistema triangular superior que podemos solucionar utilizando susti-
tución hacia atrás.

Ejemplo 1

Dado el sistema lineal de ecuaciones, calcular el sistema Triangular Superior utilizando el


algoritmo de Eliminación Gaussiana

   
10 −1 2 1 x1 1
 −1 15 −3 1   x2   2 
  = 
 2 −3 6 −3   x3   2 
1 1 −3 7 x4 1

Primer paso k = 1
82 SISTEMAS DE ECUACIONES

−1
    
10 2 1 x1 1
    
149
− 14 11 21
    
 0   x2   
 10 5 10    10 
  =  
    
 0
 − 14
5
28
5 − 16
5
  x3  
  
9
5


    
11
0 10 − 16
5
69
10 x4 9
10

   
10.0000 −1.0000 2.0000 1.0000 x1 1.0000

 0 14.9000 −2.8000 1.1000   x2

  2.1000 
= 
 0 −2.8000 5.6000 −3.2000   x3   1.8000 
0 1.1000 −3.2000 6.9000 x4 0.9000

Segundo paso k = 2

10 −1
    
2 1 x1 1
    
149
− 14 11 21
    
 0   x2   
 10 5 10    10 
  =  
 756
   
 0
 0 149 − 446
149
  x3  
  
327
149


    
446 1016 111
0 0 − 149 149 x4 149

   
10.0000 −1.0000 2.0000 1.0000 x1 1.0000

 0 14.9000 −2.8000 1.1000   x2

  2.1000 
= 
 0 0 5.0738 −2.9933   x3   2.1946 
0 0 −2.9933 6.8188 x4 0.7450

Tercer paso k = 3

10 −1
    
2 1 x1 1
    
149
− 14 11 21
    
 0   x2   
 10 5 10    10 
  =  
 756
   
 0
 0 149 − 446
149
  x3  
  
327
149


    
955 257
0 0 0 189 x4 126
4.1. SOLUCIÓN DE SISTEMAS LINEALES 83

    
10.0000 −1.0000 2.0000 1.0000 x1 1.0000

 0 14.9000 −2.8000 1.1000   x2

  2.1000 
= 
 0 0 5.0738 −2.9933   x3   2.1946 
0 0 0 5.0529 x4 2.0397

Sustitución hacia atras


Paso 1 k = 4

b4
x4 =
a4,4
2.0397
x4 = = 0.4037
5.0529

Paso 2 k = 3
b3 − a3,4 x4
x3 =
a3,3
2.1946 − (−2.9933)(0.4037)
x3 = = 0.6707
5.0738

Paso 3 k = 2

b2 − a2,3 x3 − a2,4 x4
x2 =
a2,2
2.1000 − (−2.8000)(0.6707) − (1.1000)(0.4037)
x2 = = 0.2372
14.9000

Paso 4 k = 1
b1 − a1,2 x2 − a1,3 x3 − a1,4 x4
x1 =
a1,1
1.0000 − (−1.0000)(0.2372) − (2.0000)(0.6707) − (1.0000)(0.4037)
x1 = = −0.0508
10.0000

La solución en Matlab es
>> Eliminacion_Gaussiana([10 -1 2 1; -1 15 -3 1; 2 -3 6 -3; 1 1 -3 7], [1,2,2,1]’)

10.0000 -1.0000 2.0000 1.0000


84 SISTEMAS DE ECUACIONES

0 14.9000 -2.8000 1.1000


0 0 5.0738 -2.9933
0 0 0 5.0529

1.0000 2.1000 2.1946 2.0397

ans =

-0.0508
0.2372
0.6707
0.4037

Ejemplo 2

Calcular el sistema triangular superior utilizando eliminación Gaussiana.

5x + 2y + 1z = 3

2x + 3y − 3z = −10

1x − 3y + 2z = 4

Primer paso

5x + 2y + 1z = 3

0 + (11/5)y − (17/5)z = −(56/5)

0 − (17/5)y + (9/5)z = (17/5)

Segundo paso

5x + 2y + 1z = 3

0x + (11/5)y − (17/5)z = −(56/5)

0x − 0y − (38/11)z = −(153/11)

La solución en Matlab es
4.1. SOLUCIÓN DE SISTEMAS LINEALES 85

>> Eliminacion_Gaussiana([5 2 1; 2 3 -3; 1 -3 2], [3, -10, 4])


5.0000 2.0000 1.0000
0 2.2000 -3.4000
0 0 -3.4545

3.0000
-11.2000
-13.9091

ans =

-0.6579
1.1316
4.0263

Ejemplo 3

Resolver el sistema de ecuaciones

    
3 −1 −1 x 0
 −1 1 0  y  =  1 
−1 0 1 z 1

Aplicando Eliminación Gaussiana nos queda.

    
3 −1 −1 x 0
 0 2/3 −1/3   y  =  1 
0 0 1/2 z 3/2

La solución en Matlab es

>> Eliminacion_Gaussiana([3 -1 -1; -1 1 0; -1 0 1], [0 1 1])


3.0000 -1.0000 -1.0000
0 0.6667 -0.3333
0 0 0.5000

0
1.0000
86 SISTEMAS DE ECUACIONES

1.5000

ans =

2.0000
3.0000
3.0000

Problema con la Eliminación Gaussiana

Un ejemplo de sistema donde es necesario hacer un cambio de renglón por renglón para
que tenga solución es el siguiente sistema.

 
1 2 6
 4 8 −1 
−2 3 5

Aplicando el primer paso de la eliminación gaussiana tenemos:

 
1 2 6
 0 0 −25 
0 7 17

note, que aparece un cero en el elemento 22, lo cual nos da un sistema sin solución. Per-
mutando los renglones 2 y 3 el sistema tiene solución.

 
1 2 6
 −2 3 5 
4 8 −1

La solución en Matlab tenemos


>> Eliminacion_Gaussiana([1 2 6; 4 8 -1; -2 3 5], [1 1 1])
1 2 6
0 0 -25
0 NaN Inf

1
-3
4.1. SOLUCIÓN DE SISTEMAS LINEALES 87

Inf

ans =

NaN
NaN
NaN
Haciendo el cambio de renglones tenemos
>> Eliminacion_Gaussiana([1 2 6; -2 3 5; 4 8 -1], [1 1 1])
1 2 6
0 7 17
0 0 -25

1
3
-3

ans =

0.0057
0.1371
0.1200

4.1.5. Gauss-Jordan

El método de Gauss-Jordan es una variación de la eliminación de Gauss. La principal


diferencia consiste em que cuando una incógnita se elimina en el método de Gauss-Jordan,
esta es eliminada de todas las ecuaciones en lugar de hacerlo en la subsecuentes. Además
todos los renglones se normalizan al dividirlos entre su elemento privote. De esta forma,
el paso de eliminación genera una matriz identidad en vez de una matriz triangular. En
consecuencia no es necesario usar la sustitución hacia atrás para obtener la solución.
Comenzaremos planteando un sistema de 3 ecuaciones con 3 incógnitas dado por

    
a1,1 a1,2 a1,3 x1 b1
 a2,1 a2,2 a2,3   x2  =  b2 
a3,1 a3,2 a3,3 x3 b3
88 SISTEMAS DE ECUACIONES

Este sistema de ecuaciones lo podemos escribir como:

Ax = Ib

donde I es la matriz identidad

     
a1,1 a1,2 a1,3 x1 1 0 0 b1
 a2,1 a2,2 a2,3   x2  =  0 1 0   b2 
a3,1 a3,2 a3,3 x3 0 0 1 b3

Lo cual da lugar a la matriz aumentada que hemos utilizado en el procedimiento de Gauss-


Jordan

 
a1,1 a1,2 a1,3 1 0 0 b1
 a2,1 a2,2 a2,3 0 1 0 b2  (4.4)
a3,1 a3,2 a3,3 0 0 1 b3

Primer paso
Vamos a despejar la variable x1 del sistema y la sustituimos en las otras dos ecuacio-
nes

b1 − a1,2 x2 − a1,3 x3
= x1 (4.5)
a1,1

Sustituyendo en la ecuación 2

 
b1 − a1,2 x2 − a1,3 x3
a2,1 + a2,2 x2 + a2,3 x3 = b2
a1,1
     
a2,1 a2,1 a1,2 a2,1 a1,3
0x1 + b1 + a2,2 − x2 + a2,3 x3 = b2 (4.6)
a1,1 a1,1 a1,1

Sustituyendo en la ecuación 3

 
b1 − a1,2 x2 − a1,3 x3
a3,1 + a3,2 x2 + a3,3 x3 = b3
a1,1
     
a3,1 a3,1 a1,2 a3,1 a1,3
0x1 + b1 + a3,2 − x2 + a3,3 − x3 = b3 (4.7)
a1,1 a1,1 a1,1
4.1. SOLUCIÓN DE SISTEMAS LINEALES 89

En forma matricial podemos escribir las ecuaciones 4.5, 4.6 y 4.7

 a1,2 a1,3 
1 a1,1 a1,1
   1 
0 0  b1 
    x 1 a1,1
a a1,2 a a1,3 a2,1
a2,2 − 2,1 a2,3 − 2,1
 
 0 a1,1 a1,1
  x2  =  − 1 0 
  b2 
 a1,1
a
     
0
a3,1 a1,2
a3,2 − a1,1
a3,1 a1,3
a3,3 − a1,1 x3 − a3,1 0 1 b3
1,1

La matriz aumentada dada por (4.4 ) tenemos:

 a1,2 a1,3 1 1 
1 a1,1 a1,1 a1,1 0 0 a1,1 b1
   
a a1,2 a a1,3 a2,1 a2,1
a2,2 − 2,1 a2,3 − 2,1 − a1,1 b2 − a1,1
 
 0 a1,1 a1,1 1 0 b1 
     
a3,1 a1,2 a3,1 a1,3 a3,1 a3,1
0 a3,2 − a1,1 a3,3 − a1,1 − a1,1 0 1 b3 − a1,1 b1

Segundo Paso
Para un sistema equivalente

1 a01,2 a01,3
    0  0 
x1 c1,1 0 0 b1
 0 a02,2 a02,3   x2  =  c02,1 1 0   b02  (4.8)
0 a03,2 a03,3 x3 c03,1 0 1 b03

Despejamos x2 de la ecuación 2

c02,1 b01 + b02 − a02,3 x3


x2 =
a02,2

Sustituyendo en la ecuación 1
!
c02,1 b01 + b02 − a02,3 x3
x1 + a01,2 + a01,3 = c01,1 b01
a02,2
! !
a01,2 a02,3 a01,2 c02,1 a02,1 0
x1 + 0x2 + a01,3 − x3 = c01,1 b01 − − b
a02,2 a02,2 a02,2 2

Sustituyendo en la ecuación 3
! !
a03,2 a02,3 a03,2 c02,1 a03,2 0
0x1 + 0x2 + a03,3 − x3 = c03,1 − b01 − b 2 + b0 3
a02,2 a02,2 a02,2
90 SISTEMAS DE ECUACIONES

En forma matricial

 a01,2 a02,3   a01,2 c02,1 a01,2 


1 0 a01,3 − a02,2
c01,1 − a02,2 a02,2
0
 b01
   
 x1
a02,3 c02,1
 
 0 1  x2  =  1
0   b02 
   
a02,2 a02,2 a02,2
a0 a02,3 x3 a0 c02,1 a0 b03
   
0 0 a03,3 − 3,2 a0
c03,1 − 3,2 a02,2
− a03,2 1
2,2 2,2

Tercer Paso
Dado el sistema equivalente

1 0 a001,3
  00
c1,1 c001,2 0
    00 
x1 b1
 0 1 a002,3   x2  =  c002,1 c002,2 0   b002 
0 0 a003,3 x3 c003,1 c003,2 1 b003

Despejamos x3 de la ecuación 3 y sustituimos en la ecuaciones 1 y 2

 a00 00
1,3 c3,2 a00 
c001,1 c001,2 − 00 − a1,3
00
a3,3
 b001
    
1 0 0 x1 3,3
a00 a00

  00 
 c002,1
 0 1 0   x2  =  00
c2,2 − a2,300 − 2,3
a00  b2
3,3 3,3
0 0 1 x3 b003
 00
c00

c3,1 3,2 1
a00
3,3
00
a3,3 a00
3,3

Como resultado tenemos que la matrix c00 es la inversa de nuestro sistema y b00 la solución
del sistema de ecuaciones
Resumen
Dado el sistema

 
a1,1 a1,2 a1,3 · · · a1,M
 a2,1 a2,2 a2,3 · · · a2,M 
a3,1 a3,2 a3,3 · · · a3,M

Paso 1
Dividimos la primer ecuación entre a1,1

1  
a1,1 a1,1 a1,2 a1,3 ··· a1,M
 a2,1 a2,2 a2,3 ··· a2,M 
a3,1 a3,2 a3,3 ··· a3,M
4.1. SOLUCIÓN DE SISTEMAS LINEALES 91

Multiplicamos la ecuación 1 por a2,1 y la restamos a la ecuación 2

a1,2 a1,3 a1,M


1 ···
 
a2,1 a1,1 a1,1 a1,1
 a2,1 a2,2 a2,3 ··· a2,M 
a3,1 a3,2 a3,3 ··· a3,M

a1,2 a1,3 a1,M


···
 
1 a1,1 a1,1 a1,1 
     
a1,2 a1,3 a1,M
 0 a2,2 − a2,1 a2,3 − a2,1 ··· a2,M − a2,1

a1,1 a1,1 a1,1 
a3,1 a3,2 a3,3 ··· a3,M

Multiplicamos la ecuación 1 por a3,1 y la restamos a la ecuación 3

a1,2 a1,3 a1,M


···
 
a3,1 1 a1,1 a1,1 a1,1 
     
a1,2 a1,3 a1,M
 0 a2,2 − a2,1 a2,3 − a2,1 ··· a2,M − a2,1

a1,1 a1,1 a1,1 
a3,1 a3,2 a3,3 ··· a3,M

a1,2 a1,3 a1,M


···
 
1 a1,1 a1,1 a1,1 
     
a1,M
 0 a2,2 − a2,1 aa1,2 −
a1,3
··· a2,M − a2,1

a 2,3 a2,1
 a1,1   a1,1 

  1,1  
a1,2 a1,3 a
0 a3,2 − a3,1 a1,1 a3,3 − a3,1 a1,1 ··· a3,M − a3,1 a1,M
1,1

Paso 2
Dividimos la segunda ecuación entre a2,2

 
a1,1 a1,2 a1,3 ··· a1,M
1
a2,2
 a2,1 a2,2 a2,3 ··· a2,M 
a3,1 a3,2 a3,3 ··· a3,M

a1,1 a1,2 a1,3 ··· a1,M


 
a2,M
 aa2,1 1
a2,3
a2,2 ··· a2,2

2,2
a3,1 a3,2 a3,3 ··· a3,M

Multiplicamos la ecuación 2 por a1,2 y la restamos a la primer ecuación

a1,1 a1,2 a1,3 ··· a1,M


 
a2,M
a1,2  aa2,1 1
a2,3
a2,2 ··· a2,2

2,2
a3,1 a3,2 a3,3 ··· a3,M
92 SISTEMAS DE ECUACIONES

      
a2,1 a2,3 a2,M

a1,1 − a1,2 a2,2 0 a1,3 − a1,2 a2,2 ··· a1,M − a1,2 a2,2
 a2,1 a2,3 a2,M 
 a2,2 1 a2,2 ··· a2,2

a3,1 a3,2 a3,3 ··· a3,M

Multiplicamos la ecuación 2 por a3,2 y se la restamos a la ecuación 3

      
a2,1 a2,3 a2,M

a1,1 − a1,2 a2,2 0 a1,3 − a1,2 a2,2 ··· a1,M − a1,2 a2,2
a3,2 
 a2,1 a2,3 a2,M 
a2,2 1 a2,2 ··· a2,2

a3,1 a3,2 a3,3 ··· a3,M

      
a2,1 a2,3 a2,M

a1,1 − a1,2 a2,2 0 a1,3 − a1,2 a2,2 ··· a1,M − a1,2 a2,2
 a2,1 a2,3 a2,M 

 a2,2 1 a2,2 ··· a2,2 

     
a2,1 a2,3 a2,M
a3,1 − a3,2 a2,2 0 a3,3 − a3,2 a2,2 ··· a3,1 − a3,2 a2,2

Paso 3
Dividimos la tercera ecuación entre a3,3

 
a1,1 a1,2 a1,3 ··· a1,M
 a2,1 a2,2 a2,3 ··· a2,M 
1
a3,3 a3,1 a3,2 a3,3 ··· a3,M

a1,1 a1,2 a1,3 ··· a1,M


 
 a2,1 a2,2 a2,3 ··· a2,M 
a3,1 a3,2 a3,M
a3,3 a3,3 1 ··· a3,3

Multiplicamos la ecuación 3 por a1,3 y la restamos a la primer ecuación

a1,1 a1,2 a1,3 ··· a1,M


 
 a2,1 a2,2 a2,3 ··· a2,M 
a3,1 a3,2 a3,M
a1,3 a3,3 a3,3 1 ··· a3,3

      
a3,1 a3,2 a3,M

a1,1 − a1,3 a3,3 a1,2 − a1,3 a3,3 0 ··· a1,M − a1,3 a3,3
 
 a2,1 a2,2 a2,3 ··· a2,M 
a3,1 a3,2 a3,M
a3,3 a3,3 1 ··· a3,3
4.1. SOLUCIÓN DE SISTEMAS LINEALES 93

Multiplicamos la ecuación 3 por a2,3 y la restamos a la segunda ecuación


      
a3,1 a3,2 a3,M

a1,1 − a1,3 a3,3 a1,2 − a1,3 a3,3 0 ··· a1,M − a1,3 a3,3
 
 a2,1 a2,2 a2,3 ··· a2,M 
a2,3 a3,1 a3,2 a3,M
a3,3 a3,3 1 ··· a3,3
      
a3,1 a3,2 a3,M

a1,1 − a1,3 a1,2 − a1,3 0 ··· a1,M − a1,3
  a3,3   a3,3   a3,3  
a a3,2 a
 a −
 2,1 a2,3 a3,1
3,3
a2,2 − a2,3 a3,3 0 ··· a2,M − a2,3 a3,M
3,3


a3,1 a3,2 a3,M
a3,3 a3,3 1 ··· a3,3

Note la similitud del método con el método de sumas y restas. No olvidar que este método
es equivalente al calculo parcial de la matriz inversa. El método se ilustra mejor con un
ejemplo.

Ejemplo 1

Utilice la técnica de Gauss-Jordan para resolver el siguiente sistema de ecuaciones.

30x1 − x2 − 2x3 = 78
x1 + 70x2 − 3x3 = −193
3x1 − 2x2 + 100x3 = 714

Primero exprese los coeficientes y el lado derecho como una matriz aumentada

 
30 −1 −2 1 0 0 78
 1 70 −3 0 1 0 −193 
3 −2 100 0 0 1 714

Primer iteración
Luego se normaliza el primer renglón, al dividirlo entre el elemento pivote, 30, se obtie-
ne

 1 1 1 13 
1 − 30 − 15 30 0 0 5
 
 
 1
 70 −3 0 1 0 −193 

 
3 −2 100 0 0 1 714
94 SISTEMAS DE ECUACIONES

El término x1 se puede eliminar del segundo renglón restando el primer renglón multiplicado
por 1 del segundo renglón. En forma similar restando el primer renglón multiplicando por
3 eliminará el término x1 del tercer renglón

 1 1 1 13 
1 − 30 − 15 30 0 0 5
 
 0 2101 44 1
− 978
 
 30 − 15 − 30 1 0 5


 
0 − 19
10
501
5
1
− 10 0 1 3531
5

 
1. −0.0333 −0.0667 0.0333 0. 0. 2.6
 0. 70.0333 −2.9333 −0.0333 1. 0. −195.6 
0. −1.9 100.2 −0.1 0. 1. 706.2

Segunda Iteración
2101
En seguida, se normaliza el segundo renglón dividiéndolo entre 30

 1 1 1 13 
1 − 30 − 15 30 0 0 5
 
8 1 30
− 5868
 
 0
 1 − 191 − 2101 2101 0 2101


 
19 501 1 3531
0 − 10 5 − 10 0 1 5

 
1. −0.0333 −0.0667 0.0333 0. 0. 2.6
 0. 1. −0.0419 −0.0005 0.0143 0. −2.793 
0. −1.9 100.2 −0.1 0. 1. 706.2

Al reducir los términos x2 de las ecuaciones 1 y 2 tenemos


 13 70 1 5267 
1 0 − 191 2101 2101 0 2101
 
 0 1 − 8 − 1 30
− 5868
 
2101 0

 191 2101 2101 
 
0 0 19123
191
212
− 2101 57
2101 1
1472577
2101

 
1. 0. −0.0681 0.0333 0.0005 0. 2.5069
 0. 1. −0.0419 −0.0005 0.0143 0. −2.793 
0. 0. 100.12 −0.1009 0.0271 1. 700.893

Tercer iteración
4.1. SOLUCIÓN DE SISTEMAS LINEALES 95

19123
El tercer renglón se normaliza entonces al dividirlo entre 191

 13 70 1 5267 
1 0 − 191 2101 2101 0 2101
 
 0 1 − 8 1 30
− 5868
 
 191 − 2101 2101 0 
2101 
 
212 57 191 1472577
0 0 1 − 210353 210353 19123 210353

 
1. 0. −0.0681 0.0333 0.0005 0. 2.5069
 0. 1. −0.0419 −0.0005 0.0143 0. −2.793 
0. 0. 1. −0.001 0.0003 0.01 7.0005

Por último, los términos x3 se pueden reducir de la primera y segunda ecuación para
obtener

 538 8 1 48274 
1 0 0 16181 16181 1471 16181
 
 0 1 0 − 109 3006 8
− 525828
 

 210353 210353 19123 210353 
 
212 57 191 1472577
0 0 1 − 210353 210353 19123 210353

 
1. 0. 0. 0.0332 0.0005 0.0007 2.9834
 0. 1. 0. −0.0005 0.0143 0.0004 −2.4997 
0. 0. 1. −0.001 0.0003 0.01 7.0005

El código en Matlab es
function [x, Ainv] = Gauss_Jordan(A, b)
N = length(b);

B = [A, diag(ones(N,1)), b];

for n = 1:N;
B(n,:) = B(n, :)./B(n,n);
for m = 1: N
if n ~= m
B(m,:) = B(m,:) - B(n,:)*B(m,n);
end;
end;
end;
x = B(:,2*N+1);
96 SISTEMAS DE ECUACIONES

Ainv = B(:, (N+1):(N+N));


Como resultado tenemos en primer termino la matriz identidad resultado de las elimina-
ciones, en segundo lugar la matriz inversa y finalmente la solución del sistema de ecuacio-
nes.
Para el ejemplo hacemos
>> [b, Ainv] = Gauss_Jordan([3, -0.1, -0.2; 0.1 7 -0.3; 0.3 -0.2 10],
[7.85; -19.3; 71.4])

x =

3.0000
-2.5000
7.0000

Ainv =

0.3325 0.0049 0.0068


-0.0052 0.1429 0.0042
-0.0101 0.0027 0.0999

Ejemplo 2

Dado el sistema lineal de ecuaciones calcular la solución utilizando el método de Gauss-


Jordan

    
1 1 2 x1 −1
 1 3 −6   x2  =  7 
2 −1 2 x3 0

La matriz aumentada para este sistema es:

 
1 1 2 −1
 1 3 −6 7 
2 −1 2 0

Primer iteración
4.1. SOLUCIÓN DE SISTEMAS LINEALES 97

 
1 1 2 −1
 0 2 −8 8 
0 −3 −2 2

Segunda iteración

 
1 0 6 −5
 0 1 −4 4 
0 0 −14 14

Tercer iteración

 
1 0 0 1
 0 1 0 0 
0 0 1 −1

Ejemplo 3

Dado el sistema lineal de ecuaciones, calcular la solución y la matriz inversa utilizando el


método de Gauss-Jordan

    
10 −1 2 1 x1 1
 −1 15 −3 1   x2   2 
  = 
 2 −3 6 −3   x3   2 
1 1 −3 7 x4 1

El sistema inicial aumentado es


 
10 −1 2 1 1 0 0 0 1
 −1 15 −3 1 0 1 0 0 2 
 
 2 −3 6 −3 0 0 1 0 2 
1 1 −3 7 0 0 0 1 1

Primer iteración
98 SISTEMAS DE ECUACIONES

1 1 1 1 1
1 − 10
 
5 10 10 0 0 0 10
 
 0 149 − 14 11 1 21
 
 10 5 10 10 1 0 0 10


 
 
 0 − 14 28
− 16 − 51 0 1 0 9 
 5 5 5 5 
 
11
0 10 − 16
5
69
10
1
− 10 0 0 1 9
10

 
1.0000 −0.1000 0.2000 0.1000 0.1000 0 0 0 0.1000

 0 14.9000 −2.8000 1.1000 0.1000 1.0000 0 0 2.1000 

 0 −2.8000 5.6000 −3.2000 −0.2000 0 1.0000 0 1.8000 
0 1.1000 −3.2000 6.9000 −0.1000 0 0 1.0000 0.9000

Segunda iteración

 27 16 15 1 17 
1 0 149 149 149 149 0 0 149
 
 0 1 − 28 11 1 10 21
 
 149 149 149 149 0 0 149


 
 756

 0 0
 149 − 446
149
27
− 149 28
149 1 0 327
149


 
446 1016 16 11 111
0 0 − 149 149 − 149 − 149 0 1 149

 
1.0000 0 0.1812 0.1074 0.1007 0.0067 0 0 0.1141

 0 1.0000 −0.1879 0.0738 0.0067 0.0671 0 0 0.1409 

 0 0 5.0738 −2.9933 −0.1812 0.1879 1.0000 0 2.1946 
0 0 −2.9933 6.8188 −0.1074 −0.0738 0 1.0000 0.7450

Tercer iteración

3 3 1 1
0 − 28
 
1 0 0 14 28 0 28
 
 0 1 0 −1 2 1 2
 
 27 0 27 27 0 9


 
 
 0 0 1 − 223 1
− 28 1 149
0 109 
 378 27 756 252 
 
955 3 1 223 257
0 0 0 189 − 14 27 378 1 126
4.1. SOLUCIÓN DE SISTEMAS LINEALES 99

 
1.0000 0 0 0.2143 0.1071 0.0000 −0.0357 0 0.0357

 0 1.0000 0 −0.0370 0 0.0741 0.0370 0 0.2222 

 0 0 1.0000 −0.5899 −0.0357 0.0370 0.1971 0 0.4325 
0 0 0 5.0529 −0.2143 0.0370 0.5899 1.0000 2.0397

Cuarta iteración

111 3 58 81 97
− 1910 − 955 − 1910 − 1910
 
1 0 0 0 955
 
 0 1 0 0 − 3 71 79 7 453
 

 1910 955 1910 955 1910 
 
 
 0 0 1 0 − 58 79 254 223 1281 
 955 1910 955 1910 1910 
 
81 7 223 189 771
0 0 0 1 − 1910 955 1910 955 1910

 
1.0000 0 0 0 0.1162 −0.0016 −0.0607 −0.0424 −0.0508

 0 1.0000 0 0 −0.0016 0.0743 0.0414 0.0073 0.2372 

 0 0 1.0000 0 −0.0607 0.0414 0.2660 0.1168 0.6707 
0 0 0 1.0000 −0.0424 0.0073 0.1168 0.1979 0.4037

>> [x, Ainv] = Gauss_Jordan([10 -1 2 1; -1 15 -3 1; 2 -3 6 -3; 1 1 -3 7],


[1,2,2,1]’)

b =

-0.0508
0.2372
0.6707
0.4037

Ainv =

0.1162 -0.0016 -0.0607 -0.0424


-0.0016 0.0743 0.0414 0.0073
-0.0607 0.0414 0.2660 0.1168
-0.0424 0.0073 0.1168 0.1979
100 SISTEMAS DE ECUACIONES

4.2. Métodos para sistemas no lineales

Una ecuación no lineal es aquella que tiene una forma diferente a f (x) = a0 + a1 x en cuyo
caso calcular la solución consiste en resolver despejando de x = −a0 /a1 . Pero el caso es
que queremos resolver un sistema de ecuaciones no lineales de la forma

f1 (x1 , x2 , · · · , xn ) = 0
f2 (x1 , x2 , · · · , xn ) = 0
.. .
. = ..
fn (x1 , x2 , · · · , xn ) = 0

donde n es el número de ecuaciones y se tiene el mismo números de funciones fi que


variables xi . En esta sección veremos dos de estos métodos que son la iteración de punto
fijo y el método de Newton-Raphson, los cuales se pueden utilizar para resolver sistemas
de ecuaciones no lineales

4.2.1. Método de iteración de punto fijo para sistemas

Considerando un sistema no lineal de ecuaciones

f1 (x1 , x2 , · · · , xn ) = 0
f2 (x1 , x2 , · · · , xn ) = 0
.. .
. = ..
fn (x1 , x2 , · · · , xn ) = 0

El método de iteración de punto fijo intentara despejar de cada una de la las ecuaciones
fi (x1 , x2 , · · · , xn ) la i-esima variable tal que

x1 − g1 (x1 , x2 , · · · , xn ) = f1 (x1 , x2 , · · · , xn )
x2 − g2 (x1 , x2 , · · · , xn ) = f2 (x1 , x2 , · · · , xn )
.. .
. = ..
xn − gn (x1 , x2 , · · · , xn ) = fn (x1 , x2 , · · · , xn )
4.2. MÉTODOS PARA SISTEMAS NO LINEALES 101

Para resolver de manera iterativa

(t+1) (t) (t)


x1 = g1 (x1 , x2 , · · · , x(t)
n )
(t+1) (t) (t)
x2 = g2 (x1 , x2 , · · · , x(t)
n )
.. ..
. = .
(t) (t)
x(t+1)
n = gn (x1 , x2 , · · · , x(t)
n )

La implementación en Matlab es
function r = Punto_Fijo(g, x1)

while 1
x2 = g(x1)
error = abs(norm((x2-x1)/x2));
if(error < 0.0001) break
else x1 = x2;
end;
end;
r = x2;

Ejemplo 1

Utilice el método de iteración de punto fijo para determinar las raı́ces del sistema de
(0) (0)
ecuaciones dado. Considere como valores iniciales x1 = 1.5 y x2 = 3.5.

x21 + x1 x2 − 10 = 0
x2 + 3x1 x22 − 57 = 0

De acuerdo con lo descrito despejamos x1 y x2


f1 (x1 , x2 ) = x1 − 10 − x1 x2
r
57 − x2
f2 (x1 , x2 ) = x2 −
3x1

Despejando tenemos el siguiente sistema iterativo de ecuaciones


102 SISTEMAS DE ECUACIONES

q
(t+1) (t) (t)
x1 = 10 − x1 x2
v
u 57 − x(t)
u
(t+1) 2
x2 = t (t+1)
3x1

La implementación en Matlab es

function x = g1(x)

x(1) = sqrt(10 - x(1)*x(2));


x(2) = sqrt((57 - x(2))/(3 * x(1)));

El proceso iterativo será:

Iteración 1

Con x(0) = [1.5, 3.5]T tenemos

q
(1) (0) (0)
p
x1 = 10 − x1 x2 = 10 − (1.5)(3.5) = 2.1794
v s
u 57 − x(0)
u
(1) 2 57 − (3.5)
x2 = t (1)
= = 2.8605
3x 3(2.1794)
1

Iteración 2

Con x(1) = [2.1794, 2.8605]T tenemos

q
(2) (1) (1)
p
x1 = 10 − x1 x2 = 10 − (2.1794)(2.8605) = 1.9405
v s
u 57 − x(0)
u
(2) 2 57 − (2.8605)
x2 = t (1)
= = 3.0496
3x1 3(1.9405)

El resumen el proceso iterativo se muestra en la siguiente tabla, donde podemos ver que la
solución es x∗ = [2, 3]T en 9 iteraciones.
4.2. MÉTODOS PARA SISTEMAS NO LINEALES 103

(k) (k)
k x1 x2
0 1.5000 3.5000
1 2.1794 2.8605
2 1.9405 3.0496
3 2.0205 2.9834
4 1.9930 3.0057
5 2.0024 2.9981
6 1.9992 3.0007
7 2.0003 2.9998
8 1.9999 3.0001
9 2.0000 3.0000
Para realizar la ejecución dar en Matlab
Punto_Fijo(@g1, [1.5; 3.5])

Ejemplo 2

Utilice el método de iteración de punto fijo para determinar las raı́ces del sistema de
(0) (0)
ecuaciones dado. Considere como valores iniciales x1 = 0.0 y x2 = 1.0.

x21 − 2x1 − x2 + 0.5 = 0


x21 + 4x22 − 4 = 0

De acuerdo con lo descrito despejamos x1 y x2


f1 (x1 , x2 ) = x1 − 2x1 + x2 − 0.5
r
4 − x21
f2 (x1 , x2 ) = x2 −
4

Despejando tenemos el siguiente sistema iterativo de ecuaciones

q
(t+1) (t) (t)
x1 = 2x1 + x2 − 0.5
v
u 4 − x(t+1) 2
u  
(t+1)
t 1
x2 =
4
104 SISTEMAS DE ECUACIONES

La implementación en Matlab es
function x = g2(x)

x(1) = sqrt(2*x(1) + x(2) - 0.5);


x(2) = sqrt(4 -x(1)^2)/2;
El proceso iterativo será:
Iteración 1
Con x(0) = [0, 1]T tenemos

q
(1) (0) (0)
p
x1 = 2x1 + x2 − 0.5 = 2(0) + (1) − 0.5 = 0.7071
v
u 4 − x(1) 2 r
u  
(1)
t 1 4 − (0.7071)2
x2 = = = 0.9354
4 4

Iteración 2
Con x(1) = [0.7071, 0.9354]T tenemos

q
(2) (1) (1)
p
x1 = 2x1 + x2 − 0.5 = 2(0.7071) + (0.9354) − 0.5 = 1.3600
v
u 4 − x(2) 2 r
u  
(2)
t 1 4 − (1.3600)2
x2 = = = 0.7332
4 4

El resumen el proceso iterativo se muestra en la siguiente tabla, donde podemos ver que la
solución es x∗ = [1.9007, 0.3112]T en 8 iteraciones.
(k) (k)
k x1 x2
0 0.0000 1.0000
1 0.7071 0.9354
2 1.3600 0.7332
3 1.7185 0.5116
4 1.8570 0.3713
5 1.8935 0.3220
6 1.8997 0.3127
7 1.9006 0.3114
8 1.9007 0.3112
4.2. MÉTODOS PARA SISTEMAS NO LINEALES 105

Para realizar la ejecución dar en Matlab

Punto_Fijo(@g2, [0; 1])

4.2.2. Método de Newton-Raphson para sistemas

Consideremos el sistema de ecuaciones no lineales

f1 (x1 , x2 , · · · , xn ) = 0
f2 (x1 , x2 , · · · , xn ) = 0
.. .
. = ..
fn (x1 , x2 , · · · , xn ) = 0

Utilizando la serie de Taylor podemos hacer una aproximación lineal para una función
(t) (t) (t) (t) (t) (t) (t) (t+1) (t)
fi (x1 +δx1 , x2 +δx2 , · · · , xn +δxn ) en un incremento δxi = xi −xi como:

(t) (t) (t) (t)


f1 (x1 + δx1 , x2 + δx2 , · · · , x(t) (t)
n + δxn )
(t) (t) ∂f1 (t) ∂f1 (t) ∂f1 (t)
= f1 (x1 , x2 + · · · , +x(t)
n )+ δx1 + δx2 + · · · + δx
∂x1 ∂x2 ∂xn n
(t) (t) (t) (t)
f2 (x1 + δx1 , x2 + δx2 , · · · , x(t) (t)
n + δxn )
(t) (t) ∂f2 (t) ∂f2 (t) ∂f2 (t)
= f2 (x1 , x2 + · · · , +x(t)
n )+ δx1 + δx2 + · · · + δx
∂x1 ∂x2 ∂xn n
..
.
(t) (t) (t) (t)
fn (x1 + δx1 , x2 + δx2 , · · · , x(t) (t)
n + δxn )
(t) (t) ∂fn (t) ∂fn (t) ∂fn (t)
= fn (x1 , x2 + · · · , +x(t)
n )+ δx + δx + · · · + δx
∂x1 1 ∂x2 2 ∂xn n

Si escribimos el sistema en forma matricial tenemos


106 SISTEMAS DE ECUACIONES

(t) (t) (t) (t) (t) (t)


 
f1 (x1 + δx1 , x2 + δx2 , · · · , xn + δxn )
(t) (t) (t) (t) (t) (t)
f2 (x1 + δx1 , x2 + δx2 , · · · , xn + δxn )
 
 
 .. =
.
 
 
(t) (t) (t) (t) (t) (t)
fn (x1 + δx1 , x2 + δx2 , · · · , xn + δxn )
  ∂f (x) ∂f (x)
(t) (t) (t)
· · · ∂f∂x 1 (x) (t)
  
1 1
f1 (x1 , x2 , · · · , xn ) ∂x1 ∂x2 n
δx1
 ∂f2 (x) ∂f2 (x)
(t) (t) (t) 
f2 (x1 , x2 , · · · , xn )   ∂x · · · ∂f∂x 2 (x)  
  δx(t)
 
∂x2   .2
 1 n

.. + .. .. ..
   
 .
. . . ··· .  .
 
   
(t) (t) (t) ∂fn (x) ∂fn (x) ∂fn (x) (t)
fn (x1 , x2 , · · · , xn ) ∂x1 ∂x2 ··· ∂xn δxn

En forma compacta

f (x(t) + δx(t) ) = f (x(t) ) + J(x(t) )δx(t)


f (x(t) + δx(t) ) = f (x(t) ) + J(x(t) )(x(t+1) − x(t) )

donde J(x) es la matriz de primeras derivada o Jacobiano.


Como queremos encontrar el cero de la función, la aproximación lineal que debemos resolver
es:

0 = f (x(t) ) + J(x(t) )(x(t+1) − x(t) )

donde las actualizaciones las hacemos como

h i−1
x(t+1) = x(t) − J(x(t) ) f (x(t) )

La implementación del algoritmo en Matlab es:


function r = Newton_Raphson(f, J, x1)

while 1
x2 = x1 - inv(J(x1))* f(x1);
if norm((x1-x2)./x2) < 0.0001 break;
else x1 = x2;
end;
4.2. MÉTODOS PARA SISTEMAS NO LINEALES 107

end;
r = x2;

Ejemplo 1

Resolver el siguiente sistema de ecuaciones dado por y cuya gráfica se muestra en la Figura
4.10
10

5
x2

-5

-10
-10 -5 0 5 10
x1

Figura 4.10: Curvas con la solución del sistema del ejemplo 1

f1 (x1 , x2 ) = x21 + x1 x2 − 10
f2 (x1 , x2 ) = x2 + 3x1 x22 − 57

El Jacobiano es  
2x1 + x2 x1
J(x) = 2
3x2 1 + 6x1 x2
y el arreglo de funciones

x21 + x1 x2 − 10
 
f (x) =
x2 + 3x1 x22 − 57
108 SISTEMAS DE ECUACIONES

Considerando como valores iniciales x(0) = [1.5, 3.5]T tenemos:


Primer iteración

" # −1 
(1)      
x1 1.5000 6.5000 1.5000 −2.5000 2.0360
(1) = − =
x2 3.5000 36.7500 32.5000 1.6250 2.8439

Segunda iteración

" # −1 
(2)      
x1 2.0360 6.9159 2.0360 −0.0644 1.9987
(2) = − =
x2 2.8439 24.2629 35.7413 −4.7562 3.0023

Tercer iteración

" # −1 
(3)      
x1 1.9987 6.9997 1.9987 −0.0045 2.0000
(3) = − =
x2 3.0023 27.0412 37.0041 0.0496 3.0000

Cuarta iteración

" # −1 
(4)      
x1 2.0000 7.0000 2.0000 −0.00000129 2.0000
(4) = − =
x2 3.0000 27.0000 37.0000 −0.00002214 3.0000

Note que solamente 4 iteraciones son necesarias para llegar a la solución x = [2, 3]T
La implementación en Matlab para este ejemplo son:
Para la función tenemos
function f = f1(x)

n = length(x);
f = zeros(n,1);

f(1) = x(1)^2 + x(1)*x(2) - 10;


f(2) = x(2) + 3*x(1)*x(2)^2 - 57;
end
El Jacobiano
function J = J1(x)
n = length(x);
4.2. MÉTODOS PARA SISTEMAS NO LINEALES 109

J = zeros(n, n);

J(1,1) = 2*x(1) + x(2);


J(1,2) = x(1);
J(2,1) = 3*x(2)^2;
J(2,2) = 1 + 6*x(1)*x(2);
end
y la ejecución
>> Newton_Raphson(@f1, @J1, [1.5,3.5]’)

ans =

2.0000
3.0000

Ejemplo 2

Resolver el siguiente sistema de ecuaciones dado por las ecuaciones y cuya solución gráfica
se muestra en la figura 4.11

f1 (x1 , x2 ) = x21 –2x1 –x2 + 0.5


f2 (x1 , x2 ) = x21 + 4x22 –4

El Jacobiano es  
2x1 − 2 −1
J(x) =
2x1 8x2
y el arreglo de funciones

x21 –2x1 –x2 + 0.5


 
f (x) =
x21 + 4x22 –4

Considerando como valores iniciales x(0) = [0, 1]T tenemos:


Primer iteración
" # −1 
(1)      
x1 0 −2 −1 −0.5 −0.25
(1) = − =
x2 1 0 8 0.0 1.00
110 SISTEMAS DE ECUACIONES

x2
0

-1

-2
-2 -1 0 1 2
x1

Figura 4.11: Curvas con la solución del sistema del ejemplo 2

Segunda iteración
" # −1 
(2)      
x1 −0.2500 2.5000 −1.0000 0.0625 −0.2226
(2) = − =
x2 1.0000 −0.5000 8.0000 0.0625 0.9939

Tercer iteración

" # −1 
(3)      
x1 −0.2226 −2.4451 −1.0000 −0.0008 −0.2222
(3) = − =
x2 0.9939 −0.4451 7.9512 0.0009 0.9938

Cuarta iteración

" # −1 
(4)      
x1 −0.2222 −2.4444 −1.0000 −0.00002300 −0.2222
(4) = − =
x2 0.9938 −0.4444 7.9505 0.00000038 0.9938

La implementación en Matlab para este ejemplo son:


Para la función tenemos
4.2. MÉTODOS PARA SISTEMAS NO LINEALES 111

function f = f2(x)

n = length(x);
f = zeros(n,1);

f(1) = x(1)*x(1) - 2*x(1) - x(2) + 0.5;


f(2) = x(1)*x(1) + 4*x(2)*x(2) - 4;
end

El Jacobiano

function y = J2(x)
n = length(x);
y = zeros(n, n);
y(1,1) = 2*x(1) -2;
y(1,2) = -2;
y(2,1) = 2*x(1);
y(2,2) = 8*x(2);
end

y la ejecución

>> Newton_Raphson(@f2, @J2, x)

ans =

-0.2222
0.9938

4.2.3. Ejemplo

Para el circuito que se muestra en la figura 4.12, esta constituido por dos mallas y dos
cargas. Se sea calcular la corriente que circula por cada uno de los elementos y la potencia
que debe suministrar la fuente de voltaje.

La ecuaciones de Voltaje para cada una de las mallas es:

V1 − R1 (i1 + i2 ) − L1 /i1 = 0
V1 − R1 (i1 + i2 ) − R2 i2 − L2 /i2 = 0
112 SISTEMAS DE ECUACIONES

Figura 4.12: Circuito eléctrico de dos mallas

Reorganizando las funciones tenemos

 
V i1 − R1 (i1 + i2 )i1 − L1
F = =0
V i2 − R1 (i1 + i2 )i2 − R2 i22 − L2
function f = Fun(i)
N = length(i);
f = zeros(N,1);

V = 100;
R1 = 2;
R2 = 3;
L1 = 100;
L2 = 200;

f(1) = V*i(1) - R1*(i(1)+i(2))*i(1) - L1;


f(2) = V*i(2) - R1*(i(1)+i(2))*i(2) - R2*i(2)^2 - L2;
end
El Jacobiano para este sistema es:

 
V − R1 (2i1 + i2 ) −i1 R1
J=
−i2 R1 V1 − R1 (i1 + 2i2 ) − 2R2 i2
function J = JacSistema(i)
V = 100;
R1 = 2;
R2 = 3;
%L1 = 100;
%L2 = 200;
4.2. MÉTODOS PARA SISTEMAS NO LINEALES 113

J(1,1) = V - R1*(2*i(1) + i(2)) ;


J(1,2) = -i(1)*R1;
J(2,1) = -i(2)*R1;
J(2,2) = V - (i(1) + 2*i(2))*R1 - 2*i(2)*R2 ;
end
La solución considerando un valor inicial de corrientes I (0) = [0, 0]T :

>> I = NewtonRaphson(@FunSistema, @JacSistema, [0,0]’)


1.- 1 2

2.- 1.0720 2.3114

3.- 1.0728 2.3185

4.- 1.0728 2.3185

I =

1.0728
2.3185
Potencia de la fuente PV = V (i1 + i2 ) = 100(1.0728 + 2.3185) = +339.1282
Potencia consumida por R1 es PR1 = −R1 (i1 + i2 )2 = −2(1.0728 + 2.3185)2 = −23.0016
Potencia consumida por R2 es PR1 = −R2 i22 = −3(2.3185)2 = −16.1266
La potencia consumida por las cargas es L1 + L2 = −300.
La suma de la potencia es cero.

Desventajas del Método de Newton

Aunque el método de Newton-Raphson en general es muy eficiente, hay situaciones en que


se comporta en forma deficiente. Un caso especial, raı́ces múltiples.

Ejemplo

Determinar la raı́z de la función f (x) = x10 –1.


La solución utilizando el método de Newton-Raphson queda:
114 SISTEMAS DE ECUACIONES

f (x(k) )
x(k+1) = x(k) −
f 0 (x(k+1) )

Sustituyendo valores tenemos

10
(k+1) (k) x(k) −1
x =x − 9
10 x(k)

Y la solución numérica es:


x(k) f (x(k) ) f 0 (x(k) )
0.5000 -0.9990 0.0195
51.6500 135114904483914000.0000 26159710451871000.0000
46.4850 47111654129711500.0000 10134807815362300.0000
41.8365 16426818072478500.0000 3926432199748670.0000
37.6529 5727677301318310.0000 1521180282851980.0000
33.8876 1997117586819850.0000 589336409039672.0000
30.4988 696351844868619.0000 228320999775654.0000
27.4489 242802875029547.0000 88456233382052.8000
24.7040 84660127717097.5000 34269757191973.2000
22.2336 29519161271064.1000 13276806089225.7000
20.0103 10292695105054.7000 5143706707446.1600
18.0092 3588840873655.1100 1992777367871.5700
16.2083 1251351437592.9200 772042782329.1500
14.5875 436319267276.5290 299105192259.1190
13.1287 152135121499.2910 115879479847.7330
11.8159 53046236848.5329 44894084747.9692
10.6343 18496079117.2577 17392888266.5936
9.5708 6449184014.3077 6738361277.7304
8.6138 2248691421.7628 2610579221.6818
7.7524 784070216.9426 1011391879.0870
Optimización

5.1. Optimización no-restringida. Método de búsqueda de la


sección dorada

La búsqueda de la sección dorada es una técnica simple de búsqueda de una sola variable
de propósito general. La clave para hacer eficiente este procedimiento es la mejor elección
de los puntos intermedios. Esta meta se puede alcanzar al especificar que las siguientes dos
condiciones se cumplan (ver [?]).

l0 = l1 + l2 (5.9)

l1 l2
= (5.10)
l0 l1

Sustituyendo la ecuación 5.9 en la ecuación 5.10 obtenemos:


l1 l2
= (5.11)
l1 + l2 l1

l2 2
Definimos R = l1√y sustituimos en la ecuación 5.11 para obtener R + R − 1, cuya solución
positiva es R = 5−1
2 . R es definido como la razón dorada y fue un número ampliamente
utilizado por los Griegos en su arquitectura.
El algoritmo de la razón dorada es:
La implementación en Matlab es:
function y = Razon_Dorada(f, xl, xu)

R = (sqrt(5) -1)/2
t = 0;

115
116 OPTIMIZACIÓN

Algoritmo 1 Algoritmo de Búsqueda con Razón Dorada


Entrada: xu , xl , f (x)
Salida: x
mientras xu − xl > T ol hacer
d = R(xu − xl )
x1 = xl + d
x2 = xu − d
k =k+1
si f (x1 ) < f (x2 ) entonces
xl = x2
si no
xu = x1
fin si
fin mientras
si f (x1 ) < f (x2 ) entonces
devolver x1
si no
devolver x2
fin si

while (xu-xl > 0.0001)


d = R*(xu - xl);
x1 = xl + d;
x2 = xu - d;
t = t+1;
if f(x1) < f(x2)
xl = x2;
else
xu = x1;
end;

if f(x1) < f(x2)


y = x1;
else
y=x2;
end;
end;
5.1. OPTIMIZACIÓN NO-RESTRINGIDA. MÉTODO DE BÚSQUEDA DE LA SECCIÓN DORADA117

5.1.1. Ejemplo 1

Use la búsqueda de la sección dorada para encontrar el mı́nimo de la función f (x) =


2
−2seno(x) + x10 en el intervalo [0,4].
Los resultados de este ejemplo se muestran en la siguiente tabla
k xl fl x2 f2 x1 f1 xu fu d
0 0.0000 0.0000 1.5279 -1.7647 2.4721 -0.6300 4.0000 -3.1136 2.4721
1 0.0000 0.0000 0.9443 -1.5310 1.5279 -1.7647 2.4721 -0.6300 1.5279
2 0.9443 -1.5310 1.5279 -1.7647 1.8885 -1.5432 2.4721 -0.6300 0.9443
3 0.9443 -1.5310 1.3050 -1.7595 1.5279 -1.7647 1.8885 -1.5432 0.5836
4 1.3050 -1.7595 1.5279 -1.7647 1.6656 -1.7136 1.8885 -1.5432 0.3607
... ... ... ... ... ... ... ... ... ...
17 1.4267 -1.7757 1.4271 -1.7757 1.4274 -1.7757 1.4278 -1.7757 0.0007

Según los resultados de la tabla la solución es x = 1.4267 con f (x) = −1.7757.


Para realizar la ejecución dar
>> Razon_Dorada(@fun_1, 0, 4)

ans =

1.4276

5.1.2. Ejemplo 2
2
Use la búsqueda de la sección dorada para encontrar el mı́nimo de la función f (x) = −xe−x
en el intervalo [0,4].
Los resultados de este ejemplo se muestran en la siguiente tabla
k xl fl x2 f2 x1 f1 xu fu
0 0.0000 0.0000 1.5279 -0.1480 2.4721 -0.0055 4.0000 -0.0000
1 0.0000 0.0000 0.9443 -0.3871 1.5279 -0.1480 2.4721 -0.0055
2 0.0000 0.0000 0.5836 -0.4151 0.9443 -0.3871 1.5279 -0.1480
3 0.0000 0.0000 0.3607 -0.3167 0.5836 -0.4151 0.9443 -0.3871
4 0.3607 -0.3167 0.5836 -0.4151 0.7214 -0.4287 0.9443 -0.3871
... ... ... ... ... ... ... ... ...
22 0.7071 -0.4289 0.7071 -0.4289 0.7071 -0.4289 0.7072 -0.4289

Según los resultados de la tabla la solución es x = 0.7071 con f (x) = −0.4289.


118 OPTIMIZACIÓN

Para realizar la ejecución dar


>> Razon_Dorada(@fun_2, 0, 4)

ans =

0.7071

5.2. Optimización no-restringida. Método de Newton

5.2.1. Método de Newton en una dimensión

Consideremos que la función f : R → R es de clase dos, es decir que la segunda derivada


puede ser calculada. La idea consiste en reemplazar en la vecindad del punto xk de la
función f por una aproximación cuadrática q(x) dada por
1
q(x) = f (x(k) ) + f 0 (x(k) )(x − x(k) ) + f 00 (x(k) )(x − x(k) )2
2

llamaremos a x(k+1) el mı́nimo de q(x). Para calcularlo, es necesario que la matriz f 00 (x(k) )
sea positivo. La función q(x) es entonces estrictamente convexa y tiene un mı́nimo único
en xk+1 dado por
q 0 (x(k+1) ) = 0
Esto da lugar sistema lineal de ecuaciones:

f 0 (x(k) ) = −f 00 (x(k) )(x(k+1) − x(k) )

La solución para x(k+1) es el mı́nimo, lo cual da lugar a la recurrencia

f 0 (x(k) )
x(k+1) = x(k) − (5.12)
f 00 (x(k) )

La implementación en Matlab es
function y = Newton_1d(derf, der2f, x)
x1 = x;
x2 = x;
while 1
delta = derf(x1)/der2f(x1);
x2 = x1 - delta;
disp([x1, derf(x1), der2f(x1), x2]);
5.2. OPTIMIZACIÓN NO-RESTRINGIDA. MÉTODO DE NEWTON 119

Algoritmo 2 Algoritmo de Newton Unidimensional


Entrada: f (x), x0
Salida: x(k)
mientras kf 0 (x(k) )k ≥ ε hacer
f 0 (x(k) )
x(k+1) = x(k) − f 00 (x(k) )
k =k+1
fin mientras
devolver x(k)

if abs(delta) < 1e-6 break;


else
x1 =x2;
end;
end;
y = x2;

5.2.2. Ejemplo 1

x2
Calcular el máximo de la función f (x) = −2seno(x) + 10 utilizando el método de Newton
con un valor inicial x0 = 0.5.

Para resolver tenemos que calcular f 0 (x) y f 00 (x)

x
f 0 (x) = − 2cos(x)
5

1
f 00 (x) = + 2sin(x)
5

Para resolver hacemos


120 OPTIMIZACIÓN

k = 0
−1.6551
x(1) = 0.5000 − = 1.9282
1.1588
k = 1
(2) 1.0854
x = 1.9282 − = 1.4047
2.0735
k = 2
(3) −0.0495
x = 1.4047 − = 1.4275
2.1725
k = 3
8.20126 × 10−5
x(4) = 1.4275 − = 1.4275
2.1795
k = 4
2.02094 × 10−10
x(5) = 1.4275 − = 1.4275
2.1795

Para ejecutar hacer


>> Newton_1d(@der_fun_1, @der2_fun_1, 0.5)

ans =

1.4276

function y = der_fun_1(x)
y = x/5 - 2*cos(x);

function y = d2f1(x)
y = 1/5 + 2*sin(x);

5.2.3. Ejemplo 2
2
Dada la función f (x) = −xe−x , calcular el mı́nimo utilizando el método de Newton para
un valor inicial x0 = −1.0.
Para resolver tenemos que calcular f 0 (x) y f 00 (x)
2
f 0 (x) = (2x2 − 1)e−x
5.2. OPTIMIZACIÓN NO-RESTRINGIDA. MÉTODO DE NEWTON 121

2
f 00 (x) = (6x − 4x3 )e−x
Para soluciona hacemos

k = 0
(1) 0.3679
x = −1.0000 − = −0.5000
−0.7358
k = 1
−0.3894
x(2) = −0.5000 − = −0.7000
−1.9470
k = 2
(3) −0.0123
x = −0.7000 − = −0.7071
−1.7325
k = 3
−0.0001
x(4) = −0.7071 − = −0.7071
−1.7156
k = 4
(5) −0.0000
x = −0.7071 − = −0.7071
−1.7155

Para ejecutar en Matlab


>> Newton_1d(@der_fun_2, @der2_fun_2, -1.0)

ans =

-0.7071

function y = der_fun_2(x)
y = (2*x^2 -1)*exp(-x^2);

function y = der2_fun_2(x)
y = (6*x-4*x^3)*exp(-x^2);

5.2.4. Método de Newton en N dimensiones

Consideremos que la función f es de clase dos, es decir que la segunda derivada puede ser
calculada. La idea consiste en reemplazar en la vecindad del punto xk de la función f por
una aproximación cuadrática q(x) dada por

1
q(x) = f (x(k) ) + ∇f T (x(k) )(x − x(k) ) + (x − x(k) )T ∇2 f (x(k) )(x − x(k) )
2
122 OPTIMIZACIÓN

donde ∇f (x(k) ) es el gradiente de la función o vector de primeras derivadas y ∇f 2 (x(k) ) es


la matriz de segundas derivadas o matriz Hessiana, ambos valuados en el muno x(k) . Lla-
maremos a x(k+1) el mı́nimo de q(x) y para calcularlo, es necesario que la matriz ∇2 f (x(k) )
sea una matriz definida positiva. La función q(x) es entonces estrictamente convexa y tiene
un mı́nimo único en x(k+1) dado por

∇q (x(k+1) ) = 0

Esto da lugar sistema lineal de ecuaciones:

∇f (x(k) ) = −∇2 f (x(k) )(x(k+1) − x(k) )

La solución para xk+1 es el mı́nimo, lo cual da lugar a la recurrencia

h i−1
x(k+1) = x(k) − ∇2 f (x(k) ) ∇f (x(k) ) (5.13)

En el algoritmo 3 se presenta el proceso para encontrar en mı́nimo de una función utilizando


el algoritmo de Newton y abajo la implementación en Matlab

function r = Newton(g, H, x1)

while 1
d= inv(H(x1))* g(x1);
x2 = x1 - d;
if norm(d) < 0.0001 break;
else x1 = x2;
end;
end;
r = x2;

Algoritmo 3 Algoritmo de Newton


Entrada: Dado una función diferenciable dos veces f (x) y un valor inicial x0
Salida: x(k)
mientras (k∇f (x(k) )k ≤ ε) hacer
x(k+1) = x(k) − [∇2 f (x(k) )]−1 ∗ ∇f (x(k) )
k ←k+1
fin mientras
devolver x(k)
5.2. OPTIMIZACIÓN NO-RESTRINGIDA. MÉTODO DE NEWTON 123

5.2.5. Ejemplo 1

2 2 (0) (0)
Minimizar es f (x) = x1 e−x1 −x2 , con un punto inicial x1 = −0.5, x2 = −0.1 aplicando el
Método de Newton.
El vector gradiente para esta función es:

" 2 2
#
(1 − 2x21 )e(−x1 −x2 )
∇f (x1 , x2 ) = 2 2
−2x1 x2 e(−x1 −x2 )

function g = Gradiente_f1(x)
n = length(x);
g = zeros(n, 1);

val_e = exp(-x(1)^2-x(2)^2);

g(1) = val_e*(1-2*x(1)^2);
g(2) = val_e*(-2*x(1)*x(2));
El Hessiano es:

" 2 2 2 2
#
2 (−6x1 + 4x31 )e(−x1 −x2 ) (−2x2 + 4x21 x2 )e(−x1 −x2 )
∇ f (x1 , x2 ) = 2 2 2 2
(−2x2 + 4x21 x2 )e(−x1 −x2 ) (−2x1 + 4x1 x22 )e(−x1 −x2 )

function H = Hessiano_f1(x)
n = length(x);
H = zeros(n, n);

val_e = exp(-x(1)^2-x(2)^2);
H(1,1) = val_e*(-6*x(1)+4*x(1)^3);
H(1,2) = val_e*(-2*x(2)+4*x(1)^2*x(2));
H(2,1) = H(1,2);
H(2,2) = val_e*(-2*x(1)+4*x(1)*x(2)^2);
Primer iteración

" # −1 
(1)      
x1 −0.5000 1.9276 0.0771 0.3855 −0.7049
(1) = − =
x2 −0.1000 0.0771 0.7556 −0.0771 0.0230

Segunda iteración
124 OPTIMIZACIÓN

" # −1 
(2)      
x1 −0.7049 1.7199 −0.0002 0.0038 −0.7071
(2) = − =
x2 0.0230 −0.0002 0.8564 0.0197 −0.0000

Tercer iteración

" # −1 
(3)      
x1 −0.7071 1.7155 0.0000 0.0180 −4 −0.7071
(3) = − × 10 =
x2 −0.0000 0.0000 0.8578 −0.2114 −0.0000

En la siguiente tabla se muestra como la función f (x) disminuye su valor en el proceso de


convergencia

k f (x(k) )
0 -0.3855
1 -0.4287
2 -0.4289
3 -0.4289

Para ejecutar dar

>> Newton(@Gradiente_f1, @Hessiano_f1, [-0.5;-0.1])

ans =

-0.7071
0.0000

En la figura 5.13 se muestra la función a la derecha y a la izquierda las curvas de nivel. El


código en matlab utilizado para generar estas imágenes es

[x,y] = meshgrid(-4:0.2:4, -4:0.2:4);


z = x.*exp(-x.^2-y.^2);
surf(x,y,z)

[x,y] = meshgrid(-4:0.2:4, -4:0.2:4);


z = x.*exp(-x.^2-y.^2);
contour(x,y,z)
grid on
5.2. OPTIMIZACIÓN NO-RESTRINGIDA. MÉTODO DE NEWTON 125

0.5 2

0.4

0.3 1

0.2

0.1 0

0
−1
−0.1

−0.2
−2
−0.3 4

−0.4 2
−3
−0.5 0
−4 −3 −2
−2 −1 0 1 −4
2 3 −4 −4 −3 −2 −1 0 1 2 3 4
4

(a) Funsión (b) Curvas de Nivel

2 2
Figura 5.13: Mı́nimo para la función f (x1 , x2 ) = x1 e(−x1 −x2 )

5.2.6. Ejemplo 2

(0)
Minimizar es f (x) = −3.5x1 − 2x2 − x22 + x41 + 2x1 x2 + x42 , con un punto inicial x1 = 1.0,
(0)
x2 = 1.0 aplicando el Método de Newton.
El vector gradiente para esta función es:

−3.5 + 4x31 + 2x2


 
∇f (x1 , x2 ) =
−2 + 2x1 − 2x2 + 4x32
function g = Gradiente_f2(x)
n = length(x);
g = zeros(n, 1);

g(1) = -3.5 + 4*x(1)^3 + 2*x(2);


g(2) = -2.0 + 2*x(1) - 2*x(2) + 4*x(2)^3;
El Hessiano es:

12x21
 
2 2
∇ f (x1 , x2 ) =
2 −2 + 12x22
function H = Hessiano_f2(x)
n = length(x);
H = zeros(n, n);
126 OPTIMIZACIÓN

H(1,1) = 12*x(1)^2;
H(1,2) = 2;
H(2,1) = 2;
H(2,2) = -2+12*x(2)^2;
Primer iteración

" # −1 
(1)      
x1 1 12 2 2.5000 0.8190
(1) = − =
x2 1 2 10 2.0000 0.8362

Segunda iteración

" # −1 
(2)      
x1 0.8190 8.0485 2.0000 0.3695 0.7820
(2) = − =
x2 0.8362 2.0000 6.3909 0.3044 0.8001

Tercer iteración

" # −1 
(3)      
x1 0.7820 7.3385 2.0000 0.0132 0.7807
(3) = − =
x2 0.8001 2.0000 5.6828 0.0129 0.7983

cuarta iteración

" # −1 
(4)      
x1 0.7807 7.3139 2.0000 0.1610 −4 0.7807
(4) = − × 10 =
x2 0.7983 2.0000 5.6483 0.3115 0.7983

En la siguiente tabla se muestra como la función f (x) disminuye su valor en el proceso de


convergencia
k f (x(k) )
0 -2.5000
1 -2.9296
2 -2.9422
3 -2.9423
Para ejecutar dar

>> Newton(@Gradiente_f2, @Hessiano_f2, [1;1])

ans =
5.2. OPTIMIZACIÓN NO-RESTRINGIDA. MÉTODO DE NEWTON 127

-0.7807
0.7983
En la figura 5.14 se muestras las curvas de nivel correspondientes a este ejemplo las cuales
fueron determinadas utilizando el siguiente código.

1.5

0.5
x2

−0.5

−1

−1.5

−2
−2 −1.5 −1 −0.5 0 0.5 1 1.5 2
x1

Figura 5.14: Curvas de nivel para el ejemplo2.

[x1, x2] = meshgrid(-2:0.2:2, -2:0.2:2);


f =-3.5*x1-2*x2-x2.^2 + x1.^4 + 2*x1.*x2 + x2.^4;
contour(x1,x2,f)
grid on
xlabel(’x_1’)
ylabel(’x_2’)

5.2.7. Propiedades del Método de Newton

Una propiedad importante de este método es que converge en un solo paso cuando se tiene
una función estrictamente cuadrática.
Demostración:
Dada una función cuadrática
1
f (x) = xT Ax + xT b + c
2
128 OPTIMIZACIÓN

el gradiente lo podemos calcular como ∇f (x) = Ax + b y el Hessiano es ∇2 f (x) = A. Si


sustituimos en la ecuación 5.13 tenemos

= x(k) − A−1 (Ax(k) + b)

x(k+1) = x(k) − x(k) − A−1 b


Lo que finalmente da como resultado

x(k+1) = −A−1 b

5.2.8. Ejemplo 3

Dada la función f (x) = 10x21 + x22 y un punto inicial x(0) = [1, 2]T , calcular el mı́nimo
utilizando el algoritmo de Newton.
Para esta función el gradiente y el Hessiano es:

20x1
∇f (x) =
2x2

y el Hessiano es:
20 0
A(x) =
0 2
Aplicando la ecuación 5.13 tenemos
−1
(1) 1 20 0 20 0
x = − =
2 0 2 4 0

5.2.9. Ejemplo 4

2 2 (0) (0)
Minimizar es f (x) = x1 e−x1 −x2 , con un punto inicial x1 = −0.5, x2 = −0.5 aplicando el
Método de Newton.
Primer iteración

" # −1 
(1)      
x1 −0.5000 1.5163 0.3033 0.3033 −1.0000
(1) = − =
x2 −0.5000 0.3033 0.3033 −0.3033 1.0000

Segunda iteración
5.2. OPTIMIZACIÓN NO-RESTRINGIDA. MÉTODO DE NEWTON 129

" # −1 
(2)      
x1 −1.0000 0.2707 0.2707 −0.1353 −1.2500
(2) = − =
x2 1.0000 0.2707 −0.2707 0.2707 1.7500

Tercer iteración

" # −1 
(3)      
x1 −1.2500 −0.0031 0.0729 −0.0208 −1.3535
(3) = − =
x2 1.7500 0.0729 −0.1256 0.0429 2.0314

Cuarta iteración

" # −1 
(4)      
x1 −1.3535 −0.0046 0.0280 −0.0069 −1.4416
(4) = − =
x2 2.0314 0.0280 −0.0507 0.0142 2.2629

Para ejecutar dar

>> Newton(@Gradiente_f1, @Hessiano_f1, [-0.5;-0.5])

En la siguiente tabla se muestra como la función f (x) disminuye su valor en el proceso de


convergencia
(k) (k)
k x1 x2 f (x(k) )
0 -0.5000 -0.5000 -0.3033
1 -1.0000 1.0000 -0.1353
2 -1.2500 1.7500 -0.0123
3 -1.3535 2.0314 -0.0035
4 -1.4416 2.2629 -0.0011
5 -1.5206 2.4654 -0.0003
6 -1.5933 2.6481 -0.0001
7 -1.6611 2.8161 -0.0000
8 -1.7251 2.9727 -0.0000
9 -1.7859 3.1198 -0.0000
De los datos de la tabla podemos notar que la función en lugar de disminuir crece. Esta
condición se debe a que el punto inicial para el método de Newton esta muy lejos y la
aproximación cuadrática, resulta in apropiada. En la figura 5.15 se muestra la función y se
puede ver que esta tiene solamente un mı́nimo.
130 OPTIMIZACIÓN

0.5

0.4

0.3

0.2

0.1

−0.1
4
−0.2

−0.3 2

−0.4 0

−0.5 −2
−4 −3 −2 −1 0 1 −4
2 3 4

2 2
Figura 5.15: Función f (x) = x1 e−x1 −x2 .

5.2.10. Problemas de convergencia del Método de Newton

Consideremos el caso de una función donde se tienen múltiples raı́ces como es el caso de
la función f (x) = (x − 3)5 /5 cuyo primer derivada es f 0 (x) = (x − 3)4 . Note que en este
caso la solución es un polinomio de grado 4 en cuyo caso tendrá cuatro soluciones con
x∗ = 3. Si aplicamos el método de Newton tendremos una convergencia como se muestra
a continuación
k f (x(k) )
1 2.2500
2 2.4375
3 2.5781
4 2.6836
5 2.7627
6 2.8220
7 2.8665
8 2.8999
9 2.9249
10 2.9437
.. ..
. .
44 3.0000
45 3.0000
Si uno desea aplicar el método a una función arbitraria encontraremos algunas dificultades,
esencialmente debido al hecho de que no encontraremos convergencia global. Si el punto
5.2. OPTIMIZACIÓN NO-RESTRINGIDA. MÉTODO DE NEWTON 131

inicial x(0) esta muy lejos de x∗ el método no podrá converger.

Para comenzar, la aproximación de f (x) dada por q(x) es solamente valida a la vecindad de
xk , el tamaño de paso puede ser controlado a través de una formula iterativa de tipo:
−1
x(k+1) = x(k) − λ(k) ∇2 f (x(k) ) ∇f (x(k) )


donde λ(k) es un escalar, seleccionado por ejemplo, de tal manera que ||x(k+1) −x(k) || no sea
muy largo. También podemos seleccionarlo tal que λ(k) minimice φ(λ(k) ) = f (x(k) +λ(k) d(k) )
en la dirección de:
−1
d(k) = − ∇2 f (x(k) ) ∇f (x(k) )


5.2.11. Ejemplo 5

5
Minimizar f (x) = (x−3)5 utilizando el método de Newton y la modificación planteada
utilizando un valor λ(k) = 2.9. Considere un punto inicial x(0) = 2.

k Newton Newton con λ = 2.9


0 2.00000 2.00000
1 2.33333 2.96667
2 2.55556 2.99889
3 2.70370 2.99996
4 2.80247 3.00000
5 2.86831 3.00000
6 2.91221 3.00000
7 2.94147 3.00000
8 2.96098 3.00000
9 2.97399 3.00000
10 2.98266 3.00000
11 2.98844 3.00000

5.2.12. Método de Newton Modificado

Una alternativa propuesta por Ralston y Rabinowitz (1978) es la de definir una nueva
función u(x), que es el cociente del gradiente de g(x) y su derivada (en una dimensión)

f 0 (x)
u0 (x) =
f 00 (x)
132 OPTIMIZACIÓN

Se puede mostrar que esta función tiene las mismas raı́ces que f 0 (x) y que la multiplicidad
de raı́ces no afectará. La formulación del método de Newton es:
u0 (x)
xk+1 = xk −
u00 (x)

La derivada de u0 (x) es:

f 00 (x)f 00 (x) − f 0 (x)f 000 (x)


u00 (x) =
[f 00 (x)]2

Sustituyendo esta, tenemos la formulación final del Método de Newton modificado.

f 00 (x(k) )f 0 (x(k) )
x(k+1) = x(k) −
f 00 (x(k) )f 00 (x(k) ) − f 0 (x(k) )f 000 (x(k) )

function y = Newton_1d_modificado(der1f, der2f, der3f, x)


x1 = x;
x2 = x;
for iter = 1:10
delta = der1f(x1)*der2f(x1)/(der2f(x1)^2 - der1f(x1)*der3f(x1));
x2 = x1 - delta;
disp([iter x2]);
if abs(delta) < 1e-6 break;
else
x1 =x2;
end;
end;
y = x2;

Ejemplo

(x−3)5
Para la función f (x) = 5 para un valor inicial x0 = 2 la solución es:
La primer derivada es:
f 0 (x) = (x − 3)4
La segunda derivada
f 00 (x) = 4(x − 3)3
y la tercer derivada
f 000 (x) = 12(x − 3)2
5.3. METODO SIMPLEX 133

Evaluando en el punto inicial tenemos f 0 (2) = 1, f 00 (2) = −4 y f 000 (2) = 12 sustituyendo


en la iteración de Newton tenemos

(1) × (−4)
x(1) = 2 − =3
(4)2 − (1) ∗ (12)
Note que la solución se da en una sola iteración. Para ejecutar hacer
Newton_1d_modificado(@der_fun_3, @der2_fun_3, @der3_fun_3,2)

5.3. Optimización lineal restringida (programación lineal)


Método Simplex

En programación lineal (o Pl por simplicidad) es un procedimiento de optimización que


trata de cumplir con un objetivo como maximizar las utilizares o minimizar el costo, en
presencia de restricciones como lo son las fuentes limitadas. El término lineal denota que
las funciones matemáticas que representan ambos, la función objetivo y las restricciones
son lineales.

5.3.1. Forma estándar

El problema básico de programación lineal consiste en dos partes principales: la función


objetivo y un conjunto de restricciones. Para un problema de maximización la función
objetivo es por lo general expresada como:
Maximizar

Z = c1 x1 + c2 x2 + · · · + cn xn

donde cj es el pago por cada unidad de la j-esima actividad que se lleva a cabo y xj es la
magnitud o cantidad de la j-esima actividad.
Las restricciones se pueden representar en forma general como:

ai,1 x1 + ai,2 x2 + · · · + ai,n xn ≤ bi

donde ai,j cantidad de i-ésima fuente que se consume por cada unidad de j-ésima actividad
y bi cantidad de la i-ésima fuente que ésta disponible.
134 OPTIMIZACIÓN

Suponga que una planta procesadora de gasolina recibe cada semana una cantidad fija
de materia prima. Esta última se procesa en dos tipos de gasolina de calidad regular y
premium. Estas clases de gasolina son de alta demanda; es decir, se tiene garantizada
su venta y se obtiene diferentes utilidades para la compañı́a. Si embargo su producción
involucra ambas restricciones, tiempo y almacenaje en sitio. Por ejemplo, sólo una de las
clases se puede producir a la vez, y las instalaciones están abiertas solo 80 horas. Además,
existe un limite de almacenamiento para cada uno de los productos. Todos estos factores
se en listan en la siguiente tabla:
Recurso Regular Premium Disponibilidad
Materia Prima 7 m3 /tonelada 11 m3 /tonelada 77 m3 /semana
Tiempo de Producción 10 hr/tonelada 8 hr/tonelada 80 hr/semana
Almacenamiento 9 toneladas 6 toneladas
Aprovechamiento 150 pesos/tonelada 175 pesos/tonelada
Solución

El ingeniero que opera esta planta debe decidir la cantidad a producir de cada gasolina para
maximizar las utilidades. Si las cantidades producidas cada semana de gasolina regular
y premium son designadas x1 y x2 respectivamente, la ganancia total se puede calcular
como

Ganancia total = 150x1 + 175x2

o escribirla como una función objetivo en programación lineal

Maximiza Z = 150x1 + 175x2

Las restricciones se pueden desarrollar en una forma similar. Por ejemplo el total de gasolina
cruda utilizada se puede calcular como

Total de materia prima utilizada = 7x1 + 11x2

Este total no puede exceder el abastecimiento disponible de 77 m3/semana, ası́ que la


restricción se puede representar como

7x1 + 11x2 ≤ 77

Las restricciones restantes se pueden desarrollar en una forma similar, la formulación total
resultante para la PL está dada por

Maximizar Z = 150x1 + 175x2

Sujeta a
5.3. METODO SIMPLEX 135

7x1 + 11x2 ≤ 77
10x1 + 8x2 ≤ 80
x1 ≤ 9
x2 ≤ 6
x1 ≥ 0
x2 ≥ 0

5.3.2. Método Simplex

El método Simplex se basa en la suposición de que la solución óptima estará en un punto


extremo. Ası́, el procedimiento debe debe de ser capaz de discernir si durante la solución a
un problema ocurre un punto extremo. Para realizar esto, las ecuaciones con restricciones
se reformulan como igualdades por medio de la introducción de las llamadas variables de
holgura.
Variables de Holgura. Como lo indica su nombre, una variable de holgura mide cuanto de
una fuente restringida esta disponible es decir, cuanto holgura esta disponible. Por ejemplo,
recuerde la fuente restringida que se utilizo en el ejemplo:

7x1 + 11x2 ≤ 77

Se puede definir una variable h1 como la cantidad de gasolina cruda que no se usa para
una nivel de producción en particular (x1 , x2 ). Si esta cantidad se agrega al lado izquierdo
de la restricción, forma la relación exacta.

7x1 + 11x2 + h1 = 77

Ahora se reconoce lo que la variable de holgura nos indicaba. Si esta es positiva, significa
que tiene algo de holgura para esta restricción. Esto es, se cuenta con algo más de recursos
que no han sido utilizado por completo. Si es negativa nos indica que nos hemos excedido en
la restricción. Finalmente, si es cero denota que se cumplió exactamente con la restricción.
Es decir, se dispuso de todo el recurso puesto que esta es la condición donde las lı́neas de
restricción se interceptan, la variable de holgura proporciona un medio para determinar
puntos extremos.
Una variable de holgura diferente se desarrolla para cada ecuación restringida resultando
en lo que se llama versión completamente aumentada.
136 OPTIMIZACIÓN

Z = 150x1 + 175x2

Sujeta a
7x1 +11x2 +h1 = 77
10x1 +8x2 +h2 = 80
x1 +h3 =9
x2 +h4 = 6

Advierta como se han formulado de igual modo las cuatro ecuaciones, de tal manera que
las incógnitas están alineadas en las columnas. Se hizo ası́ para resaltar que ahora se trata
de un sistema de ecuaciones algebraicas lineales.
Los pasos del Método Simplex son los siguientes:
1. Utilizando la forma estándar, determinar una solución básica factible inicial igualando
a las n − m variables igual a cero (el origen).
2. Seleccionar la variable de entrada de las variables no básicas que al incrementar su
valor pueda mejorar el valor en la función objetivo. Cuando no exista esta situación, la
solución actual es la óptima; si no, ir al siguiente paso. Esta selección se hada tomando
el j-ésimo coeficiente de la función objetivo con el coeficiente cj mas grande.
3. Seleccionar la variable de salida de las variables básicas actuales. Tomamos la i-ésima
variable tal que bi /ai,j tenga el coeficiente mas pequeño no negativo.
4. Determinar la nueva solución al hacer la variable de entrada básica y la variable
de salida no básica, ir al paso 2 (actualizar). La solución se obtiene haciendo una
iteración de Gauss-Jordan.
La implementación en Matlab es:
function x = Simplex(C, A, b)
N = length(b);
B = [A, diag(ones(N,1)), b];
B = [B; C, zeros(1, N+1)]
M = length(B(1,:));

while 1
[mm, m] = max(B(N+1,:)) ;
[mn, n] = imin(B(1:N, M)./B(1:N, m));

if mm == 0
break;
5.3. METODO SIMPLEX 137

end;

B(n,:) = B(n, :)./B(n,m);

for k = 1: N+1
if n ~= k
B(k,:) = B(k,:) - B(n,:)*B(k,m);
end;
end;
end;
x=B;

5.3.3. Ejemplo 1

Resolver el problema de la Gasolina planteado como

Z = 150x1 + 175x2

Sujeta a
7x1 +11x2 +h1 = 77
10x1 +8x2 +h2 = 80
x1 +h3 =9
x2 +h4 = 6

Comenzamos por escribir la forma estándar del problema seleccionando como solución
básica factible x1 = 0, x2 = 0, h1 = 77, h2 = 80, h3 = 9 y h4 = 6. Note que las variables
de holgura tiene los valores que hacen las desigualdades ver como igualdades

 
7.00 11.00 1 0 0 0 77.00

 10.00 8.00 0 1 0 0 80.00 


 1.00 0 0 0 1 0 9.00 
 0 1.00 0 0 0 1 6.00 
150.00 175.00 0 0 0 0 0

Note que en nuestra formulación estándar la función objetivo aparece con los coeficientes
negativos, por esta razón repetiremos el procedimiento hasta que no tengamos ningún
término negativo en el renglón correspondiente a la función de costo.
Primer iteración
138 OPTIMIZACIÓN

10

x2
2

−2

−4
0 1 2 3 4 5 6 7 8 9 10
x1

Figura 5.16: Área de Factibilidad del ejemplo 1.

Dado que el costo mayor es 175 comenzamos por introducir la variable x2 por lo tanto
la columna es la 2 y sacar la variable de holgura h4 dado que esta restricción es la mas
cercana del punto básico. Por lo tanto el pivote es 4, 2

 
7.00 11.00 1 0 0 0 77.00 7

 10.00 8.00 0 1 0 0 80.00  10

1.00 0 0 0 1 0 9.00  ∞


 0 1.00 0 0 0 1 6.00  6
150.00 175.00 0 0 0 0 0

Una vez aplicado el método de Gauss Jordan tenemos

0 −11.00
 
7.00 0 1.00 0 11.00

 10.00 0 0 1.00 0 −8.00 32.00 


 1.00 0 0 0 1.00 0 9.00 

 0 1.00 0 0 0 1.00 6.00 
150.00 0 0 0 0 −175.00 −1050.00

Segunda Iteración
La siguiente variable a introducir es x1 dado que el mayor de los costos es 150 y sacar la
variable de holgura h1 dado que es la mas cercana de nuestro punto extremo. Por lo tanto
5.3. METODO SIMPLEX 139

tenemos el elemento 1, 1 como pivote

0 −11.00
 
7.00 0 1.00 0 11.00 1.57

 10.00 0 0 1.00 0 −8.00 32.00 
 3.2

 1.00 0 0 0 1.00 0 9.00 
 9
 0 1.00 0 0 0 1.00 6.00  ∞
150.00 0 0 0 0 −175.00 −1050.00

Aplicando el método de Gauss-Jordan en el elemento 1,1 tenemos

0 −1.57
 
1.00 0 0.14 0 1.57

 0 0 −1.43 1.00 0 7.71 16.29 


 0 0 −0.14 0 1.00 1.57 7.43 

 0 1.00 0 0 0 1.00 6.00 
0 0 −21.43 0 0 60.71 −1285.71

Tercer iteración
En la función de Costo tenemos un término positivo de 60.71 corresponden a la variable de
holgura h4 , por lo tanto introducimos la variable h4 y sacamos la variable h2 . Por lo tanto
el pivote para esta iteración es 2, 6

0 −1.57
 
1.00 0 0.14 0 1.57 −1.00

 0 0 −1.43 1.00 0 7.71 16.29 
 2.11

 0 0 −0.14 0 1.00 1.57 7.43 
 4.73
 0 1.00 0 0 0 1.00 6.00  6
0 0 −21.43 0 0 60.71 −1285.71

Una vez eliminada la variable de holgura h2 tenemos

0 −0.15
 
1.00 0.20 0 0 4.89

 0 0 −0.19 0.13 0 1.00 2.11 


 0 0 0.15 −0.20 1.00 0 4.11 

 0 1.00 0.19 −0.13 0 0 3.89 
0 0 −10.19 −7.87 0 0 −1413.89

Dado que no tenemos ningún termino de costo negativo, la solución la podemos obtener
de la formulación de la siguiente manera. Para x1 la solución esta en el renglón 1 dado
que hay un 1 en la posición 1,1 y es x1 = 4.89. Para x2 el 1 esta en la posición 4 por lo
tanto la solución es x2 = 3.89. Para h1 no tenemos un 1 en la columna correspondiente y
de igual manera para h2 , por lo tanto tenemos h1 = 0 y h2 = 0. Para h3 tenemos un 1
140 OPTIMIZACIÓN

en el renglón 3 por lo tanto h3 = 4.11. Finalmente para h4 tenemos un 1 en la posición


2 por lo tanto h4 = 2.11. El costo total es Z = 1413.89 y lo podemos verificar haciendo
Z = 150 × 4.89 + 175 × 3.89 = 1413.89. La solución en Matlab se calcula como
>> B = Simplex([150 175], [7 11; 10 8; 1 0; 0 1], [77; 80; 9; 6])

B =

7.00 11.00 1.00 0 0 0 77.00


10.00 8.00 0 1.00 0 0 80.00
1.00 0 0 0 1.00 0 9.00
0 1.00 0 0 0 1.00 6.00
150.00 175.00 0 0 0 0 0

B =

1.00 0 -0.15 0.20 0 0 4.89


0 0 -0.19 0.13 0 1.00 2.11
0 0 0.15 -0.20 1.00 0 4.11
0 1.00 0.19 -0.13 0 0 3.89
0 0 -10.19 -7.87 0 0 -1413.89

5.3.4. Ejemplo 2

Maximizar la función

Z = 6x1 + 4x2
Sujeta a
2x1 + 2x2 ≤ 160
x1 + 2x2 ≤ 120
4x1 + 2x2 ≤ 280

Su formulación estándar es:

 
2.00 2.00 1.00 0 0 160.00
 1.00 2.00 0 1.00 0 120.00 
 
 4.00 2.00 0 0 1.00 280.00 
6.00 4.00 0 0 0 0
5.3. METODO SIMPLEX 141

140

120

100

80

60
x2

40

20

−20

−40

−60
0 10 20 30 40 50 60 70 80 90 100
x1

Figura 5.17: Área de Factibilidad del ejemplo 2.

Primer iteración
Tomamos como pivote el renglón 3 y columna 1
 
2.00 2.00 1.00 0 0 160.00 80.0
 1.00 2.00 0 1.00 0 120.00  120.0


 4.00 2.00 0 0 1.00 280.00  70
6.00 4.00 0 0 0 0

Realizada la eliminación de la variable x1 tenemos

 
0 1.00 1.00 0 −0.50 20.00

 0 1.50 0 1.00 −0.25 50.00 

 1.00 0.50 0 0 0.25 70.00 
0 1.00 0 0 −1.50 −420.00

Segunda Iteración
Seleccionamos como pivote al renglón 1 columna 2.
 
0 1.00 1.00 0 −0.50 20.00 20.00

 0 1.50 0 1.00 −0.25 50.00  33.33

 1.00 0.50 0 0 0.25 70.00  70.00
0 1.00 0 0 −1.50 −420.00
142 OPTIMIZACIÓN

Realizada la eliminación de x2 tenemos

 
0 1.00 1.00 0 −0.50 20.00

 0 0 −1.50 1.00 0.50 20.00 

 1.00 0 −0.50 0 0.50 60.00 
0 0 −1.00 0 −1.00 −440.00

Dado que no tenemos términos negativos en el renglón de costos terminamos con solución
x1 = 60, x2 = 20, h1 = 0, h2 = 20, h3 = 0 y costo Z = 440

Para resolver en Matlab hacer

>> Simplex([6 4], [2 2; 1 2; 4 2], [160; 120; 280])

B =

2 2 1 0 0 160
1 2 0 1 0 120
4 2 0 0 1 280
6 4 0 0 0 0

ans =

0 1.0000 1.0000 0 -0.5000 20.0000


0 0 -1.5000 1.0000 0.5000 20.0000
1.0000 0 -0.5000 0 0.5000 60.0000
0 0 -1.0000 0 -1.0000 -440.0000

>>

5.3.5. Ejemplo 3

Maximizar la función
5.3. METODO SIMPLEX 143

Z = 3x1 + 4x2
Sujeta a
2x1 + 3x2 ≤ 1200
2x1 + x2 ≤ 1000
4x2 ≤ 800

La formulación utilizando Simplex queda

 
2.00 3.00 1.00 0 0 1200.00
 2.00 1.00 0 1.00 0 1000.00 
 
 0 4.00 0 0 1.00 800.00 
3.00 4.00 0 0 0 0

Primer Iteración
Tomamos como pivote el renglón 3 y columna 2
 
2.00 3.00 1.00 0 0 1200.00 400.00
 2.00 1.00 0 1.00 0 1000.00  1000.00
 
 0 4.00 0 0 1.00 800.00  200.00
3.00 4.00 0 0 0 0

Reduciendo tememos como resultado

 
2.00 0 1.00 0 −0.75 600.00
 2.00
 0 0 1.00 −0.25 800.00 

 0 1.00 0 0 0.25 200.00 
3.00 0 0 0 −1.00 −800.00

Segunda Iteración
Tomamos como pivote el renglón 1 y columna 1

 
2.00 0 1.00 0 −0.75 600.00 300.00
 2.00
 0 0 1.00 −0.25 800.00  400.00

 0 1.00 0 0 0.25 200.00  ∞
3.00 0 0 0 −1.00 −800.00

Aplicando la eliminación tenemos


144 OPTIMIZACIÓN

 
1.00 0 0.50 0 −0.38 300.00

 0 0 −1.00 1.00 0.50 200.00 

 0 1.00 0 0 0.25 200.00 
0 0 −1.50 0 0.12 −1700.00

Tercer iteración
Tomamos como pivote el renglón 2 la columna 5
 
1.00 0 0.50 0 −0.38 300.00 −789.47

 0 0 −1.00 1.00 0.50 200.00 
 400.00
 0 1.00 0 0 0.25 200.00  800.00
0 0 −1.50 0 0.12 −1700.00

 
1.00 0 −0.25 0.75 0 450.00

 0 0 −2.00 2.00 1.00 400.00 

 0 1.00 0.50 −0.50 0 100.00 
0 0 −1.25 −0.25 0 −1750.00

La solución es x1 = 450, x2 = 100 con un costo Z = 1750.00


La solución en Matlab se calcula haciendo

>> B = Simplex([3 4], [2 3; 2 1; 0 4], [1200; 1000; 800])

B =

2.00 3.00 1.00 0 0 1200.00


2.00 1.00 0 1.00 0 1000.00
0 4.00 0 0 1.00 800.00
3.00 4.00 0 0 0 0

B =

1.00 0 -0.25 0.75 0 450.00


0 0 -2.00 2.00 1.00 400.00
0 1.00 0.50 -0.50 0 100.00
0 0 -1.25 -0.25 0 -1750.00
5.3. METODO SIMPLEX 145

1000

800

600
x2

400

200

−200
0 100 200 300 400 500 600
x1

Figura 5.18: Área de Factibilidad del ejemplo 3.


146 OPTIMIZACIÓN
Ajuste de curvas

6.1. Regresión lineal por el método de mı́nimos cuadrados

El ejemplo más simple de una aproximación por mı́nimos cuadrados es mediante el ajuste
de un conjunto de pares de observaciones: [x1 , y1 ], [x2 , y2 ], [x3 , y3 ],..., [xn , yn ] a una lı́nea
recta. La expresión matemática de la lı́nea recta es:

y = a0 + a1 x + e

donde a0 y a1 , son los coeficientes que representan el cruce con el eje y y la pendiente de
la lı́nea y e representa el error de nuestra aproximación. En la figura ??, se muestra un
ejemplo de puntos a los que se les desea ajustar a una linea recta.

y
6

x
2 3 4 5 6

Figura 6.19: Un conjunto de puntos

147
148 AJUSTE DE CURVAS

Una estrategia, para ajustar a la mejor lı́nea, es minimizar la suma al cuadrado de los
errores para todos los datos disponibles

n
X n
X
E(a) = e2i = (yi − a0 − a1 xi )2
i=1 i=1

Esta misma ecuación la podemos escribir en forma matricial como

 
e1
 e2 
E(a) = [e1 , e2 , · · · , en ] 
 
.. 
 . 
en

Los elementos del vector de error ei en forma matricial queda como

 
a0
ei = yi − [1, xi ]
a1

y en general

     
e1 y1 1 x1
 e2   y2   1 x2  
a0
    
 e3 =
  y3 −
  1 x3 
.. ..  a1
 
 ..   ..  
 .   .   . . 
en yn 1 xn

En forma compacta tenemos que e = y–M a, donde M es la matriz de coordenadas en x y


a el vector de parámetros.

6.1.1. Ajuste por mı́nimos cuadrados

Si queremos encontrar el vector de parámetros a que minimiza nuestra suma de cuadrados,


tenemos que calcular la derivada de la función de error respecto al vector de parámetros e
igualar a cero.

∂E(a) ∂
= [y − M a]T [y − M a] = 0
∂a ∂a
∂E(a)
= −2M T [y − M a] = 0
∂a
6.1. REGRESIÓN LINEAL POR EL MÉTODO DE MÍNIMOS CUADRADOS 149

El valor del vector de parámetros a los calculamos resolviendo el siguiente sistema de


ecuaciones

[M T M ]a = M T y

Es común encontrar la solución de este sistema como:

 Pn Pn    Pn 
1 x a0 yi
Pni=1 Pni=1 2i = Pn
i=1
i=1 xi i=1 xi a1 i=1 xi yi

La implementación en Matlab es:

function a = AjustePolinomial (x, y, grado)

N = length(x);
M = ones(N, 1);

for k=1:grado
M = [M,x.^k];
end

a=inv(M’*M)*M’*y;
end

6.1.2. Ejemplo 1

Hacer el ajuste a una lı́nea recta de los siguientes valores

x y
1.00 0.50
2.00 2.50
3.00 2.00
4.00 4.00
5.00 3.50
6.00 6.00
7.00 5.50

La matriz M queda como


150 AJUSTE DE CURVAS

 
1 1.00

 1 2.00 


 1 3.00 

M =
 1 4.00 


 1 5.00 

 1 6.00 
1 7.00

 
1 1.00

 1 2.00 

  1 3.00   
1 1 1 1 1 1 1 7.00 28.00
MT M =
 
 1 4.00 =
1.00 2.00 3.00 4.00 5.00 6.00 7.00   28.00 140.00

 1 5.00 

 1 6.00 
1 7.00

 
0.50

 2.50 

  2.00   
1 1 1 1 1 1 1 24.00
MT y =
 
 4.00 =
1.00 2.00 3.00 4.00 5.00 6.00 7.00   119.50

 3.50 

 6.00 
5.50

Aplicando las formulas anteriores, tenemos que el sistema de ecuaciones a resolver es

    
7.00 28.00 a0 24.00
=
28.00 140.00 a1 119.50

La solución es a = [0.07142, 0.8392] y en la figura 6.20 se muestra el ajuste encontrado

Para ejecutar dar

AjustePolinomial([1,2,3,4,5,6,7]’, [0.5, 2.5, 2, 4, 3.5, 6, 5.5]’,1)


6.1. REGRESIÓN LINEAL POR EL MÉTODO DE MÍNIMOS CUADRADOS 151

y
6

x
1 2 3 4 5 6 7

Figura 6.20: Un conjunto de puntos y la linea recta ajustada

6.1.3. Regresión polinomial

Podemos generalizar el caso de la regresión lineal y extenderla a cualquier polinomio de


orden m, hacemos la siguiente representación.
 
 2 3 m
 a0  
1 x1 x1 x1 · · · x1 y0
 1 x2 x2 x3 · · · xm  
 a1 
2 2 2 
  y1 

 1 x3 x2 x3 · · · xm   a2   
3 3 3  =
  y2 

 .. .. .. .. .. ..   a3   ..


 . . . . . .  ..   . 
 . 
1 xn xn xn · · · xm
2 3
n yn
am

La cual podemos escribir de manera compacta como

Ma = y

Si pre-multiplicamos ambos lados de la ecuación tenemos

[M T M ]a = M T y (6.14)

El sistema se resuelve para a o simplemente se calcula haciendo

a = [M T M ]−1 [M T y]
152 AJUSTE DE CURVAS

6.1.4. Ejemplo 2

Ajustar a un polinomio de segundo orden los datos en la siguiente tabla.


x y
0.00 2.10
1.00 7.70
2.00 13.60
3.00 27.20
4.00 40.90
5.00 61.10
En este caso por ser un polinomio de segundo grado tenemos una matriz M dada por
 
1 0 0

 1 1 1 

 1 2 4 
M = 

 1 3 9 

 1 4 16 
1 5 25

El sistema de ecuaciones que debemos resolver es:

    
6.00 15.00 55.00 a0 152.60
 15.00 55.00 225.00   a1  =  585.60 
55.00 225.00 979.00 a2 2488.80

La solución del sistema es a = [2.4785, 2.3592, 1.8607] y el ajuste da como resultado el


polinomio p(x) = 2.4785+2.3592x+1.8607x2. En la figura 6.21 se muestra la aproximación
a un polinomio de segundo orden.
Para correr en Matlab hacer
AjustePolinomial([0,1,2,3,4,5]’, [2.1, 7.70, 13.60, 27.20, 40.90, 61.10]’,2)

6.2. Interpolación lineal

El modo más simple de interpolación es conectar dos puntos con una lı́nea recta. Esta técni-
ca, llamada interpolación lineal, la podemos representar por la siguiente formulación, la cual
se calcula considerando que se tienen dos puntos P1 = [x1 , f (x1 )]T y P0 = [x0 , f (x0 )]T
6.2. INTERPOLACIÓN LINEAL 153

60

50

40

30

20

x
1 2 3 4 5

Figura 6.21: Un conjunto de puntos y su aproximación cuadrática

f (x) − f (x0 ) f (x1 ) − f (x0 ))


=
x − x0 x1 − x0

La cual da lugar a la siguiente ecuación

f (x1 ) − f (x0 )
f (x) = f (x0 ) + (x − x0 )
x1 − x0

La implementación para una función de interpolación lineal para un conjunto de puntos


es:

function y = Interpolacion_Lineal(x0, x, y)

N =length(x);

for k=1:N-1
if x0 >= x(k) && x0 <= x(k+1) break;
end
end

y = y(k) + (y(k+1) - y(k))/(x(k+1)-x(k))*(x0-x(k));

end
154 AJUSTE DE CURVAS

6.2.1. Ejemplo 1

Dados los puntos

x y
0.00 2.10
1.00 7.70
2.00 13.60
3.00 27.20
4.00 40.90
5.00 61.10

Implementar el código correspondiente para graficar los puntos intermedios a los valores
dados utilizando interpolación lineal

x = [0,1,2,3,4,5];
y = [2.1, 7.70, 13.60, 27.20, 40.90, 61.10];

x_nva = 0:0.01:5;

N = length(x_nva);
y_nva = zeros(N, 1);

for k=1:N
y_nva(k) = Interpolacion_Lineal(x_nva(k), x, y);
end;

plot(x_nva, y_nva, ’r-.’, x, y, ’k*’);


xlabel(’x’);
ylabel(’f(x)’);

En la figura 6.22, se muestran los puntos correspondientes calculados de acuerdo con el


código implementado

6.3. Interpolación cuadrática

El error que se observa en la figura 6.22, se debe a que suponemos que los puntos se unen por
lineas. Una manera resolver este problema es suponer una función polinomial cuadrática
tomando al menos tres puntos para tal propósito. Una forma de introducir tres puntos en
una función cuadrática es mediante la siguiente ecuación
6.3. INTERPOLACIÓN CUADRÁTICA 155

70

60

50

40
f(x)

30

20

10

0
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
x

Figura 6.22: Un conjunto de puntos y su interpolación lineal

q(x) = b0 + b1 (x − x0 ) + b2 (x − x0 )(x − x1 )

Para calcular los valores b0 , b1 y b2 necesitamos introducir información de tres puntos


[x0 , f (x0 )], [x1 , f (x1 )] y [x2 , f (x2 )]. Si sustituimos en primer x0 tenemos que

f (x0 ) = b0 + b1 (x0 − x0 ) + b2 (x0 − x0 )(x − x1 )

por lo tanto
b0 = f (x0 )

Para calcular b1 utilizamos el segundo punto ası́ tenemos

f (x1 ) = b0 + b1 (x1 − x0 ) + b2 (x1 − x0 )(x1 − x1 )

despejando tenemos

f (x1 ) − f (x0 )
b1 =
x1 − x0
156 AJUSTE DE CURVAS

Para el calculo de b2 sustituimos los valores de b0 , b1 y [x2 , f (x2 )] de la siguiente mane-


ra

f (x1 ) − f (x0 )
f (x2 ) = f (x0 ) + (x2 − x0 ) + b2 (x2 − x0 )(x2 − x1 )
x1 − x0

despejando a b2

f (x1 )−f (x0 )


f (x2 ) − f (x0 ) − x1 −x0 (x2 − x0 )
b2 =
(x2 − x0 )(x2 − x1 )

f (x1 )−f (x0 )


f (x2 ) − f (x1 ) + f (x1 ) − f (x0 ) − x1 −x0 (x2 − x0 )
b2 =
(x2 − x0 )(x2 − x1 )

 
x2 −x0
f (x2 ) − f (x1 ) + (f (x1 ) − f (x0 )) 1 − x1 −x0
b2 =
(x2 − x0 )(x2 − x1 )

 
x2 −x1
f (x2 ) − f (x1 ) − (f (x1 ) − f (x0 )) x1 −x0
b2 =
(x2 − x0 )(x2 − x1 )

finalmente obtenemos

f (x2 )−f (x1 ) f (x1 )−f (x0 )


x2 −x1 − x1 −x0
b2 =
x2 − x0

En general podemos extender el método para N puntos haciendo


6.3. INTERPOLACIÓN CUADRÁTICA 157

(k) (k) (k)


k x f (x) b0 b1 b2

f (x2 )−f (x1 ) f (x )−f (x )


f (x1 )−f (x0 ) x2 −x1
− x1 −x 0
0 x0 f (x0 ) f (x0 ) x1 −x0 x2 −x0
1 0

f (x3 )−f (x2 ) f (x )−f (x )


f (x2 )−f (x1 ) x3 −x2
− x2 −x 1
1 x1 f (x1 ) f (x1 ) x2 −x1 x3 −x1
2 1

f (x4 )−f (x3 ) f (x )−f (x )


f (x3 )−f (x2 ) x4 −x3
− x3 −x 2
2 x2 f (x2 ) f (x2 ) x3 −x2 x4 −x2
3 2

f (x4 )−f (x3 )


3 x3 f (x3 ) f (x3 ) x4 −x3

4 x4 f (x4 ) f (x4 )

La función quadratica correspondiente al k-esimo intervalo queda representada por

(k) (k) (k)


q (k) (x) = b0 + b1 (x − x0 ) + b2 (x − x1 )(x − x2 )

6.3.1. Ejemplo 1

Calcular el logaritmo de x = 2 dados tres puntos


x0 = 1 f (x0 ) = 0
x1 = 4 f (x1 ) = 1.386294
x2 = 6 f (x2 ) = 1.791759
Para resolver tenemos

b0 = 0
158 AJUSTE DE CURVAS

f (x1 ) − f (x0 ) 1.386294 − 0


b1 = = = 0.4620981
x1 − x0 4−1

El coeficiente b2 tenemos

f (x2 )−f (x1 ) f (x1 )−f (x0 )


x2 −x1 − x1 −x0
b2 =
x2 − x0

1.791759−1.386294
6−4 − 0.4620981
b2 = = −0.0518731
6−1

En Forma Tabular

(k) (k) (k)


k x f (x) b0 b1 b2
0 1 0.000000 0.000000 0.4620980 −0.0518731
1 4 1.386294 1.386294 0.2027325
2 6 1.791759 1.791759

Finalmente para calcular el valor hacemos

q(x) = b0 + b1 (x − x0 ) + b2 (x − x0 )(x − x1 )

q(x) = 0 + 0.4620981(x − 1) − 0.0518731(x − 1)(x − 4)

q(2) = 0 + 0.4620981(2 − 1) − 0.0518731(2 − 1)(2 − 4) = 0.5658444

En Matlab dar

Interpolacion_Newton(2, [1, 4, 6] , [0, 1.386294, 1.791759])

ans =

0.5658
6.3. INTERPOLACIÓN CUADRÁTICA 159

6.3.2. Ejemplo 2

Dados los puntos


x y
0.00 2.10
1.00 7.70
2.00 13.60
3.00 27.20
4.00 40.90
5.00 61.10
En Forma Tabular los coeficientes para interpolar son:

(k) (k) (k)


k x f (x) b0 b1 b2
0 0.00 2.1000 2.1000 5.6000 0.1500
1 1.00 7.7000 7.7000 5.9000 3.8500
2 2.00 13.6000 13.6000 13.6000 0.0500
3 3.00 27.2000 27.2000 13.7000 3.2500
4 4.00 40.9000 40.9000 20.2000
5 5.00 61.1000 61.1000

Las funciones cuadráticas para cada intervalo quedan:

q (0) (x) = 2.1000 + 5.6000(x − 0) + 0.1500(x − 0)(x − 1)


q (1) (x) = 7.7000 + 5.9000(x − 1) + 3.8500(x − 1)(x − 2)
q (2) (x) = 13.6000 + 13.6000(x − 2) + 0.0500(x − 2)(x − 3)
q (3) (x) = 27.2000 + 13.7000(x − 3) + 3.2500(x − 3)(x − 4)

Hacer una interpolación cuadrática de los datos y comparar con la interpolación lineal
x = [0,1,2,3,4,5];
y = [2.1, 7.70, 13.60, 27.20, 40.90, 61.10];

x_nva = 0:0.01:5;

grado = 2;

N = length(x_nva);
160 AJUSTE DE CURVAS

M = length(x);
y_nva = zeros(N, 1);

for n=1:N
for m=1:M-1
if x_nva(n) >= x(m) && x_nva(n) <= x(m+1) break;
end;
end;
l = m+grado;
if l > M
l = M;
end;

y_nva(n) = Interpolacion_Newton(x_nva(n), x(m:l), y(m:l));


end;

plot(x_nva, y_nva, ’r-.’, x, y, ’k*’);


xlabel(’x’);
ylabel(’f(x)’);

En la figura 6.23, se muestran los puntos correspondientes calculados de acuerdo con el


código implementado

6.4. Formulas de interpolación de Newton

Las formulaciones anteriores pueden ser generalizadas para ajustar un polinomio de n-ésimo
orden a n + 1 datos. El polinomio de n-ésimo orden es

fn (x) = b0 + b1 (x − x0 ) + b2 (x − x0)(x − x1 ) + · · · + bn (x − x0 )(x − x1 ) · · · (x − xn−1 ) (6.15)

Como se hizo antes con las interpolaciones lineales y cuadráticas, los puntos de los datos
evaluaban los coeficientes b0 , b1 , · · · , bn . Para un polinomio de n-ésimo orden se requiere
n + 1 puntos: [x0 , f (x0 )], [x1 , f (x1 )], ..., [xn , f (xn )]. Usamos estos datos y las siguientes
ecuaciones para evaluar los coeficientes
6.4. FORMULAS DE INTERPOLACIÓN DE NEWTON 161

70

60

50

40
f(x)

30

20

10

0
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
x

Figura 6.23: Un conjunto de puntos y su interpolación cuadrática

b0 = f (x0 )
b1 = f [x1, x0 ]
b2 = f [x2 , x1 , x0 ]
..
.
bn = f [xn , xn−1 , · · · , x1 , x0 ]

donde las evaluaciones de la función puestas entre paréntesis son diferencias divididas
finitas. Por ejemplo, la primera diferencia dividida finita se representa por lo general co-
mo

f (xi ) − f (xj )
f [xi , xj ] =
xi − xj

La segunda diferencia dividida finita, la cual representa la diferencia de las dos primeras
diferencias divididas, se expresa por lo general como

f [xi , xj ] − f [xj , xk ]
f [xi , xj , xk ] =
xi − xk
162 AJUSTE DE CURVAS

En forma similar, la n-ésima diferencia dividida finja es

f [xn , xn−1 , · · · , x1 ] − f [xn−1 , xn−2 , · · · , x1 , x0 ]


f [xn , xn−1 , · · · , x1 , x0 ] =
xn − x0

Estas diferencias pueden usarse para evaluar los coeficientes en la ecuación 6.15, las cuales
entonces se sustituirán en la siguiente ecuación, para ası́ obtener el polinomio de interpo-
lación

fn (x) = f (x0 ) + f [x1 , x0 ](x − x0 ) + f [x2 , x1 , x0 ](x − x0)(x − x1 ) +


· · · +f [xn , xn−1 , · · · , x1 , x0 ](x − x0 )(x − x1 ) · · · (x − xn−1 )

En la siguiente tabla se muestra el procedimiento para el calculo de las diferencias finitas


divididas.
i xi f (xi ) Primero Segundo Tercero
b0 b1 b2 b3
0 x0 f (x0 ) f [x1 , x0 ] f [x2 , x1 , x0 ] f [x3 , x2 , x1 , x0 ]
1 x1 f (x1 ) f [x2 , x1 ] f [x3 , x2 , x1 ]
2 x2 f (x2 ) f [x3 , x2 ]
3 x3 f (x3 )
La implementación de este algoritmo en Matlab es:
function yint = Interpolacion_Newton(xi, x, y)
N = length(x);

f = zeros(N, N);

for n=1:N
f(n, 1) = y(n);
end;

for m = 2:N
for n = 1:N+1-m
f(n,m)=(f(n+1,m-1)-f(n, m-1))/(x(n+m-1) - x(n));
end;
end;

yint = f(1,1);
6.4. FORMULAS DE INTERPOLACIÓN DE NEWTON 163

dx = 1;

for n=2:N
dx = dx*(xi-x(n-1));
yint = yint + f(1,n)*dx;
end;

end

6.4.1. Ejemplo 1

Calcular el logaritmo de 2 utilizando la interpolación de Newton y los valores [1, 0], [4, 1.386294],
[6, 1.791759] y [5, 1.609438]
La solución la llevaremos a cabo de forma tabular
i xi f (xi ) Primero Segundo Tercero
b0 b1 b2 b3
0 1 0.0000 0.4621 -0.0519 0.0079
1 4 1.3863 0.2027 -0.0204
2 6 1.7918 0.1823
3 5 1.6094
Para 4 puntos el polinomio de Newton de tercer orden es

f3 (x) = 0 + 0.462098(x − 1) − 0.05187311(x − 1)(x − 4) + 0.00786529(x − 1)(x − 4)(x − 6)

y el valor del logaritmo es f3 (2) = 0.6287686

6.4.2. Ejemplo 2

Dados los puntos


x y
0.00 2.10
1.00 7.70
2.00 13.60
3.00 27.20
4.00 40.90
5.00 61.10
164 AJUSTE DE CURVAS

Hacer una interpolación utilizando polinomios de Newton de quinto grado de los datos y
comparar con la interpolación lineal y cuadrática

x = [0,1,2,3,4,5];
y = [2.1, 7.70, 13.60, 27.20, 40.90, 61.10];

x_nva = 0:0.01:5;

grado = 5;

N = length(x_nva);
M = length(x);
y_nva = zeros(N, 1);

for n=1:N
for m=1:M-1
if x_nva(n) >= x(m) && x_nva(n) <= x(m+1) break;
end;
end;
l = m+grado;
if l > M
l = M;
end;

y_nva(n) = Interpolacion_Newton(x_nva(n), x(m:l), y(m:l));


end;

plot(x_nva, y_nva, ’r-.’, x, y, ’k*’);


xlabel(’x’);
ylabel(’f(x)’);

En la figura 6.24, se muestran los puntos correspondientes calculados de acuerdo con el


código implementado

6.5. Interpolación de Polinomios de Lagrange

La interpolación de polinomios de Lagrange es simplemente una reformulación del polino-


mio de Newton que evita el cálculo por diferencias divididas. Se puede expresar de manera
concisa como
6.5. INTERPOLACIÓN DE POLINOMIOS DE LAGRANGE 165

70

60

50

40
f(x)

30

20

10

0
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
x

Figura 6.24: Un conjunto de puntos y su interpolación con Polinomios de Newton de Quinto


grado

n
X
fn (x) = Li (x)f (xi )
i=0

donde

n
Y x − xj
Li (x) =
xi − xj
j=0
j 6= i

Por ejemplo la versión lineal n = 1 es

x − x1 x − x0
f1 (x) = f (x0 ) + f (x1 )
x0 − x1 x1 − x0

y la versión de segundo orden es

(x − x1 )(x − x2 ) (x − x0 )(x − x2 ) (x − x0 )(x − x1 )


f2 (x) = f (x0 ) + f (x1 ) + f (x2 )
(x0 − x1 )(x0 − x2 ) (x1 − x0 )(x1 − x2 ) (x2 − x0 )(x2 − x1 )
166 AJUSTE DE CURVAS

El código en Matlab para este algoritmo es


function yint = Interpolacion_Lagrange(xint, x, y)

suma = 0;
N = length(x);
for n=1:N
producto = y(n);
for m = 1:N
if n~=m
producto = producto*(xint -x(m))/(x(n) - x(m));
end;
end;
suma = suma + producto;
end;
yint = suma;
end

6.5.1. Ejemplo 1

Use una interpolación del polinomio de Lagrange de primer y segundo orden para evaluar
ln(2) con base en los siguientes datos [1, 0], [4, 1.386294] y [6, 1.791759]
La solución lineal n = 1 es

x−4 x−1
f1 (x) = 0+ 1.386294 = −0.462098 + 0.462098x
1−4 4−1

2−4 2−1
f1 (2) = 0+ 1.386294 = 0.4620981
1−4 4−1

y la solución de segundo n = 2 orden es

(x − 4)(x − 6) (x − 1)(x − 6) (x − 1)(x − 4)


f2 (x) = 0+ 1.386294 + 1.791760
(1 − 4)(1 − 6) (4 − 1)(4 − 6) (6 − 1)(6 − 4)

La ecuación resultante de segundo grado es

f2 (x) = −0.66959 + 0.721463x − 0.0518731x2


6.5. INTERPOLACIÓN DE POLINOMIOS DE LAGRANGE 167

Para calcular el valor de ln(2) resolvemos

(2 − 4)(2 − 6) (2 − 1)(2 − 6) (2 − 1)(2 − 4)


f2 (2) = 0+ 1.386294 + 1.791760 = 0.5658444
(1 − 4)(1 − 6) (4 − 1)(4 − 6) (6 − 1)(6 − 4)

Como era de esperar, ambos resultados concuerdan con los que se obtuvieron utilizando
interpolación utilizando polinomios de Newton.

6.5.2. Ejemplo 2

Dados los valores en la siguiente tabla calcular:


x f (x)
1 0.0000
2 0.6931
3 1.0986
4 1.3863
El polinomio de Lagrange de cúbico en el intervalo 1 < x < 2
El valor de interpolación en x = 1.4
Para calcular el Polinomio de Lagrange hacemos
(x − 2)(x − 3)(x − 4) (x − 1)(x − 3)(x − 4)
f3 (x) = 0.0000 + 0.6931 +
(1 − 2)(1 − 3)(1 − 4) (2 − 1)(2 − 3)(2 − 4)
(x − 1)(x − 2)(x − 4) (x − 1)(x − 2)(x − 3)
1.0986 + 1.3863
(3 − 1)(3 − 2)(3 − 4) (4 − 1)(4 − 2)(4 − 3)

Simplificando la expresión tenemos

f3 (x) = −1.1505 + 1.4358x − 0.3136x2 + 0.0283x3

Para calcular el valor interpolado hacemos

(1.4 − 2)(1.4 − 3)(1.4 − 4) (1.4 − 1)(1.4 − 3)(1.4 − 4)


f3 (1.4) = 0.0000 + 0.6931 +
(1 − 2)(1 − 3)(1 − 4) (2 − 1)(2 − 3)(2 − 4)
(1.4 − 1)(1.4 − 2)(1.4 − 4) (1.4 − 1)(1.4 − 2)(1.4 − 3)
1.0986 + 1.3863
(3 − 1)(3 − 2)(3 − 4) (4 − 1)(4 − 2)(4 − 3)

obviamente que la otra alternativa para evaluar es:


168 AJUSTE DE CURVAS

f3 (1.4) = −1.1505 + 1.4358(1.4) − 0.3136(1.4)2 + 0.0283(1.4)3

El resultado de la interpolación es:

f3 (1.4) = 0.322619
Diferenciación e Integración

7.1. Diferenciación por diferencias divididas finitas atrás,


adelante y centrales de exactitud simple

Considerando la definición de la derivada

df (x) f (x) − f (x − h)
= lı́m
dx h→0 h

entonces para valores pequeños de h podemos hacer una aproximación de la derivada


haciendo

df (x) f (x) − f (x − h)

dx h

En el caso de considerar la diferencia hacia adelante podemos hacer

df (x) f (x + h) − f (x)

dx h

Considerando que los incrementos se dan hacia adelante y hacia atrás, podemos dar una
representación de la derivada centrada como

df (x) f (x + h) − f (x − h)

dx 2h

169
170 DIFERENCIACIÓN E INTEGRACIÓN

7.2. Diferenciación por diferencias divididas finitas atrás,


adelante y centrales de exactitud mejorada

7.3. Integración por el método de barras

En general todos los métodos de integración numérica hacen uso de la interpretación de la


integral propia, esta interpretación nos dice que la integral en un intervalo a y b es el área
bajo la curva. Ası́ podemos hacer este cálculo del área suponiendo que nuestros rectángulos
son de altura f (a). Recordemos que el área de un rectángulo esta dado como

A = (b − a)f (a)

por lo que la integral la podemos aproximar por

Z b Z b
I= f (x)dx ≈ f (a)dx = f (a)x|ba = f (a) ∗ (b − a)
a a

7.3.1. Ejemplo

Para la función f (x) = 0.2 + 25x − 200x2 + 675x3 − 900x4 + 400x5 , calcular la integral
utilizando el método de barras en el intervalo a = 0 b = 0.8 .

I ≈ f (0) ∗ (0.8 − 0) = 0.2 × 0.8 = 0.16

En Matlab
>> Barras(@f1, 0, 0.8, 1)

ans =

0.1600
Para una mejor aproximación podemos hacer N divisiones de la región de tamaño h y
aproximar la integral como:

Z b N
X −1
f (x)dx ≈ f (a + kh) ∗ h
a k=0
7.4. INTEGRACIÓN POR EL MÉTODO DE TRAPEZOIDES 171

Esta aproximación da lugar al método de barras cuya codificación en Matlab se presenta


a continuación
function I = Barras(f, a, b, N)

h = abs(b-a)/N;

suma = 0;
for k=0:N-1
suma = suma + f(a+h*k);
end;

I = suma*h;

end

7.4. Integración por el método de trapezoides

Suponer que todos los rectángulos son de altura constante es una suposición fuerte. En
lugar de ello supondremos, para este método, que los rectángulos varı́an linealmente de
acuerdo con la siguiente ecuación

(x − a)
f (x) = f (a) + (f (b) − f (a))
b−a

A partir de esto podemos hacer la aproximación de nuestra integral


b Z b 
(x − a)
Z
I= f (x)dx ≈ f (a) + (f (b) − f (a)) dx
a a b−a

resolviendo la integral tenemos


 b
(x − a)2


I≈ f (a)x + (f (b) − f (a))
2(b − a) a

f (b) + f (a)
I≈ (b − a)
2

La cual es el área de un trapecio de altura menor f (a) y altura mayor f (b).


172 DIFERENCIACIÓN E INTEGRACIÓN

7.4.1. Ejemplo

Para la función f (x) = 0.2 + 25x − 200x2 + 675x3 − 900x4 + 400x5 , calcular la integral
utilizando el método de la Regla Trapezoidal en el intervalo a = 0 b = 0.8 .

f (b) + f (a) (0.2320 + 0.2)(0.8 − 0)


I≈ (b − a) = = 0.1728
2 2

En Matlab la solución es

>> Regla_Trapezoidal(@f1, 0, 0.8, 1)

ans =

0.1728

Si aplicamos la formula para N divisiones de tamaño h tenemos que la regla trapezoidal


la podemos calcular como

PN −1
f (a) + 2 k=1 f (a + kh) + f (b)
I ≈ (b − a)
2N

La implementación en Matlab para la regla trapezoidal

function I = Regla_Trapezoidal(f, a, b, N)

h = abs(b-a)/N;

suma = f(a);

for k=1:N-1
suma = suma + 2*f(a+h*k);
end;
suma = suma + f(b);

I = (b-a)*suma/(2*N);

end
7.5. INTEGRACIÓN POR EL MÉTODO DE REGLA SIMPSON 1/3 173

7.5. Integración por el método de regla Simpson 1/3

En general cuando se utiliza una función de interpolación de mayor grado la diferencia entre
los valores estimados y los reales se vuelve pequeña. Para este método en lugar se suponer
que la función se aproxima por lineas haremos la aproximación utilizando un polinomio
de segundo orden. Pare este método utilizaremos los polinomios de Lagrange de segundo
orden dado por

(x − x1 )(x − x2 ) (x − x0 )(x − x2 ) (x − x0 )(x − x1 )


f (x) = f (x0 ) + f (x1 ) + f (x2 )
(x0 − x1 )(x0 − x2 ) (x1 − x0 )(x1 − x2 ) (x2 − x0 )(x2 − x1 )

Aplicando la integración de la función de interpolación tenemos:

Z b
f (x0 ) + 4f (x1 ) + f (x2 )
I≈ f (x)dx = (b − a)
a 6

7.5.1. Ejemplo

Para la función f (x) = 0.2 + 25x − 200x2 + 675x3 − 900x4 + 400x5 , calcular la integral
utilizando el método Simpson 1/3 en el intervalo a = 0 b = 0.8 .

f (x0 ) + 4f (x1 ) + f (x2 ) f (0) + 4f (0.4) + f (0.8)


I ≈ (b − a) = (0.8 − 0) =
6 6
(0.2 + 4 × 2.4560 + 0.2320)
I ≈ (0.8 − 0) = 1.3675
6
En Matlab la solución es
>> Simpson13(@f1, 0, 0.8, 2)

ans =

1.3675
La implementación para N divisiones de tamaño h es:

PN −1 PN −1
f (xa ) + 4 k=1,3,5,··· f (a + k ∗ h) + 2 k=2,4,6,··· f (a + k ∗ h) + f (b)
I ≈ (b − a)
3N
y la implementación en Matlab es:
174 DIFERENCIACIÓN E INTEGRACIÓN

function I = Simpson13(f, a, b, N)

h = abs(b-a)/N;

s_par = 0;
s_impar = 0;

for k=1:N-1
if mod(k,2) == 1
s_impar = s_impar + f(a+h*k);
else
s_par = s_par + f(a+h*k);
end;
end;

I = (b-a)*(f(a) + 4*s_impar + 2*s_par + f(b))/(3*N);

end

7.6. Integración por el método de regla Simpson 3/8

Para este método utilizaremos como función de integración un polinomio de Lagrange de


tercer orden dado por

(x − x1 )(x − x2 )(x − x3 )
f (x) = f (x0 )
(x0 − x1 )(x0 − x2 )(x0 − x3 )
(x − x0 )(x − x2 )(x − x3 )
+ f (x1 )
(x1 − x0 )(x1 − x2 )(x1 − x3 )
(x − x0 )(x − x1 )(x − x3 )
+ f (x2 )
(x2 − x0 )(x2 − x1 )(x2 − x3 )
(x − x0 )(x − x1 )(x − x2 )
+ f (x3 )
(x3 − x0 )(x3 − x1 )(x3 − x2 )

Resolviendo para esta función polinomial

Z b
f (x0 ) + 3f (x1 ) + 3f (x2 ) + f (x3 )
I≈ f (x)dx = (b − a)
a 8
7.6. INTEGRACIÓN POR EL MÉTODO DE REGLA SIMPSON 3/8 175

7.6.1. Ejemplo

Para la función f (x) = 0.2 + 25x − 200x2 + 675x3 − 900x4 + 400x5 , calcular la integral
utilizando la regla Simpson 3/8 en el intervalo a = 0 b = 0.8 .

f (0) + 3f (0.2667) + 3f (0.5333) + f (0.8)


I ≈ (0.8 − 0) =
8

(0.2 + 3 × 1.4327 + 3 × 3.4872 + 0.2320)


I ≈ (0.8 − 0) = 1.5192
8

En Matlab la solución es

>> Simpson38(@f1, 0, 0.8, 1)

ans =

1.5192

La implementación en Matlab de la regla de Simpson 3/8 para N intervalos es

function I = Simpson38(f, a, b, N)
h = abs(b-a)/N;

suma =0;

for k=0:N-1
x0 = a + h*k;
x1 = x0 + h/3;
x2 = x0 + 2*h/3;
x3 = x0 + h;
suma = suma + f(x0) + 3*f(x1) + 3*f(x2) + f(x3);
end;

I = h*suma/8;
end
176 DIFERENCIACIÓN E INTEGRACIÓN

7.7. Ejemplos

7.7.1. Ejemplo 1

Dada la función

f (x) = 0.2 + 25x − 200x2 + 675x3 − 900x4 + 400x5

Hacer la solución de las integral en el intervalo a = 0 b = 0.8 con N = 1 aplicando los


métodos vistos y comparar con la solución real dada por la ecuación.
Comenzamos por calcular la integral de f (x)

Z b
25 2 200 3 675 4 900 5 400 6
I(x) = f (x)dx = 0.2x + x − x + x − x + x
a 2 3 4 5 6

La solución para cada uno de los métodos es


Método Solución error
Barras 01600 1.4805
R Trapezoidal 0.1728 1.4677
Simpson 1/3 1.3675 0.2731
Simpson 3/8 1.5192 0.1214
Note que el mejor desempeño lo tiene el método de Simpson 3/8 en virtud de utilizar
polinomios de grado 3 para llevar a cabo la integración.

7.7.2. Ejemplo 2

Repetir el ejemplo anterior para N = 100.


Método Solución error
Barras 1.6401 0.0004
R Trapezoidal 1.6403 0.0003
Simpson 1/3 1.6405 0.0000
Simpson 3/8 1.6405 0.0000
Note que a medida que se utilizan mas intervalos la solución en mucho mejor acercando a
la solución real.
Ecuaciones diferenciales ordinarias

En este capı́tulo se lleva a cabo la solución de ecuaciones diferenciales de la forma

dy
= f (x, y)
dx

En general los métodos que veremos hacen una formulación lineal de la forma

y (k+1) = y (k) + φh

donde φ es una estimación de la pendiente de la lı́nea recta y utilizaremos esta linea para
hacer una predicción de los valores de la integral.

8.1. Integración por el método de Euler

La primera derivada proporciona una estimación directa de la pendiente en x(k) dada


por

φ = f (x(k) , y (k) )

donde f (x(k) , y (k) ) es la ecuación diferencial evaluada en x(k) y y (k) . Utilizando esta esti-
mación tenemos

y (k+1) = y (k) + f (x(k) , y (k) )h

La ecuación anterior es conocida como el método de Euler (o de Euler-Cauchy o de punto


medio). Su implementación en Matlab es:

177
178 ECUACIONES DIFERENCIALES ORDINARIAS

function [x,y] = Euler(x0, y0, h, N, f)


D = length(y0);

x = zeros(N+1, 1);
y = zeros(N+1, D);

x(1) = x0;
y(1,:) = y0;

for k = 1:N
y(k+1,:) = y(k,:) + f(x(k), y(k,:))*h;
x(k+1) = x(k) + h;
end;
end
donde x ini el el vector de valores iniciales, h es el incremento, N es el conjunto de valores
donde se integra y f son el conjunto de ecuaciones diferenciales.

8.2. Integración por el método de Heun con solo uno y con


varios predictores

Un método para mejorar la estimación de la pendiente involucra la determinación de dos


derivadas para cada uno de los intervalos (una en el punto inicial y otra en el punto final).
Las dos derivadas se promedian con el fin de obtener una estimación mejorada de las
pendientes para todo el intervalo.
Recordemos que el método de Euler, la pendiente al inicio de un intervalo es

y 0(k) = f (x(k) , y (k) )


y se usa para extraporlar linealmente a y (k+1)

yp(k+1) = y (k) + f (x(k) , y (k) )h

La pendiente en el punto final del intervalo la podemos calcular como:

y 0(k+1) = f (x(k+1) , yp(k+1) )

y la pendiente promedio la podemos calcular como


8.3. INTEGRACIÓN POR EL MÉTODO DEL PUNTO MEDIO 179

y 0(k+1) + y 0(k)
ȳ 0 =
2

De lo anterior podemos decir que el método tiene dos pasos, uno de predicción que es una
iteración de Euler y un Corrector donde se utiliza la estimación de la pendiente al final del
bloque. Estos pasos son:
Predicción
yp(k+1) = y (k) + f (x(k) , y (k) )h

Corrección
(k+1)
f (x(k) , y (k) ) + f (x(k+1) , yp )
y (k+1) = y (k) + h
2

La implementación en Matlab para el Método de Heun es:


function [x, y] = Heun(x0, y0, h, N, f)
D = length(y0);

x = zeros(N+1, 1);
y = zeros(N+1, D);

x(1) = x0;
y(1,:) = y0;

for k = 1:N
%Predictor
k1 = f(x(k), y(k,:) );
k2 = f(x(k)+h, y(k,:) + k1*h);
%corrector
%disp([k1, k2, y + k1]);
x(k+1) = x(k) + h;
y(k+1,:) = y(k,:) + (k1 + k2 )*h/2.0;
end;
end

8.3. Integración por el método del punto medio

Esta técnica usa el método de Euler para predecir un valor de y en el punto medio del
intervalo
180 ECUACIONES DIFERENCIALES ORDINARIAS

y (k+1/2) = y (k) + f (x(k) , y (k) )h/2

Después este valor es utilizado para calcular la pendiente en el punto medio y hacer la
solución en todo el intervalo como

y (k+1) = y (k) + f (x(k+1/2) , y (k+1/2) )h

La implementación en Matlab es

function [x,y] = Punto_Medio(x0, y0, h, N, f)


D = length(y0);

x = zeros(N+1, 1);
y = zeros(N+1, D);

x(1) = x0;
y(1,:) = y0;

for k = 1:N

xm = x(k) + h/2;
ym = y(k,:) + f(x(k), y(k,:))*h/2;

x(k+1) = x(k) + h;
y(k+1,:) = y(k,:) + f(xm, ym)*h;
end;
end

8.4. Fórmulas de integración por algunos métodos de Runge-


Kutta de segundo orden

Los algoritmos de Runge-Kutta son los métodos de integración con mejor desempeño y
exactitud. En el caso del método de Runge-Kutta tenemos calcular dos valores k1 y k2
utilizando

k1 = f (x(k) , y (k) )
8.5. RUNGE-KUTTA 3ER ORDEN 181

3 3
k2 = f (x(k) + h, y (k) + k1 h)
4 4

La actualización se lleva a cabo haciendo

 
(k+1) (k) 1 2
y =y + k1 + k2 h
3 3
function [x,y] = RK(x0, y0, h, N, f)
D = length(y0);

x = zeros(N+1, 1);
y = zeros(N+1, D);

x(1) = x0;
y(1,:) = y0;

for k = 1:N
k1 = f(x(k), y(k,:));
k2 = f(x(k) + 3*h/4, y(k,:)+3*h*k1/4);

x(k+1) = x(k) + h;
y(k+1,:) = y(k,:) + (k1/3 + 2*k2/3)*h;

end;
end

8.5. Fórmula de integración por el método de Runge-Kutta


clásico de tercer orden

En el caso del método de Runge-Kutta de tercer orden tenemos que calcular tres valores
k1 , k2 y k3 utilizando las siguientes formulas

k1 = f (x(k) , y (k) )

1 1
k2 = f (x(k) + h, y (k) + k1 h)
2 2
182 ECUACIONES DIFERENCIALES ORDINARIAS

k3 = f (x(k) + h, y (k) − k1 h + 2k2 h)

La actualización se lleva a cabo haciendo

1
y (k+1) = y (k) +
(k1 + 4k2 + k3 ) h
6
function [x, y] = RK3(x0, y0, h, N, f)
D = length(y0);

x = zeros(N+1, 1);
y = zeros(N+1, D);

x(1) = x0;
y(1,:) = y0;

for k = 1:N

k1 = f(x(k), y(k,:));
k2 = f(x(k) + h/2, y(k,:) + k1*h/2);
k3 = f(x(k) + h, y(k,:) - k1*h + 2*k2*h);

x(k+1) = x(k) + h;
y(k+1,:) = y(k,:) + (k1 + 4*k2 + k3)*h/6;
end;
end

8.6. Formula de integración por el método de Runge-Kutta


clásico de cuarto orden

El más popular de los métodos RK es el de cuarto orden. En el caso del método de Runge-
Kutta de cuarto orden tenemos que calcular cuatro valores k1 , k2 , k3 y k4 utilizando las
siguientes formulas

k1 = f (x(k) , y (k) )

1 1
k2 = f (x(k) + h, y (k) + k1 h)
2 2
8.7. EJEMPLO 183

1 1
k3 = f (x(k) + h, y (k) + k2 h)
2 2

k4 = f (x(k) + h, y (k) + k3 h)

La actualización se lleva a cabo haciendo

1
y (k+1) = y (k) + (k1 + 2k2 + 2k3 + k4 ) h
6

La implementación en Matlab para el método de Runge-Kutta de cuarto orden es:


function [x, y] = RK4(x0, y0, h, N, f)
D = length(y0);

x = zeros(N+1, 1);
y = zeros(N+1, D);

x(1) = x0;
y(1,:) = y0;

for k = 1:N

k1 = f(x(k), y(k,:));
k2 = f(x(k) + h/2, y(k,:) + k1*h/2);
k3 = f(x(k) + h/2, y(k,:) + k2*h/2);
k4 = f(x(k) + h, y(k,:) + k3*h);

x(k+1) = x(k) + h;
y(k+1,:) = y(k,:) + (k1 + 2*k2 + 2*k3 + k4)*h/6;
end;
end

8.7. Ejemplo

8.7.1. Una ecuación diferencial sencilla

Consideremos la ecuación diferencial


184 ECUACIONES DIFERENCIALES ORDINARIAS

f (x, y) = −2x3 + 12x2 − 20x + 8.5

La integral la podemos calcular como

Z Z
dy
dx = f (x, y)dx = −0.5x4 + 4x3 − 10x2 + 8.5x
dx

La solución para y para un valor inicial y(0) = 1 lo cual da la siguiente expresión

y(x) = −0.5x4 + 4x3 − 10x2 + 8.5x + 1

Encontrar la solución numérica para esta ecuación diferencial, suponiendo un valor inicial
x(0) = 0, y (0) = 1 y h = 0.5, utilizando los métodos analizados en este capı́tulo.

Solución

La implementación de la función en Matlab es

function dy = ecuacion(x, y)
dy = -2*x^3 + 12*x^2- 20*x + 8.5;
end

En la siguiente tabla se muestran los resultados al aplicar la integración numérica.

Real Euler Heun P. Medio RK RK3 RK4


(k) (k) (k) (k) (k) (k)
k x(k) y (k) yE yH yP M yRK yRK3 yRK4
0 0.0 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
1 0.5 3.2188 5.2500 3.4375 3.1094 3.2773 3.2188 3.2188
2 1.0 3.0000 5.8750 3.3750 2.8125 3.1016 3.0000 3.0000
3 1.5 2.2188 5.1250 2.6875 1.9844 2.3477 2.2188 2.2188
4 2.0 2.0000 4.5000 2.5000 1.7500 2.1406 2.0000 2.0000
5 2.5 2.7188 4.7500 3.1875 2.4844 2.8555 2.7188 2.7188
6 3.0 4.0000 5.8750 4.3750 3.8125 4.1172 4.0000 4.0000
7 3.5 4.7188 7.1250 4.9375 4.6094 4.8008 4.7188 4.7188
8 4.0 3.0000 7.0000 3.0000 3.0000 3.0312 3.0000 3.0000

Para evaluar la exactitud de los métodos calculamos el valor absoluto de la diferencia entre
el valor real y el calculado.
8.7. EJEMPLO 185

(k) (k) (k) (k) (k) (k)


k |y (k) − yE | |y (k) − yH | |y (k) − yP M | |y (k) − yRK | |y (k) − yRK3 | |y (k) − yRK4 |
0 0 0 0 0 0 0
1 2.0312 0.2188 0.1094 0.0586 0 0
2 2.8750 0.3750 0.1875 0.1016 0 0
3 2.9062 0.4688 0.2344 0.1289 0 0
4 2.5000 0.5000 0.2500 0.1406 0 0
5 2.0312 0.4688 0.2344 0.1367 0 0
6 1.8750 0.3750 0.1875 0.1172 0 0
7 2.4062 0.2188 0.1094 0.0820 0 0
8 4.0000 0 0 0.0312 0 0
Para reproducir estos valores utilizar el código
function ecuacion_simple()
% Numero de puntos
N = 8;

% Valores Iniciales
xini = 0;
xfin = 4;
y_ini = 1;
h = (xfin-xini)/N;
x = [xini:h:xfin]’;

[x1,y1] = Euler(xini, y_ini, h, N, @ecuacion);


[x2,y2] = Heun(xini, y_ini, h, N, @ecuacion);
[x3,y3] = Punto_Medio(xini, y_ini, h, N, @ecuacion);
[x4,y4] = RK(xini, y_ini, h, N, @ecuacion);
[x5,y5] = RK3(xini, y_ini, h, N, @ecuacion);
[x6,y6] = RK4(xini, y_ini, h, N, @ecuacion);
y2

[x, solucion_real(x), y1, y2, y3, y4, y5, y6]

[x, abs(solucion_real(x)-y1),...
abs(solucion_real(x)-y2),...
abs(solucion_real(x)-y3),...
abs(solucion_real(x)-y4),...
abs(solucion_real(x)-y5),...
186 ECUACIONES DIFERENCIALES ORDINARIAS

abs(solucion_real(x)-y6)]

function dy = ecuacion(x, y)
dy = -2*x^3 + 12*x^2- 20*x + 8.5;
end

function y = solucion_real(x)
y = -0.5*x.^4 + 4*x.^3 - 10*x.^2 + 8.5*x +1;
end
end

8.7.2. Circuito RL

Para el circuito RL que se muestra en la figura 8.25 calcular el valor de la corriente i(t) en
función del tiempo t, asumiendo que el interruptor se cierra en el tiempo t = 0

Figura 8.25: Circuito RL

Solución
La ecuación diferencial para este problema es

di V − Ri
=
dt L

La ecuación diferencial en Matlab es:


function di = Circuito_RL(t, i)
%Parametros

R = 2.0; % Ohms
8.7. EJEMPLO 187

L = 0.3; % Henries
V = 10.0; % Volts
di = (V - R *i)/L;
end
La solución real de la ecuación diferencial, en función del tiempo, es:

V  
i(t) = 1 − e(−Rt/L)
R
La solución utilizando el Método de Runge-Kutta 4 para un valor inicial t = 0, i(0) = 0 y
un incremento h = 0.2 es:
t i(t)
0.0 0
0.2 3.5391
0.4 4.5732
0.6 4.8753
0.8 4.9636
1.0 4.9894
En la figura 8.26 se muestra la solución gráfica de los métodos estudiados en este capı́tulo.
En negro se da la solución real de la ecuación diferencial y en amarillo la solución del
Runge-Kutta de cuarto orden que es el que mejor se desempeña para el incremento dado.
La peor solución es la calculada con el método de Euler la cual se muestra en azul en esta
figura.
El código implementado para este ejemplo es:
function Circuito_RL()

% Numero de puntos
N = 100;

% Valores Iniciales
tini = 0;
tfin = 1;
i_ini = 0;
h = (tfin-tini)/N;

[t0, i0] = Solucion_Real(tini, i_ini, h, N);


[t1, i1] = Euler(tini, i_ini, h, N, @Circuito_RL);
188 ECUACIONES DIFERENCIALES ORDINARIAS

Solucion Circuito RL
7

Corriente (Amp.)
4

0
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
tiempo (seg.)

Figura 8.26: Circuito RL

[t2, i2] = RK(tini, i_ini, h, N, @Circuito_RL);


[t3, i3] = RK3(tini, i_ini, h, N, @Circuito_RL);
[t4, i4] = RK4(tini, i_ini, h, N, @Circuito_RL);

[t5, i5] = Heun(tini, i_ini, h, N, @Circuito_RL);

plot(t0, i0, ’ko-’, t1, i1, ’b .-’, ...


t2, i2, ’r*-’, t3, i3, ’g--’, ...
t4, i4, ’y+-’, t5, i5, ’c’);

xlabel(’tiempo (seg.)’);
ylabel(’Corriente (Amp.)’);
title(’Solucion Circuito RL’);

% Solucion exacta de la ecuacion Diferencial

function [t, ic] =Solucion_Real(t0, ir, h, N)


%Parametros

R = 2.0; % Ohms
8.7. EJEMPLO 189

L = 0.3; % Henries
V = 10.0; % Volts

t = [t0:h:N*h]’;
Tau = L/R;
ic = 5 *(1 - exp(-t/Tau));
end

% Ecuación diferencial del circuito RL

function di = Circuito_RL(t, i)
%Parametros

R = 2.0; % Ohms
L = 0.3; % Henries
V = 10.0; % Volts
di = (V - R *i)/L;
end
end

8.7.3. Movimiento parabólico

El movimiento parabólico lo podemos considerar como un movimiento en dos dimensiones;


en una de las direcciones el objeto se desplaza con velocidad contante y en la otra con una
aceleración constante

Las ecuaciones diferenciales que rigen este movimiento están dadas como

d2 x
dt2
=0

d2 y
dt2
=a

Las ecuaciones diferenciales en el caso del tiro parabólico pueden representarse por un
sistema de ecuaciones con cuatro variable el desplazamiento horizontal x, el desplazamiento
vertical y, la velocidad horizontal vx y la velocidad vertical vy tal como se muestra a
continuación:
190 ECUACIONES DIFERENCIALES ORDINARIAS

dx

 dt = vx
d2 x
dt2
=0≡
dvx
=0

dt
 dy
 dt = vy
d2 x
dt2
= −g ≡
dvy
= −g

dt

La implementación en Matlab para este conjunto de ecuaciones es:


function dv = parabolico(t, v)
g = 9.8; % m/s2

dv(1) = v(2);
dv(2) = 0;
dv(3) = v(4);
dv(4) = -g;
end
Para el caso de el tiro parabólico encontrar la solución del sistema de ecuaciones diferen-
ciales, para un tiempo tf = 2.0 seg, asumiendo los siguientes inicialmente x(0) = 0 mts,
y0 = 5 mts, vx (0) = 10 m/s, vy (0) = 10 m/s y un incremento h = 0.001.
La solución en matlab es:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Datos
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

x0 = 0; % desplazamiento horizontal inicial en mts


y0 = 5; % desplazamiento vertical inicial en mts
vx0 = 10; % velocidad horizontal inical en m/seg
vy0 = 10; % velocidad vertical inicial en m/seg
t0 = 0; % tiempo inicial seg.
tf = 2; % tiempo final seg
h = 0.001; % intervalo de integración

N = floor((tf - t0)/h);
8.7. EJEMPLO 191

[t, d] = RK4(t0, [x0, vx0, y0, vy0], h, N, @parabolico);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Graficas de la solución
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

plot(d(:,1), d(:,3));
grid on
title(’Tiro Parabólico’);
xlabel(’x (mts.)’);
ylabel(’y (mts.)’);

La solución es

>> tiro_parabolico

1.9970 19.9700 10.0000 5.4288 -9.5706


1.9980 19.9800 10.0000 5.4192 -9.5804
1.9990 19.9900 10.0000 5.4096 -9.5902
2.0000 20.0000 10.0000 5.4000 -9.6000

En el caso particular de un tiro parabólico, donde un objeto es lanzado con una velo-
cidad inicial vx (0) horizontalmente y vy (0) verticalmente y esta sujeta a la acción de la
gravedad la solución de analı́tica de las ecuaciones diferenciales es el sistema mostrada a
continuación

x(t) = x(0) + vx (0)t

y(t) = y(0) + vy (0)t − 21 gt2

La solución de acuerdo con la ecuaciones de movimiento es:


192 ECUACIONES DIFERENCIALES ORDINARIAS

x(t) = x(0) + vx (0)t

x(2) = 0 + 10 ∗ 2 = 20

y(t) = y(0) + vy (0)t − 21 gt2

y(2) = 5 + 10 ∗ 2 − 12 (9.8)22 = 5.40

En la figura 8.27 se muestra la gráfica del desplazamiento x(t) vs y(t) para la solución del
tiro parabólico.

Tiro Parabólico
11

10

9
y (mts.)

5
0 5 10 15 20 25
x (mts.)

Figura 8.27: Gráfica de solución del tiro Parabólico

8.7.4. Sistema Masa Resorte

El sistema masa resorte como el que se muestra en la figura 8.28, esta constituido por una
masa M , sujeta a un resorte de constante K, el cual esta sujeto a fuerzas de amortigua-
miento C y se aplica una fuerza F . El modelo dinámico para este sistema es:
8.7. EJEMPLO 193

Figura 8.28: Sistema Masa Resorte

dx2 dx
M 2
+C + Kx = F
dt dt

Note que tenemos una ecuación diferencial de segundo orden la cual plantearemos como
un par de ecuaciones de primer orden como:

dx
=v
dt
dv F − Cv − Kx
=
dt M

La implementación de estas funciones en Matlab es:


function D = Sistema_MR(t, r)
M = 10.0; % Masa en Kg
C = 1; % Coeficiente de Amortiguamiento Dinnamica
K = 5; % Constante del Resorte
F = 0; % Fuerza Aplicada
d = r(1);
v = r(2);

D(1) = v; % derivada del desplazamiento


D(2) = (F - C*v - K*d)/M; % derivada de la velocidad
end
En la figura 8.29 se muestra la solución de la ecuaciones diferenciales utilizando el método
de Runge-Kutta de cuarto orden, para un desplazamiento inicial x(0) = 2, una velocidad
inicial v(0) = 0, de una Masa M = 10, con un coeficiente de amortiguamiento C = 1, una
194 ECUACIONES DIFERENCIALES ORDINARIAS

constante del resorte K = 5 y una fuerza externa F = 0. En la parte superior izquierda


tenemos el desplazamiento en función del tiempo a la derecha la velocidad en función del
tiempo y en la parte inferior el diagrama de fase que muestra la v(t) vs x(t).

2 1.5

Desplazamiento (m.) 1
1

Velocidad (m/s.)
0.5

0 0

−0.5
−1
−1

−2 −1.5
0 10 20 30 40 0 10 20 30 40
tiempo (seg.) tiempo (seg.)

1.5

1
Velocidad (m/s.)

0.5

−0.5

−1

−1.5
−2 −1 0 1 2
Desplazamient (m.)

Figura 8.29: Sistema Masa Resorte

La implementación de este ejemplo en Matlab es:


function Sistema_Masa_Resorte(Metodo)

% Numero de puntos
N = 1000;

% Valores Iniciales
tini = 0;
tfin = 40;
d_ini = 2;
v_ini = 0;

h = (tfin-tini)/N;

[t,x] = Metodo(tini, [d_ini, v_ini], h, N, @Sistema_MR);


8.7. EJEMPLO 195

title(’Sistema Masa Resorte’);

subplot(2,2,1)
plot(t, x(:,1));
xlabel(’tiempo (seg.)’);
ylabel(’Desplazamiento (m.)’);

subplot(2,2,2)
plot(t, x(:,2));
xlabel(’tiempo (seg.)’);
ylabel(’Velocidad (m/s.)’);

subplot(2,2,3)
plot(x(:,1), x(:,2));
xlabel(’Desplazamient (m.)’);
ylabel(’Velocidad (m/s.)’);

% Ecuación diferencial del circuito RL

function D = Sistema_MR(t, r)
M = 10.0; % Masa en Kg
C = 1; % Coeficiente de Amortiguamiento Dinnamica
K = 5; % Constante del Resorte
F = 0; % Fuerza Aplicada
d = r(1);
v = r(2);

D(1) = v; % derivada del desplazamiento


D(2) = (F - C*v - K*d)/M; % derivada de la velocidad
end
end
196 ECUACIONES DIFERENCIALES ORDINARIAS
Ecuaciones diferenciales parciales

9.1. Fórmula de integración por el método explı́cito de dife-


rencias divididas finitas

Consideremos la ecuación diferencial

dy
C1 + C2 y = C3
dx

Si hacemos la aproximación de la derivada mediante la ecuación

dy y(xk ) − y(xk − h) yk − yk−1


≈ ≡
dx h h

Aplicándolo a la ecuación diferencial original

 
yk − yk−1
C1 + C2 yk = C3
h

Agrupando términos semejantes tenemos

(C1 + C2 h)yk − C1 yk−1 = C3 h

Lo cual da lugar a una recurrencia de la siguiente forma

197
198 ECUACIONES DIFERENCIALES PARCIALES

(C1 + C2 h)y1 − C1 y0 = C3 h
(C1 + C2 h)y2 − C1 y1 = C3 h
(C1 + C2 h)y3 − C1 y2 = C3 h
(C1 + C2 h)y4 − C1 y3 = C3 h
..
.
(C1 + C2 h)yN − C1 yN −1 = C3 h

Lo cual da Lugar a un sistema de ecuaciones de la forma

    
(C1 + C2 h) 0 0 ··· 0 y1 C3 h + C1 y0

 −C1 (C1 + C2 h) 0 ··· 0 
 y2  
  C3 h 


 0 −C1 (C1 + C2 h) · · · 0 
 y3 =
  C3 h 

 .. .. .. .. ..  ..   .. 
 . . . . .  .   . 
0 0 0 −C1 (C1 + C2 h) yN C3 h

de forma compacta podemos escribir Ay = b cuya solución es y = A−1 b. La solución en


Matlab es
function [x,y] = Ecuacion_Primer_Orden(x0, y0, h, N, C)
x = [x0:h:x0+(N-1)*h]’;

A = zeros(N-1, N-1);
b = zeros(N-1, 1);
for k=1:N-1
A(k,k) = C(1) + C(2)*h;
b(k) = C(3)*h;
if k>1
A(k, k-1) = -C(1);
else
b(k) = b(k)+ C(1)*y0;
end;
end;
y = [y0; A\b];
end
9.1. FÓRMULA DE INTEGRACIÓN POR EL MÉTODO EXPLÍCITO DE DIFERENCIAS DIVIDIDAS FINITA

9.1.1. Ejemplo

Consideremos el caso del circuito RL planteado en el capı́tulo anterior, el cual tenı́a una
resistencia R = 2 ohms, una inductancia L = 0.3 H y estaba alimentado por una fuente de
voltaje de V = 10 volts dado por la ecuación diferencial

di
L + Ri = V
dt

Dado t = 0, i(0) = 0 y h = 0.01 calcular:


El sistema lineal de ecuaciones para calcular la solución con N = 4
La solución del sistema lineal de ecuaciones y
comparar con la solución con el método de Euler para las mismas condiciones del
sistema y
Solucionar para N = 1000 y graficar t vs i(t)
El sistema de ecuaciones a resolver por el método de diferencias es

    
0.3020 0 0 0 i1 0.0100
 −0.3000 0.3020 0 0   i2   0.0100 
  = 
 0 −0.3000 0.3020 0   i3   0.0100 
0 0 −0.3000 0.3020 i4 0.0100

La solución del sistema de ecuaciones es:

 
  0
i1 
 i2   0.0331 

 =
 i3   0.0660 

 0.0987 
i4
0.1311

La solución utilizando el método de Euler es:


Euler Diferencias
k t iE iD
0 0 0.0000 0.0000
1 0.0010 0.0333 0.0331
2 0.0020 0.0664 0.0660
3 0.0030 0.0993 0.0987
4 0.0040 0.1320 0.1311
200 ECUACIONES DIFERENCIALES PARCIALES

La solución para N = 100 se muestra en la figura 9.30


>> [t,ic] = Ecuacion_Primer_Orden(0, 0, 0.001, 1000, [0.3, 2, 10]);
>> plot(t, ic)

4.5

3.5

3
i(t)
2.5

1.5

0.5

0
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
t

Figura 9.30: Solución para el Circuito RL


Tareas

11.1. Tarea 1

Escribir código en Matlab que permita imprimir, utilizando un solo asterisco, condicionales
y ciclos: a) Un Triángulo

*
**
***
****
*****
******
*******

b Un cuadro

*******
* *
* *
* *
* *
* *
*******

11.2. Tarea 2

Dada la función f (x) = sen10x + cos3x hacer:

1.- Calcular la aproximación en serie de Taylor con a = 0 y mostrar la gráfica correspon-


diente comparada con los valores reales de la función en un intervalo [0, 5]

201
202 TAREAS

2.- Utilizando el método gráfico determinar los mı́nimos en el intervalo [10, 15].

11.3. Tarea 3

Dada la función f (x) = sen(10x) + cos(3x) la cual tiene un cruce por cero en el intervalo
x∗ ∈ [−3.6, −3.2], calcular el cruce por cero en esta región utilizando los métodos de Bisec-
ción, Regla Falsa, Punto Fijo y Newton Raphson. Reportar una tabla para N iteraciones
como la siguiente para cada uno de los métodos.

Biseccion R. Falsi P Fijo N Raphson


k xBk f (xBk ) xRk f (xRk ) xP k f (xP k ) xN k f (xN k )
0 xB0 f (xB0 ) xR0 f (xR0 ) xP 0 f (xP 0 ) xN 0 f (xN 0 )
1 xB1 f (xB1 ) xR1 f (xR1 ) xP 1 f (xP 1 ) xN 1 f (xN 1 )
2 xB2 f (xB2 ) xR2 f (xR2 ) xP 2 f (xP 2 ) xN 2 f (xN 2 )
.. .. .. .. .. .. .. .. ..
. . . . . . . . .
N xBN f (xBN ) xRN f (xRN ) xP N f (xP N ) xN N f (xN N )

donde N es el número máximo de iteraciones en el cual todos los métodos converge. Hacer
una gráfica con los valores de la Tabla de k vs f (xB k), f (xR k), f (xP k) y f (xN k) con la
solución de todos los métodos.

11.4. Tarea 4

Escribir el código en Matlab para realizar la división sintética de un polinomio fn (x) =


an xn + an−1 xn−1 · · · + a1 x + a0 con un monomio x + s.

11.5. Tarea 5

a) Calcular las raı́ces del polinomio x4 − 1 utilizando el método de Bairstow.


2
b) Dada la función 0.1 + (x − 3)e−(x−3) determinar, la expanción en Serie de Taylor con
N = 5 y a = 0. Para el polinomio resultante calcular las raı́ces utilizando el Método de
Bairstow.
11.6. TAREA 6 203

11.6. Tarea 6

1.- Para el sistema de ecuaciones


10 x + 2 y - z = 5
2 x + 15 y = 2
-x + 20 z = 3
Resolver a mano todas las operaciones para calcular el sistema Triangular Superior con el
método de Eliminación Gaussiana
2.- Hacer la implementación en Matlab del algoritmo de eliminación Gaussiana. Probar
con el ejemplo dado en clases.

11.7. Tarea 7

a) Calcular el mı́nimo de la función f (x) = (x − 2)4 utilizando el algoritmo de Razón


Dorada en el intervalo [1, 5] b) Calcular el mı́nimo de la función f (x1 , x2 ) = (x1 − 2)4 +
(x1 − 2)2 x22 + (x2 + 1)2 , utilizando el método de Newton.
En ambos casos hacer al menos tres iteraciones a mano y mostrar el resultado que da la
implementación en Matlab.

11.8. Tarea 8

Buscar una aplicación en Ingenierı́a de los temas revisados en los capı́tulos 1 al 5.

11.9. Tarea 9

Dado el sistema de ecuaciones

3x1 − 0.1x2 − 0.2x3 = 7.85


0.1x1 + 7x2 − 0.3x3 = −19.3
0.3x1 − 0.2x2 + 10x3 = 71.4

Calcular la solución del sistema y la inversa utilizando el algoritmos de Gauss-Jordan.


204 TAREAS

11.10. Tarea 10

Dadas la funciones a optimizar Z1 y Z2 , dadas por la siguiente expresiones,

Z1 = 6x1 + 4x2
Sujeta a
2x1 + 2x2 ≤ 160
x1 + 2x2 ≤ 120
4x1 + 2x2 ≤ 280

Z2 = 3x1 + 4x2
Sujeta a
2x1 + 3x2 ≤ 1200
2x1 + x2 ≤ 1000
4x2 ≤ 880

calcular los puntos del polı́gono de la región de factibilidad (para cada problema) y evaluar
la función de costo correspondiente en cada uno de ellos.

11.11. Tarea 11

a) Para la implementación en Matlab del algoritmo Simplex hacer una modificación que
permita hacer que esta función regrese:

[z, x, h] = Simplex[c, A, b]

donde z es el valor de la función de costo, x el valor de la variables en la solución y h el


valor de las variables de holgura.

b) Optimizar utilizando el método simplex, el siguiente problema. Todos los cálculos de-
berán ser realizados a mano y comprobar que la solución es la correcta utilizando el algo-
ritmo implementado en Matlab.
11.12. TAREA 12 205

Z = 3x1 + 2x2 + 5x3


sujeto a
x1 <= 10
x2 <= 5
x3 <= 6
x1 + x2 + x3 = 15

11.12. Tarea 12

Dados los puntos


x ln(x)
1 0.0000
2 0.6931
3 1.0986
4 1.3863
5 1.6094
6 1.7918
a) Encontrar los polinomios de mı́nimos cuadrados fk (x) de grado k = 1, 2, 3, 4, 5,
b) Realizar la interpolación utilizando interpolación de Newton de grado k = 1, 2, 3, 4, 5
y
c) Llenar la siguiente tabla, donde se hace la comparación del valor real de la función y los
valores de los polinomios de mı́nimos cuadrados y la interpolación de Newton
Grado Polinomio Polinomio Interpolación Interpolación
k fk (1.5) Error fˆk (1.5) Error
1 f1 (1.5) (0.4055 − f1 (1.5))2 fˆ1 (1.5) (0.4055 − fˆ1 (1.5))2
2 f2 (1.5) (0.4055 − f2 (1.5))2 fˆ2 (1.5) (0.4055 − fˆ2 (1.5))2
3 f3 (1.5) (0.4055 − f3 (1.5))2 fˆ3 (1.5) (0.4055 − fˆ3 (1.5))2
4 f4 (1.5) (0.4055 − f4 (1.5))2 fˆ4 (1.5) (0.4055 − fˆ4 (1.5))2
5 f5 (1.5) (0.4055 − f5 (1.5))2 fˆ5 (1.5) (0.4055 − fˆ5 (1.5))2

También podría gustarte