Métodos Numéricos

Dr. Félix Calderon Solorio 18 de octubre de 2016

Í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

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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.6.1. Cálculo de la Raiz Cuadrada . . . . . . . . . . . . . . . . . . . . . . 42
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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
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

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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.2. Métodos para sistemas no lineales . . . . . . . . . . . . . . . . . . . . . . . . 97
4.2.1. Método de iteración de punto fijo para sistemas . . . . . . . . . . . . 97
4.2.2. Método de Newton-Raphson para sistemas . . . . . . . . . . . . . . 102
4.2.3. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Optimización  113
5.1. Optimización no-restringida. Método de búsqueda de la sección dorada … 113
5.1.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
5.1.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
5.2. Optimización no-restringida. Método de Newton . . . . . . . . . . . . . . . 116
5.2.1. Método de Newton en una dimensión . . . . . . . . . . . . . . . . . 116
5.2.2. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
5.2.3. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
5.2.4. Método de Newton en N dimensiones . . . . . . . . . . . . . . . . . 119
5.2.5. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.2.6. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
5.2.7. Propiedades del Método de Newton . . . . . . . . . . . . . . . . . . 125
5.2.8. Ejemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
5.2.9. Ejemplo 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
5.2.10. Problemas de convergencia del Método de Newton . . . . . . . . . . 128
5.2.11. Ejemplo 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
5.2.12. Método de Newton Modificado . . . . . . . . . . . . . . . . . . . . . 129
5.3. Metodo Simplex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
5.3.1. Forma estándar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
5.3.2. Método Simplex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
5.3.3. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
5.3.4. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
5.3.5. Ejemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Ajuste de curvas  145
6.1. Regresión lineal por el método de mínimos cuadrados . . . . . . . . . . . . 145

6.1.1. Ajuste por mínimos cuadrados . . . . . . . . . . . . . . . . . . . . . 146
6.1.2. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
6.1.3. Regresión polinomial . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
6.1.4. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
6.2. Interpolación lineal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
6.2.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
6.3. Interpolación cuadrática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
6.3.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
6.3.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
6.4. Formulas de interpolación de Newton . . . . . . . . . . . . . . . . . . . . . . 158
6.4.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
6.4.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
6.5. Interpolación de Polinomios de Lagrange . . . . . . . . . . . . . . . . . . . . 162
6.5.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
6.5.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Diferenciación e Integración  167
7.1. Derivadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
7.2. Derivadas Mejoradas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
7.3. Integración por el método de barras . . . . . . . . . . . . . . . . . . . . . . 168
7.3.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
7.4. Integración por el método de trapezoides . . . . . . . . . . . . . . . . . . . . 169
7.4.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
7.5. Integración por el método de regla Simpson 1/3 . . . . . . . . . . . . . . . . 171
7.5.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
7.6. Integración por el método de regla Simpson 3/8 . . . . . . . . . . . . . . . 172
7.6.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
7.7. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
7.7.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
7.7.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Ecuaciones diferenciales ordinarias  175
8.1. Integración por el método de Euler . . . . . . . . . . . . . . . . . . . . . . . 175
8.2. Integración por el método de Heun con solo uno y con varios predictores . . 176
8.3. Integración por el método del punto medio . . . . . . . . . . . . . . . . . . 177
8.4. Runge-Kutta 2do orden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
8.5. Runge-Kutta 3er orden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
8.6. Runge-Kutta 4to orden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
8.7. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
8.7.1. Una ecuación diferencial sencilla . . . . . . . . . . . . . . . . . . . . 181
8.7.2. Circuito RL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

8.7.3. Movimiento parabólico . . . . . . . . . . . . . . . . . . . . . . . . . . 187
8.7.4. Sistema Masa Resorte . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Ecuaciones diferenciales parciales  195
9.1. Fórmula de integración por el método explícito de diferencias divididas finitas195
9.1.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Tareas  199
11.1. Tarea 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
11.2. Tarea 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
11.3. Tarea 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
11.4. Tarea 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
11.5. Tarea 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
11.6. Tarea 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
11.7. Tarea 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
11.8. Tarea 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
11.9. Tarea 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
11.10.Tarea 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
11.11.Tarea 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
11.12.Tarea 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

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 usuario. 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 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.^{a}nd ”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 commands in lowercase since all command and function names are actually in lowercase.

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

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

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

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

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...)
i y j  Unidad imaginaria
inf  infinito
NaN  no es número
date  fecha
flops  Contador de operaciones de punto flotante
nargin  Número de argumentos de entrada a una función
nargout  Número de argumentos de salida de una función

2. nombres de funciones.

Trigonométricas

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

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 ∥

g = 5
if g>3 | g <0, a = 6
end

y se puede hacer agrupamiento con los operadores & y ∥

clear;
a = 2
b = 3

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 ∥, pueden ser utilizados para implementar condicionales de la manera siguiente.

clear;
g = 5
if g>3 | g <0, a = 6
end
pause;

además los operadores & y ∥ 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;

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
  x
end;

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

for x=100:-0.5: 80
  x
end;

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

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.

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

% Codigo para imprimir un triangulo
fprintf('\ntriangulo\n\n')
for k=1:7
   for l=1:k
      fprintf('*')
   end;

   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

% 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

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

   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

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

   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]

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

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 =
2
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 =

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.

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

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

x_{k+1} = x_{k} − \frac{f(x_{k})}{f′(x_{k})}

La implementación en MATLAB es:

function z = cero(x0)
for k = 1: 100

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

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;

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:

f(x) = f(a)+f′(a)(x−a)+ \frac{1}{2!}f′′(a)(x−a)^{2}+ \frac{1}{3!}f′′′(a)(x−a)^{3}+⋯+ \frac{1}{n!}f^{n}(a)(x−a)^{n} (2.1)

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

f(x) = ∑_{n=0}^{N} \frac{f^{n}(a)}{n!}(x − a)^{n}

donde f^{0}(a) = f(x)|_{x=a} y f^{n}(a) = \frac{d^{n}f(x)}{dx^{n}} |_{x=a} 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:

f(x^{(i+1)}) = f(x^{(i)}) + f′(x^{(i)})h + \frac{1}{2!}f′′(x^{(i)})h^{2} + \frac{1}{3!}f′′′(x^{(i)})h^{3} + ⋯ + \frac{1}{n!}f^{n}(x^{(i)})h^{n} (2.2)

2.2.2. Ejemplo 1

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

f^{0}(x) = f(x) = e^{x}
f^{1}(x) = \frac{df(x)}{dx} = e^{x}
f^{2}(x) = \frac{d^{2}f(x)}{dx^{2}} = e^{x}
f^{3}(x) = \frac{d^{3}f(x)}{dx^{3}} = e^{x}
f^{4}(x) = \frac{d^{4}f(x)}{dx^{4}} = e^{x}

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

\begin{matrix}Orden n & f^{n}(a) & f^{n}(0) \\ 0 & e^{x} & 1 \\ 1 & e^{x} & 1 \\ 2 & e^{x} & 1 \\ 3 & e^{x} & 1 \\ ⋮ & ⋮ & ⋮ \\ N & e^{x} & 1 \end{matrix}

Sustituyendo en la ecuación (2.1) tenemos

e^{x} = f(a) + f′(a)(x − a) + \frac{1}{2!}f′′(a)(x − a)^{2} + \frac{1}{3!}f′′′(a)(x − a)^{3} + ⋯ + \frac{1}{n!}f^{n}(a)

e^{x} = 1 + 1 × (x − 0) + \frac{1}{2!} × 1 × (x − 0)^{2} + \frac{1}{3!} × 1 × (x − 0)^{3} + \frac{1}{4!} × 1 × (x − 0)^{4} + ⋯

La aproximación polinomial final, para la función e^{x} es:

e^{x} = 1 + x + \frac{x^{2}}{2!} + \frac{x^{3}}{3!} + \frac{x^{4}}{4!} + \frac{x^{5}}{5!} + \frac{x^{6}}{6!} + \frac{x^{7}}{7!} + ⋯

En forma compacta podemos representar la serie como:

e^{x} = ∑_{k=0}^{N} \frac{x^{k}}{k!}

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)
f^{1}(x) = \frac{df(x)}{dx} = −sin(x)
f^{2}(x) = \frac{d^{2}f(x)}{dx^{2}} = −cos(x)
f^{3}(x) = \frac{d^{3}f(x)}{dx^{3}} = −sin(x)
f^{4}(x) = \frac{d^{4}f(x)}{dx^{4}} = −cos(x)

Sustituyendo para x = a = 0

\begin{matrix}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 \end{matrix}

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

cos(x) = 1 − \frac{x^{2}}{2!} + \frac{x^{4}}{4!} − \frac{x^{6}}{6!} + \frac{x^{8}}{8!} − \frac{x^{10}}{10!}

En forma compacta podemos representar la serie como:

cos(x) = ∑_{k=0}^{N} \frac{(−1)^{k}x^{2k}}{(2k)!}

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.

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 aproximación en serie de Taylor utilizando (2.2) es:

f(x^{(i+1)}) = f(x^{(i)}) + f′(x^{(i)})h + \frac{1}{2!}f′′(x^{(i)})h^{2} + \frac{1}{3!}f′′′(x^{(i)})h^{3} + ⋯ + \frac{1}{n!}f^{n}(x^{(i)})h^{n}

Sustituyendo valores tenemos

f(x^{(i+1)}) = f (\frac{π}{4} )+f′ (\frac{π}{4} ) \frac{π}{12}+\frac{1}{2!}f′′ (\frac{π}{4} ) (\frac{π}{12})^{2}+\frac{1}{3!}f′′′ (\frac{π}{4} ) (\frac{π}{12})^{3}+⋯+\frac{1}{n!}f^{n} (\frac{π}{4} ) (\frac{π}{12})^{n}

La cual puede ser aproximada por la sumatoria

f(x^{(i+1)}) = ∑_{n=0}^{N} \frac{1}{n!}f^{n} (\frac{π}{4} ) (\frac{π}{12})^{n}

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) × \frac{π}{12} = 0.5219
N = 2
f(x^{(i+1)}) = 0.7071 + (−0.7071) × \frac{π}{12} + \frac{1}{2} × (−0.7071) (\frac{π}{12})^{2} = 0.4977

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

Orden n f^{n}(\frac{π}{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

sen(x) = x − \frac{x^{3}}{3!} + \frac{x^{5}}{5!} − \frac{x^{7}}{7!} + \frac{x^{9}}{9!} + ⋯

sen(x) = ∑_{k=0}^{N} \frac{(−1)^{k}x^{2k+1}}{(2k + 1)!}

La implementación en Matlab es:

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 Truncamiento

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:

v(x_{i+1}) = v(x_{i}) + v′(x_{i})(x_{i+} − x_{i}) + \frac{1}{2!}v′′(x_{i})(x_{i+} − x_{i})^{2} + ⋯ + \frac{1}{n!}v^{n}(x_{i})(x_{i+} − x_{i})^{n}

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

v(x_{i+1}) = v(x_{i}) + v′(x_{i})(x_{i+} − x_{i}) + R_{1}

Despejando el valor de v′, tenemos:

v′(x_{i}) = \frac{v(x_{i+1}) − v(x_{i})}{(x_{i+} − x_{i})} − \frac{R_{1}}{(x_{i+} − x_{i})}

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 x_{i+1}–x_{i} (incremento) se hace pequeño. Así que podemos hacer una buena aproximació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]

Figura 3.4: Método Gráfico 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, fin] a la mitad mitad = (inicio + fin)/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(fin) tienen signos opuestos, entonces, hay un cero en [mitad, fin].

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;

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)

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

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

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:

x^{2} − 2x + 3 = 0

x = \frac{x^{2} + 3}{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 x_{0}, se pueden llevar a cabo calculando x_{k+1}

x_{k+1} = g(x_{k})

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 x_{0} = 0.

De acuerdo con lo revisado la función g(x) = e^{−x} y las iteraciones hasta convergencia son:

\begin{matrix}k & x_{k} & error(x_{k}) \\ 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 \end{matrix}

Para hacer la ejecución correr:

Punto_Fijo(@g1, 0)

con

function y = g4(x)
y = exp(-x);

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) : ℝ → ℝ continua, con un valor inicial x_{0} cerca de una raíz x^{∗} y si la derivada f′(x) existe, entonces puede utilizarse esta información para desarrollar algoritmos que produzcan sucesiones x_{k} 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(x_{k+1}) = f(x_{k}) + f′(x_{k})(x_{k+1} − x_{k}) + R_{1}

Si de la ecuación anterior despejamos el valor de x_{k+1}, suponemos que f_{k+1} = 0 y despreciamos el residuo R_{1}, tenemos que la sucesión x_{0}, x_{1}, x_{2}, …, x_{k} que nos lleva a la solución, esta dada por:

x_{k+1} = x_{k} − \frac{f(x_{k})}{f′(x_{k})}

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

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 x_{0} = 0.

\begin{matrix}k & x_{k} \\ 0 & 0.0000 \\ 1 & 1.0000 \\ 2 & 0.7504 \\ 3 & 0.7391 \\ 4 & 0.7391 \\ 5 & 0.7391 \\ 6 & 0.7391 \\ 7 & 0.7391 \end{matrix}

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 x_{0} = 0, note que la línea recta cruza el eje x en x_{1} = 1. En el centro la tenemos la segunda iteración tomando como valor inicial x_{1} = 1 y solución x_{2} = 0.7504. Finalmente a la izquierda tenemos la linea recta y la solución para x_{3} = 0.7391. Note como poco a poco se acerca a la solución.

(a) x_{0} = 0  (b) x_{1} = 1  (c) x_{2} = 0.7391

Figura 3.6: Iteraciones del Método de Newton-Raphson 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. Para este caso nuestra función a resolver es f(x) = x^{2} − A. La solución cuando f(x) = 0 es x = \sqrt{A}. Para nuestro calculo hacemos

f(x) = x^{2} − A
f′(x) = 2x

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

\begin{matrix}k & x_{k} \\ 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 \end{matrix}

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 derivada y de la función tenemos:

x_{k+1} = x_{k} − \frac{f(x_{k})}{f′(x_{k})} = x_{k} − \frac{x_{k}^{2} − A}{2x_{k}}

Reduciendo términos tenemos

x_{k+1} = \frac{x_{k}^{2} + A}{2x_{k}}

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:

i_{d} = I_{s}(e^{v_{d}/V_{t}} − 1)  (3.3)

donde I_{s} = 1^{−12} y V_{t} = 25.85^{−3}

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

V (t) − Ri(t) − V_{d}(t) = 0

Figura 3.8: Comportamiento del diodo

V_{d}(t) = \{ \begin{matrix}log(I_{d}(t)/I_{s} + 1) ∗ V_{t} & Si & I_{d}(t) ≥ 0 \\ V & sino & Id(t) < 0 \end{matrix}

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

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 P_{L} en una combinación en serie. Dados los valores V = 10 volts, R = 2 ohms y P_{L} = 12 Wats, calcular la corriente que circula por el circuito.

La ecuación de voltaje del circuito es:

V − Ri − V_{L} = 0

multiplicado por la corriente i en el circuito tenemos

V i − Ri^{2} − P_{L} = 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;
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.

f_{3}(x) = a_{0} + a_{1}x + a_{2}x^{2} + a_{3}^{3}

En este caso los coeficientes del polinomio los podemos poner en un vector de datos dado como 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:

f_{3}(x) = a_{0} + x(a_{1} + x(a_{2} + xa_{3}))

De manera general podemos expresar como

f_{N}(x) = a_{0} + x(a_{1} + x(a_{2} + ⋯ + x(a_{N−1} + x(a_{N}))))

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
y = p;

3.7.1. Ejemplo

Consideremos el siguiente polinomio f_{2}(x) = 1 + 2x + 3x2, el cual deseamos evaluar en x = 20. Para implementarlo hacemos

\begin{matrix}i & p = p ∗ x + a_{i} & p = 0 \\ 2 & p = 0 ∗ 20 + 3 & p = 3 \\ 1 & p = 3 ∗ 20 + 2 & p = 62 \\ 0 & p = 62 ∗ 20 + 1 & p = 1241 \end{matrix}

3.7.2. Ejemplo

Hacer la evaluación del polinomio f_{5}(x) = x^{5} − 3.5x^{4} + 2.75x^{3} + 2.125x^{2} − 3.875x + 1.25 en x = 2.5

\begin{matrix}i & p = p ∗ x + a_{i} & 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 \end{matrix}

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:

f_{n}(x) = a_{0} + a_{1}x + a_{2}x^{2} + a_{3}x^{3} + ⋯ + a_{n−1}x^{n−1} + a_{n}x^{n}

f′_{n}(x) = a_{1} + 2a_{2}x + 3a_{3}x^{2} + ⋯ + (n − 1)a_{n−1}x^{n−2} + na_{n}x^{n−1}

Note que el polinomio f′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

\begin{matrix}a = [a_{0}, a_{1}, a_{2}, a_{3}, a_{4}, ⋯, a_{n−1}, a_{n}] \\ a′ = [a_{1}, 2a_{2}, 3a_{3}, 4a_{4}, ⋯, (n − 1)a_{n−1}, na_{n}] \end{matrix}

Con esto tenemos que dado a los coeficientes de del polinomio de derivadas pueden ser calculados y la evaluación de la derivada se reduce a una simple evaluación polinomial.

Así por ejemplo considerando el polinomio f_{3}(x) = 1 + 2x + 3x^{2} + 4x^{3}, tenemos que a = [1, 2, 3, 4] y los coeficiente de f′_{3}(x) son a′ = [2, 6, 12]. La evaluación del polinomio resultante lo podemos hacer para x = 20 utilizando:

\begin{matrix}i & p = p ∗ x + a′_{i} & p \\ 2 & 0*20 +12 & 12 \\ 1 & 12*20 + 6 & 246 \\ 0 & 246*20 + 2 & 4922 \end{matrix}

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:

f(x) = x − \frac{x^{3}}{3!} + \frac{x^{5}}{5!} − \frac{x^{7}}{7!} + \frac{x^{9}}{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!]

\begin{matrix}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 \end{matrix}

La implementación en Matlab es

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 f_{n}(x)

f_{n}(x) = a_{0} + a_{1}x + a_{2}x^{2} + a_{3}x^{3} ⋯ + a_{n−1}x^{n−1} + a_{n}x_{n}

La integral de f_{n}(x) se calcula de manera analítica como

∫ f(x)dx = CT E + a_{0}x + \frac{a_{1}}{2} x^{2} + \frac{a_{2}}{3} x^{3} + \frac{a_{3}}{4} x^{4} ⋯ + \frac{a_{n−1}}{n} x^{n} + \frac{a_{n}}{n + 1}x^{n+1}

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

\begin{matrix}a = [a_{0}, a_{1}, a_{2}, a_{3}, a_{4}, ⋯, a_{n−1}, a_{n}] \\ a^{∗} = [CT E, \frac{a_{0}}{1} , \frac{a_{1}}{2} , \frac{a_{2}}{3} , \frac{a_{3}}{4} , \frac{a_{4}}{5} , ⋯, \frac{a_{n−1}}{n} , \frac{a_{n}}{n+1}] \end{matrix}

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:

∫_{x_{0}}^{x_{1}} f(x)dx = (CT E + a_{0}x + \frac{a_{1}}{2} x^{2} + \frac{a_{2}}{3} x^{3} + \frac{a_{3}}{4} x^{4} ⋯ + \frac{a_{n−1}}{n} x^{n} + \frac{a_{n}}{n + 1}x^{n+1})|_{x_{0}}^{x_{1}}

Lo que significa que debemos evaluar el polinomio con coeficientes a^{∗} en x_{1} y restar la evaluación en x_{2}.

La implementación en Matlab para este queda

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:

∫_{0}^{π/2} sin(x)dx

El polinomio de la serie de Taylor para seno es:

f(x) = x − \frac{x^{3}}{3!} + \frac{x^{5}}{5!} − \frac{x^{7}}{7!} + \frac{x^{9}}{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 :

\begin{matrix}a^{∗} = [0, 0, \frac{1}{2}, 0, \frac{−1}{4×3!}, 0, \frac{1}{6×5!}, 0, \frac{−1}{8×7!}, 0, \frac{1}{10×9!}] \\ a^{∗} = [0, 0, 0.5, 0, −0.041667, 0, 0.001389, 0, −0.000025, 0] \end{matrix}

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

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

f_{n}(x) = a_{0} + a_{1}x + a_{2}x^{2} + ... + a_{n}x^{n}.

es posible realizar una factorización de la siguiente forma

f_{n}(x) = (x + s) ∗ (a′_{0} + a′_{1}x + a′_{2}x^{2} + ... + a′_{n−1}x^{n−1}).

y podemos comprobar que tenemos un monomio de la forma x − s, si evaluando la función f_{n}(x) en x = −s, el resultado es f_{n}(−s) = 0. Una manera de resolverlo es utilizar un método de prueba que sería la manera mas tediosa.

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′(x^{(k)})(x^{(k+1)} − x^{(k)}) = 0

haciendo x^{(k)} = −s^{(k)} tenemos

f(−s^{(k+1)}) ≈ f(−s^{(k)}) + f′(−s^{(k)})(−s^{(k+1)} + s^{(k)}) = 0

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

s^{(k+1)} = s^{(k)} + \frac{f(−s^{(k)})}{f′(−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 f_{6}(x) = x^{6} −1 con un valor inicial s^{(0)} = 10 3.8. DEFLACIÓN DE POLINOMIOS Y DIVISIÓN DE POLINOMIOS 55

s_{1} = 10.000000 + \frac{999999.000000}{−600000.000000} = 8.333335 s_{2} = 8.333335 + \frac{334897.378558}{−241126.784337} = 6.944450 s_{3} = 6.944450 + \frac{112156.191251}{−96903.735989} = 5.787052 s_{4} = 5.787052 + \frac{37560.618299}{−38943.785362} = 4.822569 s_{5} = 4.822569 + \frac{12578.711852}{−15651.050576} = 4.018871 s_{6} = 4.018871 + \frac{4212.321940}{−6290.306217} = 3.349218 s_{7} = 3.349218 + \frac{1410.434918}{−2528.533032} = 2.791411 s_{8} = 2.791411 + \frac{472.088718}{−1016.880869} = 2.327159 s_{9} = 2.327159 + \frac{157.838757}{−409.526161} = 1.941741 s_{10} = 1.941741 + \frac{52.597923}{−165.618133} = 1.624156 s_{11} = 1.624156 + \frac{17.355481}{−67.809321} = 1.368210 s_{12} = 1.368210 + \frac{5.560199}{−28.768380} = 1.174936 s_{13} = 1.174936 + \frac{1.630779}{−13.434500} = 1.053548 s_{14} = 1.053548 + \frac{0.367497}{−7.787952} = 1.006360 s_{15} = 1.006360 + \frac{0.038774}{−6.193251} = 1.000100 s_{16} = 1.000100 + \frac{0.000598}{−6.002990} = 1.000000

Como resultado tenemos que x^{6} − 1 = (x + 1)(a_{5}x^{5} + a_{4}x^{4} + a_{3}x^{3} + a_{2}x^{2} + a_{1}x + a_{0}).

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 f_{n_{1}}(x) tal que f_{n}(x) = (x − s) ∗ f_{n−1}(x). Para esto suponga que conoce, una de las raíces de un polinomio y que podemos realizar la división de este polinomio para obtener un polinomio de grado menor. Así por ejemplo si tenemos

f_{n}(x) = a_{0} + a_{1}x + a_{2}x^{2} + ... + a_{n}x^{n}.

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

f_{n}(x) = (x + s) ∗ (a′_{0} + a′_{1}x + a′_{2}x^{2} + ... + a′_{n−1}x^{n−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

a_{3}x^{2}  (a_{2} − a_{3}s)x  a_{1} − (a_{2} − a_{3}s)s
x + s a_{3}x^{3}  +a_{2}x^{2}  +a_{1}x  +a_{0}
−a_{3}x^{3}  −a_{3}sx^{2}
0 (a_{2} − a_{3}s)x^{2} +a_{1}x +a_{0}
−(a_{2} − a_{3}s)x^{2}  −(a_{2} − a_{3}s)sx
0 (a_{1} − (a_{2} − a_{3}s)s)x  +a_{0}
−(a_{1} − (a_{2} − a_{3}s)s)x  −(a_{1} − (a_{2} − a_{3}s)s)s
0 a_{0} − (a_{1} − (a_{2} − a_{3}s)s)s

La división sintética, es una manera de hacer lo mismo, pero de forma compacta. Así tenemos:

x + s a_{n}  a_{n−1}  a_{n−2}  a_{n−3}
−a_{n}s  −(a_{2} − a_{3}s)s  −(a_{n−2} − (a_{n−1} − sa_{n})s)s
a_{n} a_{n−1} − a_{n}s a_{n−2} − (a_{n−1} − a_{n}s)s a_{n−3} − (a_{n−2} − (a_{n−1} − a_{n}s)s)s

renombrado términos tenemos

b_{n} = a_{n}
b_{n−1} = a_{n−1} − a_{n}s = a_{n−1} − b_{n}s
b_{n−2} = a_{n−2} − (a_{n−1} − a_{n}s)s = a_{n−2} − b_{n−1}s
⋮ = ⋮
b_{2} = a_{2} − b_{3}s
b_{1} = a_{1} − b_{2}s
b_{0} = a_{0} − b_{1}s

La implementación en Matlab es:

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 f_{5}(x) = x^{5} −7x^{4}–3x^{3} +79x^{2}–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 f_{4}(x) = x^{4} − 3x^{3}–15x^{2} + 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 f_{n}(x) entre un polinomio de segundo orden de la forma f_{2}(x) = x^{2} + rx + s. Aplicando la técnica anterior podemos realizar la división f_{n}(x)/f_{2}(x) como

a_{5}x^{3} +(a_{4} − a_{5}r)x^{2} +((a_{3} − sa_{5}) − (a_{4} − a_{5}r)r)x
x^{2} + rx + s a_{5}x^{5}  +a_{4}x^{4}  +a_{3}x^{3}  +a_{2}x^{2}  …
−a_{5}x^{5}  −a_{5}rx^{4}  −a_{5}sx^{3}
(a_{4} − a_{5}r)x^{4}  +(a_{3} − sa_{5})x^{3}  +a_{2}x^{2}  …
−(a_{4} − a_{5}r)x^{4}  −(a_{4} − a_{5}r)rx^{3}  −(a_{4} − a_{5}r)sx^{2}  …
(a_{3} − sa_{5}) − (a_{4} − a_{5}r)r  +(a_{2} − (a_{4} − a_{5}r)s)x^{2}

Si en la ecuación anterior sustituimos

b_{5} = a_{5}
b_{4} = a_{4} − a_{5}r = a_{4} − rb_{5}
b_{3} = a_{3} − sa_{5} − (a_{4} − a_{5}r)r = a_{3} − sb_{5} − rb_{4}
b_{2} = a_{2} − sb_{4} − rb_{3}
b_{1} = a_{1} − sb_{3} − rb_{2}
b_{0} = a_{0} − sb_{2} − rb_{1}

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

b_{n} = a_{n}
b_{n−1} = a_{n} − rb_{n}
b_{k} = a_{k} − rb_{k+1} − sb_{k+2}
∀i ∈ {n − 2, n − 3, ⋯ 1}

Finalmente el residuo de la división se calcula como

R = b_{1}(x + r) + b_{0}

La implementación en Matlab es:

function [c, r] = Division_Sintetica2(a, r, s)
n = length(a);
b=zeros(n,1);

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 f_{3}(x) = x^{3} − 1, entre el polinomio f_{2}(x) = x^{2} + 3x + 4

De acuerdo con la sucesión

b_{3} = a_{3} = 1.0
b_{2} = a_{2} − rb_{3} = 0 − (1)(3) = −3
b_{1} = a_{1} − rb_{2} − sb_{3} = 0 − (3)(−3) − (4)(1) = 5
b_{0} = a_{0} − rb_{1} − sb_{2} = −1 − (3)(5) − (4)(−3) = −4

El residuo de acuerdo con lo expuesto es

R = b_{1}(x + r) + b_{0} = 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

r =
    11
     5

3.8.3. Ejemplo

Hacer la división sintética del polinomio f_{5}(x) = x^{5}−3.5x^{4}+2.75x^{3}+2.125x^{2}−3.875x+1.25, entre el polinomio f_{2}(x) = x^{2} + x − 2

De acuerdo con la sucesión

b_{5} = a_{5} = 1.0
b_{4} = a_{4} − rb_{5} = −3.5 − (1)(1) = −4.5
b_{3} = a_{3} − rb_{4} − sb_{5} = 2.75 − (1)(−4.5) − (−2)(1) = 2.75 + 6.5 = 9.25
b_{2} = a_{2} − rb_{3} − sb_{4} = 2.125 − (1)(9.25) − (−2)(−4.5) = −16.125
b_{1} = a_{1} − rb_{2} − sb_{3} = −3.875 − (1)(−16.125) − (−2)(9.25) = 30.75
b_{0} = a_{0} − rb_{1} − sb_{2} = 1.25 − (1)(30.75) − (−2)(−16.125) = 61.75

Nuestro residuo queda

R = b_{1}(x + r) + b_{0} = 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.

\begin{aligned}& 1 & -3.5 & 2.75 & 2.125 & -3.875 & 1.25 \\ x^{2} + x − 2 & & -1 & 6.5 & -18.25 & 34.625 & -63.00 \\ & 1 & -4.5 & 9.25 & -16.125 & 30.75 & -61.75 \end{aligned}

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

   -4.5000
    1.0000

r =
  -31.0000
   30.7500

Lo cual significa que

\frac{x^{5} − 3.5x^{4} + 2.75x^{3} + 2.125x^{2} − 3.875x + 1.25}{x^{2} + x − 2} = x^{3} − 4.5x^{2} + 9.25x − 16.125

3.8.4. Ejemplo

Repetir el problema anterior pero suponiendo que f_{2}(x) = x^{2} − x − 2

Pare este ejemplo tenemos la sucesión

b_{5} = a_{5} = 1.0
b_{4} = a_{4} − rb_{5} = −3.5 − (−1)(1) = −2.5
b_{3} = a_{3} − rb_{4} − sb_{5} = 2.75 − (−1)(−2.5) − (−2)(1) = 2.25
b_{2} = a_{2} − rb_{3} − sb_{4} = 2.125 − (−1)(2.25) − (−2)(−2.5) = −0.625
b_{1} = a_{1} − rb_{2} − sb_{3} = −3.875 − (−1)(−0.625) − (−2)(2.25) = 0
b_{0} = a_{0} − rb_{1} − sb_{2} = 1.25 − (−1)(0) − (−2)(−0.625) = 0

\begin{aligned}& 1 & -3.5 & 2.75 & 2.125 & -3.875 & 1.25 \\ x^{2} − x − 2 & & 1 & -0.5 & -2.75 & 3.875 & -1.25 \\ & 1 & -2.5 & 2.25 & -0.625 & 0 & 0 \end{aligned}

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 =

   -0.6250
    2.2500
   -2.5000
    1.0000

r =
     0
     0

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

\frac{x^{5} − 3.5x^{4} + 2.75x^{3} + 2.125x^{2} − 3.875x + 1.25}{x^{2} − x − 2} = x^{3} − 2.5x^{2} + 2.25x − 0.625

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

Un polinomio de segundo orden lo podemos expresar como

f_{2}(n) = a_{0} + a_{1}x + a_{2}x^{2}

La solución utilizando la formula general tenemos que

x = \frac{−a_{1} ± \sqrt{a_{1}^{2} − 4a_{2}a_{0}}}{2a_{2}}

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

El método de Bairstow es un método iterativo, basado en el método de Newton Raphson. Dado un polinonio f_{n}(x) se encuentran dos factores, un polinomio cuadrático f_{2}(x) = x^{2} + rx + s y un polinomio f_{n−2}(x). El procedimiento general para el método de Bairstow es:

1. Dado f_{n}(x) y r_{0} y s_{0}

2. Utilizando el método de NR calculamos f_{2}(x) = x^{2} + r_{0}x + s_{0} y f_{n−2}(x), tal que, el residuo de fn(x)/f_{2}(x) sea igual a cero.

3. Se determinan la raíces f_{2}(x), utilizando la formula general.

4. Se calcula f_{n−2(}x) = f_{n}(x)/f_{2}(x)

5. Hacemos f_{n}(x) = f_{n−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

f_{n}(x) = a_{n}x^{n} + a_{n−1}x^{n−1} + … + a_{2}x^{2} + a_{1}x + a_{0}

Al dividir entre f_{2}(x) = x^{2}–rx–s, tenemos como resultado el siguiente polinomio

f_{n−2}(x) = b_{n}x^{n−2} + b_{n−1}x^{n−3} + … + b_{3}x + b_{2}

con un residuo R = b_{1}x + b_{0}, el residuo será cero solo si b_{1} y b_{0} lo son. Los términos b, los calculamos utilizamos división sintética, la cual puede resolverse utilizando la siguiente relación de recurrencia

b_{n} = a_{n}
b_{n−1} = a_{n−1} − rb_{n}
b_{i} = a_{i} − rb_{i+1} − sb_{i+2}

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 b_{1} y b_{0} respecto a r y s la cual calculamos utilizando la serie de Taylor

b_{1}(r_{k+1}, s_{k+1}) = b_{1}(r_{k}, s_{k}) + \frac{∂b_{1}(r_{k}, s_{k})}{∂r}(r_{k} − r_{k+1}) + \frac{∂b_{1}(r_{k}, s_{k})}{∂s}(s_{k} − s_{k+1})
b_{0}(r_{k+1}, s_{k+1}) = b_{0}(r_{k}, s_{k}) + \frac{∂b_{0}(r_{k}, s_{k})}{∂r}(r_{k} − r_{k+1}) + \frac{∂b_{0}(r_{k}, s_{k})}{∂s}(s_{k} − s_{k+1})

donde los valores de r_{k} y s_{k} están dados y calculamos los nuevos valores r_{k+1} y s_{k+1} que hacen a b_{1}(r_{k+1}, s_{k+1}) y b_{0}(r_{k+1}, s_{k+1}) igual a cero. El sistema de ecuaciones que tenemos que resolver es:

0 = b_{1}(r_{k}, s_{k}) + \frac{∂b_{1}(r_{k}, s_{k})}{∂r}(r_{k} − r_{k+1}) + \frac{∂b_{1}(r_{k}, s_{k})}{∂s}(s_{k} − s_{k+1})
0 = b_{0}(r_{k}, s_{k}) + \frac{∂b_{0}(r_{k}, s_{k})}{∂r}(r_{k} − r_{k+1}) + \frac{∂b_{0}(r_{k}, s_{k})}{∂s}(s_{k} − s_{k+1})

En forma matricial tenemos

[ \begin{matrix}\frac{∂b_{1}(r_{k},s_{k})}{∂r} & \frac{∂b_{1}(r_{k},s_{k})}{∂s} \\ \frac{∂b_{0}(r_{k},s_{k})}{∂r} & \frac{∂b_{0}(r_{k},s_{k})}{∂s} \end{matrix} ] [ \begin{matrix}dr_{k} \\ ds_{k} \end{matrix} ] = [ \begin{matrix}−b_{1}(r_{k}, s_{k}) \\ −b_{0}(r_{k}, s_{k}) \end{matrix} ]

donde dr_{k} = r_{k} − r_{k+1} y ds_{k} = s_{k} − s_{k+1}

Bairtow muestra que los coeficientes c del polinomio de derivadas parciales f′_{n}(x) = c_{0} + c_{1}x+c_{2}x^{2} +⋯ pueden obtenerse haciendo un procedimiento similar a la división sintética, así

c_{n} = b_{n}
c_{n−1} = b_{n−1} − rc_{n}
c_{i} = b_{i} − rc_{i+1} − sc_{i+2}

donde

\frac{∂b_{0}(r_{k}, s_{k})}{∂r} = c_{1}(r_{k}, s_{k})
\frac{∂b_{1}(r_{k}, s_{k})}{∂r} = c_{2}(r_{k}, s_{k})
\frac{∂b_{0}(r_{k}, s_{k})}{∂s} = c_{2}(r_{k}, s_{k})
\frac{∂b_{1}(r_{k}, s_{k})}{∂s} = c_{3}(r_{k}, s_{k})

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:

[ \begin{matrix}c_{2}(r_{k}, s_{k}) & c_{3}(r_{k}, s_{k}) \\ c_{1}(r_{k}, s_{k}) & c_{2}(r_{k}, s_{k}) \end{matrix} ] [ \begin{matrix}dr_{k} \\ ds_{k} \end{matrix} ] = [ \begin{matrix}−b_{1}(r_{k}, s_{k}) \\ −b_{0}(r_{k}, s_{k}) \end{matrix} ]

y cada una de las iteraciones de Newton Raphson

[ \begin{matrix}r_{k+1} \\ s_{k+1} \end{matrix} ] = [ \begin{matrix}r_{k} \\ s_{k} \end{matrix} ] + [ \begin{matrix}c_{2}(r_{k}, s_{k}) & c_{3}(r_{k}, s_{k}) \\ c_{1}(r_{k}, s_{k}) & c_{2}(r_{k}, s_{k}) \end{matrix} ]^{−1} [ \begin{matrix}b_{1}(r_{k}, s_{k}) \\ b_{0}(r_{k}, s_{k}) \end{matrix} ]

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

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 f_{5}(x) = x^{5} − 3.5x^{4} + 2.75x^{3} + 2.125x^{2} − 3.875x + 1.25, determinar los valores de r y s que hacen el resido igual a cero. Considere r_{0} = 1 y s_{0} = −2.

Solución.

Iteración 1

La división sintética con el polinomio f_{2}(x) = x^{2} + x − 2.0 da como resultado

f_{3}(x) = x^{3} − 4.5x^{2} + 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

[ \begin{matrix}r_{1} \\ s_{1} \end{matrix} ] = [ \begin{matrix}1 \\ −2 \end{matrix} ] − [ \begin{matrix}−43.875 & 16.750 \\ 108.125 & −43.875 \end{matrix} ]^{−1} [ \begin{matrix}−30.7500 \\ 61.7500 \end{matrix} ] = [ \begin{matrix}−1.7637 \\ −7.4034 \end{matrix} ]

Iteración 2 La división sintética con el polinomio f_{2}(x) = x^{2}−1.7637x−7.4034 da como resultado

f_{3}(x) = x^{3} − 1.7363x^{2} + 7.0911x − 1.7768
Residuo = [51.7564, 105.6858]

Los coeficiente del polinomio de derivadas es

c_{2} = [677.3337, 208.1484, 27.6280, 14.5427, 0.0274, 1.0000]

Aplicando el método de Newton tenemos

[ \begin{matrix}r_{2} \\ s_{2} \end{matrix} ] = [ \begin{matrix}−1.7637 \\ −7.4034 \end{matrix} ] − [ \begin{matrix}27.62800 & 14.5427 \\ 208.1484 & 27.6280 \end{matrix} ]^{−1} [ \begin{matrix}−51.75640 \\ −105.68578 \end{matrix} ] = [ \begin{matrix}−1.7164 \\ −3.9343 \end{matrix} ]

Iteración 3 La división sintética con el polinomio f_{2}(x) = x^{2}−1.7164x−3.9343 da como resultado

f_{3}(x) = x^{3} − 1.7836x^{2} + 3.6229x + 1.3262
Residuo = [12.6547, 28.1881]

Los coeficientes del polinomio de derivadas son c_{3} = [195.3505, 65.6792, 13.8350, 7.4418, −0.0672, 1.0000]

Aplicando el método de Newton tenemos

[ \begin{matrix}r_{3} \\ s_{3} \end{matrix} ] = [ \begin{matrix}−1.7164 \\ −3.9343 \end{matrix} ] − [ \begin{matrix}13.8350 & 7.4418 \\ 65.6792 & 13.8350 \end{matrix} ]^{−1} [ \begin{matrix}−12.6547 \\ −28.1881 \end{matrix} ] = [ \begin{matrix}−1.5997 \\ −2.4507 \end{matrix} ]

En resumen

\begin{matrix}k & r & s & b_{1} & b_{0} \\ 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 \end{matrix}

La solución es:

f_{3}(x) = x^{3} − 2.5x^{2} + 2.25x − 0.625
f_{2}(x) = x^{2} − x − 2

Las raíces de f_{2}(x) = x^{2} − x − 2, son x_{1} = 2 y x_{2} = −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

Si repetimos el ejemplo pero ahora considerando el polinomio f_{3}(x) = x^{3} − 2.5x^{2} + 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 f_{5}(x) = x^{5} − 3.5x^{4} + 2.75x^{3} + 2.125x^{2} − 3.875x + 1.25, calcular la raíces utilizando el Método de Bairstow con valores iniciales r_{0} = 1 y s_{0} = −2

Iteración 1

Calculamos la deflación Polinomial

f_{5}(x) = (−0.625 + 2.25x − 2.5x^{2} + x^{3})(x^{2} − x − 2)

Las raíces calculadas son

x_{1} = 2.0000
x_{2} = −1.0000

Iteración 2

f_{3}(x) = (−0.625 + 2.25x − 2.5x^{2} + x^{3}) = (x − 0.5)(x^{2} − 2x + 1.25)

Las raíces son

x_{3} = 1 + j0.5
x_{4} = 1 − j0.5

Iteración 3 Finalmente

f_{1}(x) = x − 0.5

tiene una raiz

x_{5} = 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 f_{5}(x) = x^{5} − 3.5x^{4} + 2.75x^{3} + 2.125x^{2} − 3.875x + 1.25, determinar las raíces de este polinomio. Considere r_{0} = −1 y s_{0} = −1. Iteración 1

f_{5}(x) = x^{5} − 3.5x^{4} + 2.75x^{3} + 2.125x^{2} − 3.875x + 1.25
f_{5}(x) = (x^{3} − 4x^{2} + 5.25x − 2.5) ∗ (x^{2} + 0.5x − 0.5)

Las raíces de x^{2} + 0.5x − 0.5 = 0 son

x_{1} = 0.5
x_{2} = −1.0

Iteración 2

f_{3}(x) = x^{3} − 4x^{2} + 5.25x − 2.5
f_{3}(x) = (x − 2) ∗ (x^{2} − 2x + 1.25)

Las raíces de x^{2} − 2x + 1.25 = 0 son

x_{3} = 1.0 + j0.5
x_{4} = −1.0 − j0.5

Iteración 3

f_{1}(x) = (x − 2)

La raíz de este polinomio es

x_{5} = 2;

Todas la raíces de f_{5}(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 x_{1}, ..., x_{n} son las incógnitas, b_{1}, ..., b_{n} se denominan términos independientes y los números a_{i,j} se llaman coeficientes de las incógnitas, formando una matriz que denominaremos A, matriz de coeficientes.

[ \begin{matrix}a_{1,1} & a_{1,2} & ⋯ & a_{1,n} \\ a_{2,1} & a_{2,2} & ⋯ & a_{2,n} \\ ⋮ & ⋮ & ⋯ & ⋮ \\ a_{n,1} & a_{n,2} & ⋯ & a_{n,n} \end{matrix} ] [ x_{1} ; x_{2} ; ⋮ ; x_{n} ] = [ b_{1} ; b_{2} ; ⋮ ; b_{n} ]

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.

[ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} \\ a_{2,1} & a_{2,2} & a_{2,3} \\ a_{3,1} & a_{3,2} & a_{3,3} \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}b_{1} \\ b_{2} \\ b_{3} \end{matrix} ]

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

x_{1} = \frac{b_{1} − a_{1,2}x_{2} − a_{1,3}x_{3}}{a_{1,1}}
x_{2} = \frac{b_{2} − a_{2,1}x_{1} − a_{2,3}x_{3}}{a_{2,2}}
x_{3} = \frac{b_{3} − a_{3,1}x_{1} − a_{3,2}x_{2}}{a_{3,3}}

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

x_{1}^{(t+1)} = \frac{b_{1} − a_{1,2}x_{2}^{(t)} − a_{1,3}x_{3}^{(t)}}{a_{1,1}}

x_{2}^{(t+1)} = \frac{b_{2} − a_{2,1}x_{1}^{(t)} − a_{2,3}x_{3}^{(t)}}{a_{2,2}}

x_{3}^{(t+1)} = \frac{b_{3} − a_{3,1}x_{1}^{(t)} − a_{3,2}x_{2}^{(t)}}{a_{3,3}}

En general podemos escribir como

x_{k}^{(t+1)} = \frac{b_{k}– ∑_{l=1,l≠k}^{N} a_{k,l}x_{l}^{(t)}}{a_{k,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

                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 utilizadas una vez que se realiza el cálculo de ellas así, para un sistema de tres ecuaciones tendremos:

x_{1}^{(t+1)} = \frac{b_{1} − a_{1,2}x_{2}^{(t)} − a_{1,3}x_{3}^{(t)}}{a_{1,1}}

x_{2}^{(t+1)} = \frac{b_{2} − a_{2,1}x_{1}^{(t+1)} − a_{2,3}x_{3}^{(t)}}{a_{2,2}}

x_{3}^{(t+1)} = \frac{b_{3} − a_{3,1}x_{1}^{(t+1)} − a_{3,2}x_{2}^{(t+1)}}{a_{3,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

                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.

[ \begin{matrix}4 & −1 & 1 \\ 4 & −8 & 1 \\ −2 & 1 & 5 \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}7 \\ −21 \\ 15 \end{matrix} ]

Las primeras 20 iteraciones del algoritmo de Jacobi son :

\begin{matrix}k & x_{1} & x_{2} & x_{3} \\ 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 \end{matrix}

Para correr hacer

>> Jacobi([4 -1 1; 4 -8 1; -2 1 5], [1,2,2]', [7,-21, 15]')

ans =
    2.0000
    4.0000
    3.0000

La solución utilizando Gauss-Seidel es :

\begin{matrix}k & x_{1} & x_{2} & x_{3} \\ 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 \end{matrix}

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

A = [ \begin{matrix}10 & −1 & −1 & −1 & 1 \\ 1 & 4 & 0 & 0 & 0 \\ 1 & 0 & 4 & 0 & 0 \\ 1 & 0 & 0 & 4 & 0 \\ 1 & 0 & 0 & 0 & 3 \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \\ x_{5} \end{matrix} ] = [ \begin{matrix}1 \\ 2 \\ 3 \\ 4 \\ 5 \end{matrix} ]

A = sparse(5,5);
A(1,1) = 10;

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 condiciones de ser triangular superior.

[ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} \\ a_{2,1} & a_{2,2} & a_{2,3} \\ a_{3,1} & a_{3,2} & a_{3,3} \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}b_{1} \\ b_{2} \\ b_{3} \end{matrix} ]

Comenzaremos por despejar x_{1} de la ecuación (I)

x_{1} = \frac{b_{1} − a_{1,2}x_{2} − a_{1,3}x_{3}}{a_{1,1}}

y sustituimos en las ecuaciones (II)

a_{2,1} (\frac{b_{1} − a_{1,2}x_{2} − a_{1,3}x_{3}}{a_{1,1}} ) + a_{2,2}x_{2} + a_{2,3}x_{3} = b_{2}

agrupando términos semejantes tenemos:

(a_{2,2} − \frac{a_{2,1} ∗ a_{1,2}}{a_{1,1}} ) x_{2} + (a_{2,3} − a_{2,1} \frac{a_{1,3}}{a_{1,1}} ) x_{3} = (b_{2} − a_{2,1} \frac{b_{1}}{a_{1,1}} )

Ahora sustituimos en la ecuación (III)

(a_{3,1} \frac{b_{1} − a_{1,2}x_{2} − a_{1,3}x_{3}}{a_{1,1}} ) + a_{3,2}x_{2} + a_{3,3}x_{3} = b_{3}

(a_{3,2} − \frac{a_{3,1}a_{1,2}}{a_{1,1}} ) x_{2} + (a_{3,3} − \frac{a_{3,1}a_{1,3}}{a_{1,1}} ) x_{3} = (b_{3} − a_{3,1} \frac{b_{1}}{a_{1,1}} )

Lo cual nos da un nuevo sistema simplificado dada por

[ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} \\ 0 & a′_{2,2} & a′_{2,3} \\ 0 & a′_{3,2} & a′_{3,3} \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}b_{1} \\ b′_{2} \\ b′_{3} \end{matrix} ]

80 SISTEMAS DE ECUACIONES donde los valores de a′_{i,j} los calculamos como:

a′_{i,j} = a_{i,j} − a_{i,k} \frac{a_{k,j}}{a_{k,k}}
b′_{i} = b_{i} − a_{i,k} \frac{b_{k}}{a_{k,k}}

Si repetimos el procedimiento, ahora para x_{1}, tendremos un sistema dado como:

[ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} \\ 0 & a′_{2,2} & a′_{2,3} \\ 0 & 0 & a′′_{3,3} \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}b_{1} \\ b′_{2} \\ b′′_{3} \end{matrix} ]

Solución de un sistema Triangular superior

[ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} & a_{1,4} \\ 0 & a_{2,2} & a_{2,3} & a_{2,4} \\ 0 & 0 & a_{3,3} & a_{3,4} \\ 0 & 0 & 0 & a_{4,4} \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{matrix} ] = [ \begin{matrix}b_{1} \\ b_{2} \\ b_{3} \\ b_{4} \end{matrix} ]

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

x_{4} = \frac{b_{4}}{a_{4,4}}
x_{3} = \frac{b_{3} − a_{3,4}x_{4}}{a_{3,3}}
x_{2} = \frac{b_{2} − a_{2,3}x_{3} − a_{2,4}x_{4}}{a_{2,2}}
x_{1} = \frac{b_{1} − a_{1,2}x_{2} − a_{1,3}x_{3} − a_{1,4}x_{4}}{a_{1,1}}

En general podemos calcular la solución haciendo

x_{k} = \frac{b_{k} − ∑_{i=k+1}^{N} a_{k,i}x_{i}}{a_{k,k}}

La implementación en Matlab queda

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 sustitución hacia atrás.

Ejemplo 1

Dado el sistema lineal de ecuaciones, calcular el sistema Triangular Superior utilizando el algoritmo de Eliminación Gaussiana

[ \begin{matrix}10 & −1 & 2 & 1 \\ −1 & 15 & −3 & 1 \\ 2 & −3 & 6 & −3 \\ 1 & 1 & −3 & 7 \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{matrix} ] = [ \begin{matrix}1 \\ 2 \\ 2 \\ 1 \end{matrix} ]

Primer paso k = 1

[ \begin{matrix}10.0000 & −1.0000 & 2.0000 & 1.0000 \\ 0 & 14.9000 & −2.8000 & 1.1000 \\ 0 & −2.8000 & 5.6000 & −3.2000 \\ 0 & 1.1000 & −3.2000 & 6.9000 \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{matrix} ] = [ \begin{matrix}1.0000 \\ 2.1000 \\ 1.8000 \\ 0.9000 \end{matrix} ]

Segundo paso k = 2

[ \begin{matrix}10.0000 & −1.0000 & 2.0000 & 1.0000 \\ 0 & 14.9000 & −2.8000 & 1.1000 \\ 0 & 0 & 5.0738 & −2.9933 \\ 0 & 0 & −2.9933 & 6.8188 \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{matrix} ] = [ \begin{matrix}1.0000 \\ 2.1000 \\ 2.1946 \\ 0.7450 \end{matrix} ]

Tercer paso k = 3

[ \begin{matrix}10.0000 & −1.0000 & 2.0000 & 1.0000 \\ 0 & 14.9000 & −2.8000 & 1.1000 \\ 0 & 0 & 5.0738 & −2.9933 \\ 0 & 0 & 0 & 5.0529 \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{matrix} ] = [ \begin{matrix}1.0000 \\ 2.1000 \\ 2.1946 \\ 2.0397 \end{matrix} ]

Sustitución hacia atras Paso 1 k = 4

x_{4} = \frac{b_{4}}{a_{4,4}}
x_{4} = \frac{2.0397}{5.0529} = 0.4037

Paso 2 k = 3

x_{3} = \frac{b_{3} − a_{3,4}x_{4}}{a_{3,3}}
x_{3} = \frac{2.1946 − (−2.9933)(0.4037)}{5.0738} = 0.6707

Paso 3 k = 2

x_{2} = \frac{b_{2} − a_{2,3}x_{3} − a_{2,4}x_{4}}{a_{2,2}}
x_{2} = \frac{2.1000 − (−2.8000)(0.6707) − (1.1000)(0.4037)}{14.9000} = 0.2372

Paso 4 k = 1

x_{1} = \frac{b_{1} − a_{1,2}x_{2} − a_{1,3}x_{3} − a_{1,4}x_{4}}{a_{1,1}}
x_{1} = \frac{1.0000 − (−1.0000)(0.2372) − (2.0000)(0.6707) − (1.0000)(0.4037)}{10.0000} = −0.0508

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

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

[ \begin{matrix}3 & −1 & −1 \\ −1 & 1 & 0 \\ −1 & 0 & 1 \end{matrix} ] [ \begin{matrix}x \\ y \\ z \end{matrix} ] = [ \begin{matrix}0 \\ 1 \\ 1 \end{matrix} ]

Aplicando Eliminación Gaussiana nos queda.

[ \begin{matrix}3 & −1 & −1 \\ 0 & 2/3 & −1/3 \\ 0 & 0 & 1/2 \end{matrix} ] [ \begin{matrix}x \\ y \\ z \end{matrix} ] = [ \begin{matrix}0 \\ 1 \\ 3/2 \end{matrix} ]

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

[ \begin{matrix}1 & 2 & 6 \\ 4 & 8 & −1 \\ −2 & 3 & 5 \end{matrix} ]

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

[ \begin{matrix}1 & 2 & 6 \\ 0 & 0 & −25 \\ 0 & 7 & 17 \end{matrix} ]

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

[ \begin{matrix}1 & 2 & 6 \\ −2 & 3 & 5 \\ 4 & 8 & −1 \end{matrix} ]

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

[ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} \\ a_{2,1} & a_{2,2} & a_{2,3} \\ a_{3,1} & a_{3,2} & a_{3,3} \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}b_{1} \\ b_{2} \\ b_{3} \end{matrix} ]

Este sistema de ecuaciones lo podemos escribir como:

Ax = Ib

donde I es la matriz identidad

[ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} \\ a_{2,1} & a_{2,2} & a_{2,3} \\ a_{3,1} & a_{3,2} & a_{3,3} \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{matrix} ] [ \begin{matrix}b_{1} \\ b_{2} \\ b_{3} \end{matrix} ]

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

[ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} & 1 & 0 & 0 & b_{1} \\ a_{2,1} & a_{2,2} & a_{2,3} & 0 & 1 & 0 & b_{2} \\ a_{3,1} & a_{3,2} & a_{3,3} & 0 & 0 & 1 & b_{3} \end{matrix} ]  (4.4)

Primer paso Vamos a despejar la variable x_{1} del sistema y la sustituimos en las otras dos ecuaciones

\frac{b_{1} − a_{1,2}x_{2} − a_{1,3}x_{3}}{a_{1,1}} = x_{1}  (4.5)

Sustituyendo en la ecuación 2

a_{2,1} (\frac{b_{1} − a_{1,2}x_{2} − a_{1,3}x_{3}}{a_{1,1}} ) + a_{2,2}x_{2} + a_{2,3}x_{3} = b_{2}

0x_{1} + (\frac{a_{2,1}}{a_{1,1}} ) b_{1} + (a_{2,2} − \frac{a_{2,1}a_{1,2}}{a_{1,1}} ) x_{2} + (a_{2,3} \frac{a_{2,1}a_{1,3}}{a_{1,1}} ) x_{3} = b_{2}  (4.6)

88 SISTEMAS DE ECUACIONES Sustituyendo en la ecuación 3

a_{3,1} (\frac{b_{1} − a_{1,2}x_{2} − a_{1,3}x_{3}}{a_{1,1}} ) + a_{3,2}x_{2} + a_{3,3}x_{3} = b_{3}

0x_{1} + (\frac{a_{3,1}}{a_{1,1}} ) b_{1} + (a_{3,2} − \frac{a_{3,1}a_{1,2}}{a_{1,1}} ) x_{2} + (a_{3,3} − \frac{a_{3,1}a_{1,3}}{a_{1,1}} ) x_{3} = b_{3}  (4.7)

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

[ \begin{matrix}1 & \frac{a_{1,2}}{a_{1,1}} & \frac{a_{1,3}}{a_{1,1}} \\ 0 & (a_{2,2} − \frac{a_{2,1}a_{1,2}}{a_{1,1}} ) & (a_{2,3} − \frac{a_{2,1}a_{1,3}}{a_{1,1}} ) \\ 0 & (a_{3,2} − \frac{a_{3,1}a_{1,2}}{a_{1,1}} ) & (a_{3,3} − \frac{a_{3,1}a_{1,3}}{a_{1,1}} ) \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}\frac{1}{a_{1,1}} & 0 & 0 \\ −\frac{a_{2,1}}{a_{1,1}} & 1 & 0 \\ −\frac{a_{3,1}}{a_{1,1}} & 0 & 1 \end{matrix} ] [ \begin{matrix}b_{1} \\ b_{2} \\ b_{3} \end{matrix} ]

La matriz aumentada dada por (4.4 ) tenemos:

[ \begin{matrix}1 & \frac{a_{1,2}}{a_{1,1}} & \frac{a_{1,3}}{a_{1,1}} & \frac{1}{a_{1,1}} & 0 & 0 & \frac{1}{a_{1,1}} b_{1} \\ 0 & (a_{2,2} − \frac{a_{2,1}a_{1,2}}{a_{1,1}} ) & (a_{2,3} − \frac{a_{2,1}a_{1,3}}{a_{1,1}} ) & −\frac{a_{2,1}}{a_{1,1}} & 1 & 0 & b_{2} − \frac{a_{2,1}}{a_{1,1}} b_{1} \\ 0 & (a_{3,2} − \frac{a_{3,1}a_{1,2}}{a_{1,1}} ) & (a_{3,3} − \frac{a_{3,1}a_{1,3}}{a_{1,1}} ) & −\frac{a_{3,1}}{a_{1,1}} & 0 & 1 & b_{3} − \frac{a_{3,1}}{a_{1,1}} b_{1} \end{matrix} ]

Segundo Paso Para un sistema equivalente

[ \begin{matrix}1 & a′_{1,2} & a′_{1,3} \\ 0 & a′_{2,2} & a′_{2,3} \\ 0 & a′_{3,2} & a′_{3,3} \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}c′_{1,1} & 0 & 0 \\ c′_{2,1} & 1 & 0 \\ c′_{3,1} & 0 & 1 \end{matrix} ] [ \begin{matrix}b′_{1} \\ b′_{2} \\ b′_{3} \end{matrix} ]  (4.8)

Despejamos x_{2} de la ecuación 2

x_{2} = \frac{c′_{2,1}b′_{1} + b′_{2} − a′_{2,3}x_{3}}{a′_{2,2}}

Sustituyendo en la ecuación 1

x1 + a′_{1,2} (\frac{c′_{2,1}b′_{1} + b′_{2} − a′_{2,3}x_{3}}{a′_{2,2}} ) + a′_{1,3} = c′_{1,1}b′_{1}

x1 + 0x_{2} + (a′_{1,3} − \frac{a′_{1,2}a′_{2,3}}{a′_{2,2}} x_{3}) = (c′_{1,1}b′_{1} − \frac{a′_{1,2}c′_{2,1}}{a′_{2,2}} ) − \frac{a′_{2,1}}{a′_{2,2}} b′_{2}

Sustituyendo en la ecuación 3

0x_{1} + 0x_{2} + (a′_{3,3} − \frac{a′_{3,2}a′_{2,3}}{a′_{2,2}} ) x_{3} = (c′_{3,1} − \frac{a′_{3,2}c′_{2,1}}{a′_{2,2}} ) b′_{1} − \frac{a′_{3,2}}{a′_{2,2}} b′2 + b′3

En forma matricial

[ \begin{matrix}1 & 0 & a′_{1,3} − \frac{a′_{1,2}a′_{2,3}}{a′_{2,2}} \\ 0 & 1 & \frac{a′_{2,3}}{a′_{2,2}} \\ 0 & 0 & a′_{3,3} − \frac{a′_{3,2}a′_{2,3}}{a′_{2,2}} \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}c′_{1,1} − \frac{a′_{1,2}c′_{2,1}}{a′_{2,2}} & \frac{a′_{1,2}}{a′_{2,2}} & 0 \\ \frac{c′_{2,1}}{a′_{2,2}} & \frac{1}{a′_{2,2}} & 0 \\ c′_{3,1} − \frac{a′_{3,2}c′_{2,1}}{a′_{2,2}} & −\frac{a′_{3,2}}{a′_{2,2}} & 1 \end{matrix} ] [ \begin{matrix}b′_{1} \\ b′_{2} \\ b′_{3} \end{matrix} ]

Tercer Paso Dado el sistema equivalente

[ \begin{matrix}1 & 0 & a′′_{1,3} \\ 0 & 1 & a′′_{2,3} \\ 0 & 0 & a′′_{3,3} \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}c′′_{1,1} & c′′_{1,2} & 0 \\ c′′_{2,1} & c′′_{2,2} & 0 \\ c′′_{3,1} & c′′_{3,2} & 1 \end{matrix} ] [ \begin{matrix}b′′_{1} \\ b′′_{2} \\ b′′_{3} \end{matrix} ]

Despejamos x_{3} de la ecuación 3 y sustituimos en la ecuaciones 1 y 2

[ \begin{matrix}1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}c′′_{1,1} & c′′_{1,2} − \frac{a′′_{1,3}c′′_{3,2}}{a′′_{3,3}} & −\frac{a′′_{1,3}}{a′′_{3,3}} \\ c′′_{2,1} & c′′_{2,2} − \frac{a′′_{2,3}}{a′′_{3,3}} & −\frac{a′′_{2,3}}{a′′_{3,3}} \\ \frac{c′′_{3,1}}{a′′_{3,3}} & \frac{c′′_{3,2}}{a′′_{3,3}} & \frac{1}{a′′_{3,3}} \end{matrix} ] [ \begin{matrix}b′′_{1} \\ b′′_{2} \\ b′′_{3} \end{matrix} ]

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

[ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} & ⋯ & a_{1,M} \\ a_{2,1} & a_{2,2} & a_{2,3} & ⋯ & a_{2,M} \\ a_{3,1} & a_{3,2} & a_{3,3} & ⋯ & a_{3,M} \end{matrix} ]

Paso 1 Dividimos la primer ecuación entre a_{1,1}

\frac{1}{a_{1,1}} [ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} & ⋯ & a_{1,M} \\ a_{2,1} & a_{2,2} & a_{2,3} & ⋯ & a_{2,M} \\ a_{3,1} & a_{3,2} & a_{3,3} & ⋯ & a_{3,M} \end{matrix} ]

Multiplicamos la ecuación 1 por a_{2,1} y la restamos a la ecuación 2

a_{2,1} [ \begin{matrix}1 & \frac{a_{1,2}}{a_{1,1}} & \frac{a_{1,3}}{a_{1,1}} & ⋯ & \frac{a_{1,M}}{a_{1,1}} \\ a_{2,1} & a_{2,2} & a_{2,3} & ⋯ & a_{2,M} \\ a_{3,1} & a_{3,2} & a_{3,3} & ⋯ & a_{3,M} \end{matrix} ]

[ \begin{matrix}1 & \frac{a_{1,2}}{a_{1,1}} & \frac{a_{1,3}}{a_{1,1}} & ⋯ & \frac{a_{1,M}}{a_{1,1}} \\ 0 & a_{2,2} − a_{2,1} (\frac{a_{1,2}}{a_{1,1}} ) & a_{2,3} − a_{2,1} (\frac{a_{1,3}}{a_{1,1}} ) & ⋯ & a_{2,M} − a_{2,1} (\frac{a_{1,M}}{a_{1,1}} ) \\ a_{3,1} & a_{3,2} & a_{3,3} & ⋯ & a_{3,M} \end{matrix} ]

Multiplicamos la ecuación 1 por a_{3,1} y la restamos a la ecuación 3

a_{3,1} [ \begin{matrix}1 & \frac{a_{1,2}}{a_{1,1}} & \frac{a_{1,3}}{a_{1,1}} & ⋯ & \frac{a_{1,M}}{a_{1,1}} \\ 0 & a_{2,2} − a_{2,1} (\frac{a_{1,2}}{a_{1,1}} ) & a_{2,3} − a_{2,1} (\frac{a_{1,3}}{a_{1,1}} ) & ⋯ & a_{2,M} − a_{2,1} (\frac{a_{1,M}}{a_{1,1}} ) \\ a_{3,1} & a_{3,2} & a_{3,3} & ⋯ & a_{3,M} \end{matrix} ]

[ \begin{matrix}1 & \frac{a_{1,2}}{a_{1,1}} & \frac{a_{1,3}}{a_{1,1}} & ⋯ & \frac{a_{1,M}}{a_{1,1}} \\ 0 & a_{2,2} − a_{2,1} (\frac{a_{1,2}}{a_{1,1}} ) & a_{2,3} − a_{2,1} (\frac{a_{1,3}}{a_{1,1}} ) & ⋯ & a_{2,M} − a_{2,1} (\frac{a_{1,M}}{a_{1,1}} ) \\ 0 & a_{3,2} − a_{3,1} (\frac{a_{1,2}}{a_{1,1}} ) & a_{3,3} − a_{3,1} (\frac{a_{1,3}}{a_{1,1}} ) & ⋯ & a_{3,M} − a_{3,1} (\frac{a_{1,M}}{a_{1,1}} ) \end{matrix} ]

Paso 2 Dividimos la segunda ecuación entre a_{2,2}

\frac{1}{a_{2,2}} [ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} & ⋯ & a_{1,M} \\ a_{2,1} & a_{2,2} & a_{2,3} & ⋯ & a_{2,M} \\ a_{3,1} & a_{3,2} & a_{3,3} & ⋯ & a_{3,M} \end{matrix} ]

[ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} & ⋯ & a_{1,M} \\ \frac{a_{2,1}}{a_{2,2}} & 1 & \frac{a_{2,3}}{a_{2,2}} & ⋯ & \frac{a_{2,M}}{a_{2,2}} \\ a_{3,1} & a_{3,2} & a_{3,3} & ⋯ & a_{3,M} \end{matrix} ]

Multiplicamos la ecuación 2 por a_{1,2} y la restamos a la primer ecuación

a_{1,2} [ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} & ⋯ & a_{1,M} \\ \frac{a_{2,1}}{a_{2,2}} & 1 & \frac{a_{2,3}}{a_{2,2}} & ⋯ & \frac{a_{2,M}}{a_{2,2}} \\ a_{3,1} & a_{3,2} & a_{3,3} & ⋯ & a_{3,M} \end{matrix} ]

[ \begin{matrix}a_{1,1} − a_{1,2} (\frac{a_{2,1}}{a_{2,2}} ) & 0 & a_{1,3} − a_{1,2} (\frac{a_{2,3}}{a_{2,2}} ) & ⋯ & a_{1,M} − a_{1,2} (\frac{a_{2,M}}{a_{2,2}} ) \\ \frac{a_{2,1}}{a_{2,2}} & 1 & \frac{a_{2,3}}{a_{2,2}} & ⋯ & \frac{a_{2,M}}{a_{2,2}} \\ a_{3,1} & a_{3,2} & a_{3,3} & ⋯ & a_{3,M} \end{matrix} ]

Multiplicamos la ecuación 2 por a_{3,2} y se la restamos a la ecuación 3

a_{3,2} [ \begin{matrix}a_{1,1} − a_{1,2} (\frac{a_{2,1}}{a_{2,2}} ) & 0 & a_{1,3} − a_{1,2} (\frac{a_{2,3}}{a_{2,2}} ) & ⋯ & a_{1,M} − a_{1,2} (\frac{a_{2,M}}{a_{2,2}} ) \\ \frac{a_{2,1}}{a_{2,2}} & 1 & \frac{a_{2,3}}{a_{2,2}} & ⋯ & \frac{a_{2,M}}{a_{2,2}} \\ a_{3,1} & a_{3,2} & a_{3,3} & ⋯ & a_{3,M} \end{matrix} ]

[ \begin{matrix}a_{1,1} − a_{1,2} (\frac{a_{2,1}}{a_{2,2}} ) & 0 & a_{1,3} − a_{1,2} (\frac{a_{2,3}}{a_{2,2}} ) & ⋯ & a_{1,M} − a_{1,2} (\frac{a_{2,M}}{a_{2,2}} ) \\ \frac{a_{2,1}}{a_{2,2}} & 1 & \frac{a_{2,3}}{a_{2,2}} & ⋯ & \frac{a_{2,M}}{a_{2,2}} \\ a_{3,1} − a_{3,2} (\frac{a_{2,1}}{a_{2,2}} ) & 0 & a_{3,3} − a_{3,2} (\frac{a_{2,3}}{a_{2,2}} ) & ⋯ & a_{3,1} − a_{3,2} (\frac{a_{2,M}}{a_{2,2}} ) \end{matrix} ]

Paso 3 Dividimos la tercera ecuación entre a_{3,3}

\frac{1}{a_{3,3}} [ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} & ⋯ & a_{1,M} \\ a_{2,1} & a_{2,2} & a_{2,3} & ⋯ & a_{2,M} \\ a_{3,1} & a_{3,2} & a_{3,3} & ⋯ & a_{3,M} \end{matrix} ]

[ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} & ⋯ & a_{1,M} \\ a_{2,1} & a_{2,2} & a_{2,3} & ⋯ & a_{2,M} \\ \frac{a_{3,1}}{a_{3,3}} & \frac{a_{3,2}}{a_{3,3}} & 1 & ⋯ & \frac{a_{3,M}}{a_{3,3}} \end{matrix} ]

Multiplicamos la ecuación 3 por a_{1,3} y la restamos a la primer ecuación

a_{1,3} [ \begin{matrix}a_{1,1} & a_{1,2} & a_{1,3} & ⋯ & a_{1,M} \\ a_{2,1} & a_{2,2} & a_{2,3} & ⋯ & a_{2,M} \\ \frac{a_{3,1}}{a_{3,3}} & \frac{a_{3,2}}{a_{3,3}} & 1 & ⋯ & \frac{a_{3,M}}{a_{3,3}} \end{matrix} ]

[ \begin{matrix}a_{1,1} − a_{1,3} (\frac{a_{3,1}}{a_{3,3}} ) & a_{1,2} − a_{1,3} (\frac{a_{3,2}}{a_{3,3}} ) & 0 & ⋯ & a_{1,M} − a_{1,3} (\frac{a_{3,M}}{a_{3,3}} ) \\ a_{2,1} & a_{2,2} & a_{2,3} & ⋯ & a_{2,M} \\ \frac{a_{3,1}}{a_{3,3}} & \frac{a_{3,2}}{a_{3,3}} & 1 & ⋯ & \frac{a_{3,M}}{a_{3,3}} \end{matrix} ]

Multiplicamos la ecuación 3 por a_{2,3} y la restamos a la segunda ecuación

a_{2,3} [ \begin{matrix}a_{1,1} − a_{1,3} (\frac{a_{3,1}}{a_{3,3}} ) & a_{1,2} − a_{1,3} (\frac{a_{3,2}}{a_{3,3}} ) & 0 & ⋯ & a_{1,M} − a_{1,3} (\frac{a_{3,M}}{a_{3,3}} ) \\ a_{2,1} & a_{2,2} & a_{2,3} & ⋯ & a_{2,M} \\ \frac{a_{3,1}}{a_{3,3}} & \frac{a_{3,2}}{a_{3,3}} & 1 & ⋯ & \frac{a_{3,M}}{a_{3,3}} \end{matrix} ]

[ \begin{matrix}a_{1,1} − a_{1,3} (\frac{a_{3,1}}{a_{3,3}} ) & a_{1,2} − a_{1,3} (\frac{a_{3,2}}{a_{3,3}} ) & 0 & ⋯ & a_{1,M} − a_{1,3} (\frac{a_{3,M}}{a_{3,3}} ) \\ a_{2,1} − a_{2,3} (\frac{a_{3,1}}{a_{3,3}} ) & a_{2,2} − a_{2,3} (\frac{a_{3,2}}{a_{3,3}} ) & 0 & ⋯ & a_{2,M} − a_{2,3} (\frac{a_{3,M}}{a_{3,3}} ) \\ \frac{a_{3,1}}{a_{3,3}} & \frac{a_{3,2}}{a_{3,3}} & 1 & ⋯ & \frac{a_{3,M}}{a_{3,3}} \end{matrix} ]

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.

3x_{1} − 0.1x_{2} − 0.2x_{3} = 7.85
0.1x_{1} + 7x_{2} − 0.3x_{3} = −19.3
0.3x_{1} − 0.2x_{2} + 10x_{3} = 71.4

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

[ \begin{matrix}3.0000 & −0.1000 & −0.2000 & 1.0000 & 0.0000 & 0.0000 & 7.8500 \\ 0.1000 & 7.0000 & −0.3000 & 0.0000 & 1.0000 & 0.0000 & −19.3000 \\ 0.3000 & −0.2000 & 10.0000 & 0.0000 & 0.0000 & 1.0000 & 71.4000 \end{matrix} ]

Luego se normaliza el primer renglón, al dividirlo entre el elemento pivote, 3, se obtiene

[ \begin{matrix}1.0000 & −0.0333 & −0.0667 & 0.3333 & 0 & 0 & 2.6167 \\ 0.1000 & 7.0000 & −0.3000 & 0 & 1 & 0 & −19.3000 \\ 0.3000 & −0.2000 & 10.0000 & 0 & 0 & 1 & 71.4000 \end{matrix} ]

El término x_{1} se puede eliminar del segundo renglón restando 0.1 veces el primer renglón del segúndo. En forma similar restando 0.3 veces el primer renglón del tercero eliminará el término x_{1} del tercer renglón

[ \begin{matrix}1.0000 & −0.0333 & −0.0667 & 0.3333 & 0 & 0 & 2.6167 \\ 0 & 7.0033 & −0.2933 & −0.0333 & 1.0000 & 0 & −19.5617 \\ 0 & −0.1900 & 10.0200 & −0.1000 & 0 & 1.0000 & 70.6150 \end{matrix} ]

En seguida, se normaliza el segundo renglón dividiéndolo entre 7.0033

[ \begin{matrix}1.0000 & −0.0333 & −0.0667 & 0.3333 & 0 & 0 & 2.6167 \\ 0 & 1.0000 & −0.0419 & −0.0048 & 0.1428 & 0 & −2.7932 \\ 0 & −0.1900 & 10.0200 & −0.1000 & 0 & 1.0000 & 70.6150 \end{matrix} ]

Al reducir los términos x_{2} de las ecuaciones 1 y 2 tenemos

[ \begin{matrix}1.0000 & 0 & −0.0681 & 0.3332 & 0.0048 & 0 & 2.5236 \\ 0 & 1.0000 & −0.0419 & −0.0048 & 0.1428 & 0 & −2.7932 \\ 0 & 0 & 10.0120 & −0.1009 & 0.0271 & 1.0000 & 70.0843 \end{matrix} ]

El tercer renglón se normaliza entonces al dividirlo entre 10.0120

[ \begin{matrix}1.0000 & 0 & −0.0681 & 0.3332 & 0.0048 & 0 & 2.5236 \\ 0 & 1.0000 & −0.0419 & −0.0048 & 0.1428 & 0 & −2.7932 \\ 0 & 0 & 1.0000 & −0.0101 & 0.0027 & 0.0999 & 7.0000 \end{matrix} ]

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

[ \begin{matrix}1 & 0 & 0 & 0.3325 & 0.0049 & 0.0068 & 3.0000 \\ 0 & 1 & 0 & −0.0052 & 0.1429 & 0.0042 & −2.5000 \\ 0 & 0 & 1 & −0.0101 & 0.0027 & 0.0999 & 7.0000 \end{matrix} ]

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);
Ainv = B(:, (N+1):(N+N));

Como resultado tenemos en primer termino la matriz identidad resultado de las eliminaciones, en segundo lugar la matriz inversa y finalmente la solución del sistema de ecuaciones.

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

[ \begin{matrix}1 & 1 & 2 \\ 1 & 3 & −6 \\ 2 & −1 & 2 \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \end{matrix} ] = [ \begin{matrix}−1 \\ 7 \\ 0 \end{matrix} ]

La matriz aumentada para este sistema es:

[ \begin{matrix}1 & 1 & 2 & −1 \\ 1 & 3 & −6 & 7 \\ 2 & −1 & 2 & 0 \end{matrix} ]

Primer iteración

[ \begin{matrix}1 & 1 & 2 & −1 \\ 0 & 2 & −8 & 8 \\ 0 & −3 & −2 & 2 \end{matrix} ]

Segunda iteración

[ \begin{matrix}1 & 0 & 6 & −5 \\ 0 & 1 & −4 & 4 \\ 0 & 0 & −14 & 14 \end{matrix} ]

Tercer iteración

[ \begin{matrix}1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & −1 \end{matrix} ]

Ejemplo 3 Dado el sistema lineal de ecuaciones, calcular la solución y la matriz inversa utilizando el método de Gauss-Jordan

[ \begin{matrix}10 & −1 & 2 & 1 \\ −1 & 15 & −3 & 1 \\ 2 & −3 & 6 & −3 \\ 1 & 1 & −3 & 7 \end{matrix} ] [ \begin{matrix}x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{matrix} ] = [ \begin{matrix}1 \\ 2 \\ 2 \\ 1 \end{matrix} ]

96 SISTEMAS DE ECUACIONES El sistema inicial aumentado es

[ \begin{matrix}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 \end{matrix} ]

Primer iteración

[ \begin{matrix}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 \end{matrix} ]

Segunda iteración

[ \begin{matrix}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 \end{matrix} ]

Tercer iteración

[ \begin{matrix}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 \end{matrix} ]

Cuarta iteración

[ \begin{matrix}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 \end{matrix} ]

>> [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

4.2. Métodos para sistemas no lineales

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

f_{1}(x_{1}, x_{2}, ⋯, x_{n}) = 0
f_{2}(x_{1}, x_{2}, ⋯, x_{n}) = 0
⋮ = ⋮
f_{n}(x_{1}, x_{2}, ⋯, x_{n}) = 0

donde n es el número de ecuaciones y se tiene el mismo números de funciones f_{i} que variables x_{i}. 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

f_{1}(x_{1}, x_{2}, ⋯, x_{n}) = 0
f_{2}(x_{1}, x_{2}, ⋯, x_{n}) = 0
⋮ = ⋮
f_{n}(x_{1}, x_{2}, ⋯, x_{n}) = 0

El método de iteración de punto fijo intentara despejar de cada una de la las ecuaciones f_{i}(x_{1}, x_{2}, ⋯, x_{n}) la i-esima variable tal que

x_{1} − g_{1}(x_{1}, x_{2}, ⋯, x_{n}) = f_{1}(x_{1}, x_{2}, ⋯, x_{n})
x_{2} − g_{2}(x_{1}, x_{2}, ⋯, x_{n}) = f_{2}(x_{1}, x_{2}, ⋯, x_{n})
⋮ = ⋮
x_{n} − g_{n}(x_{1}, x_{2}, ⋯, x_{n}) = f_{n}(x_{1}, x_{2}, ⋯, x_{n})

Para resolver de manera iterativa

x_{1}^{(t+1)} = g_{1}(x_{1}^{(t)}, x_{2}^{(t)}, ⋯, x_{n}^{(t)})
x_{2}^{(t+1)} = g_{2}(x_{1}^{(t)}, x_{2}^{(t)}, ⋯, x_{n}^{(t)})
⋮ = ⋮
x_{n}^{(t+1)} = g_{n}(x_{1}^{(t)}, x_{2}^{(t)}, ⋯, x_{n}^{(t)})

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 ecuaciones dado. Considere como valores iniciales x_{1}^{(0)} = 1.5 y x_{2}^{(0)} = 3.5.

x_{1}^{2} + x_{1}x_{2} − 10 = 0
x_{2} + 3x_{1}x_{2}^{2} − 57 = 0

De acuerdo con lo descrito despejamos x_{1} y x_{2}

f_{1}(x_{1}, x_{2}) = x_{1} − \sqrt{10 − x_{1}x_{2}}
f_{2}(x_{1}, x_{2}) = x_{2} − \sqrt{\frac{57 − x_{2}}{3x_{1}}}

Despejando tenemos el siguiente sistema iterativo de ecuaciones

x_{1}^{(t+1)} = \sqrt{10 − x_{1}^{(t)}x_{2}^{(t)}}
x_{2}^{(t+1)} = \sqrt{\frac{57 − x_{2}^{(t)}}{3x_{1}^{(t+1)}}}

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

x_{1}^{(1)} = \sqrt{10 − x_{1}^{(0)}x_{2}^{(0)}} = \sqrt{10 − (1.5)(3.5)} = 2.1794
x_{2}^{(1)} = \sqrt{\frac{57 − x_{2}^{(0)}}{3x_{1}^{(1)}}} = \sqrt{\frac{57 − (3.5)}{3(2.1794)}} = 2.8605

Iteración 2 Con x^{(1)} = [2.1794, 2.8605]^{T} tenemos

x_{1}^{(2)} = \sqrt{10 − x_{1}^{(1)}x_{2}^{(1)}} = \sqrt{10 − (2.1794)(2.8605)} = 1.9405
x_{2}^{(2)} = \sqrt{\frac{57 − x_{2}^{(0)}}{3x_{1}^{(1)}}} = \sqrt{\frac{57 − (2.8605)}{3(1.9405)}} = 3.0496

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.

\begin{matrix}k & x_{1}^{(k)} & x_{2}^{(k)} \\ 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 \end{matrix}

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 ecuaciones dado. Considere como valores iniciales x_{1}^{(0)} = 0.0 y x_{2}^{(0)} = 1.0.

x_{1}^{2} − 2x_{1} − x_{2} + 0.5 = 0
x_{1}^{2} + 4x_{2}^{2} − 4 = 0

De acuerdo con lo descrito despejamos x_{1} y x_{2}

f_{1}(x_{1}, x_{2}) = x_{1} − \sqrt{2x_{1} + x_{2} − 0.5}
f_{2}(x_{1}, x_{2}) = x_{2} − \sqrt{\frac{4 − x_{1}^{2}}{4}}

Despejando tenemos el siguiente sistema iterativo de ecuaciones

x_{1}^{(t+1)} = \sqrt{2x_{1}^{(t)} + x_{2}^{(t)} − 0.5}
x_{2}^{(t+1)} = \sqrt{\frac{4 − (x_{1}^{(t+1)})^{2}}{4}}

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

x_{1}^{(1)} = \sqrt{2x_{1}^{(0)} + x_{2}^{(0)} − 0.5} = \sqrt{2(0) + (1) − 0.5} = 0.7071
x_{2}^{(1)} = \sqrt{\frac{4 − (x_{1}^{(1)})^{2}}{4}} = \sqrt{\frac{4 − (0.7071)^{2}}{4}} = 0.9354

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

x_{1}^{(2)} = \sqrt{2x_{1}^{(1)} + x_{2}^{(1)} − 0.5} = \sqrt{2(0.7071) + (0.9354) − 0.5} = 1.3600
x_{2}^{(2)} = \sqrt{\frac{4 − (x_{1}^{(2)})^{2}}{4}} = \sqrt{\frac{4 − (1.3600)^{2}}{4}} = 0.7332

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.

\begin{matrix}k & x_{1}^{(k)} & x_{2}^{(k)} \\ 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 \end{matrix}

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

f_{1}(x_{1}, x_{2}, ⋯, x_{n}) = 0
f_{2}(x_{1}, x_{2}, ⋯, x_{n}) = 0
⋮ = ⋮
f_{n}(x_{1}, x_{2}, ⋯, x_{n}) = 0

Utilizando la serie de Taylor podemos hacer una aproximación lineal para una función f_{i}(x_{1}^{(t)}+δx_{1}^{(t)}, x_{2}^{(t)}+δx_{2}^{(t)}, ⋯, x_{n}^{(t)}+δx_{n}^{(t)}) en un incremento δx_{i}^{(t)} = x_{i}^{(t+1)}−x_{i}^{(t)} como:

f_{1}(x_{1}^{(t)} + δx_{1}^{(t)}, x_{2}^{(t)} + δx_{2}^{(t)}, ⋯, x_{n}^{(t)} + δx_{n}^{(t)})

= f_{1}(x_{1}^{(t)}, x_{2}^{(t)} + ⋯, +x_{n}^{(t)}) + \frac{∂f_{1}}{∂x_{1}} δx_{1}^{(t)} + \frac{∂f_{1}}{∂x_{2}} δx_{2}^{(t)} + ⋯ + \frac{∂f_{1}}{∂x_{n}} δx_{n}^{(t)}

f_{2}(x_{1}^{(t)} + δx_{1}^{(t)}, x_{2}^{(t)} + δx_{2}^{(t)}, ⋯, x_{n}^{(t)} + δx_{n}^{(t)})

= f_{2}(x_{1}^{(t)}, x_{2}^{(t)} + ⋯, +x_{n}^{(t)}) + \frac{∂f_{2}}{∂x_{1}} δx_{1}^{(t)} + \frac{∂f_{2}}{∂x_{2}} δx_{2}^{(t)} + ⋯ + \frac{∂f_{2}}{∂x_{n}} δx_{n}^{(t)}

⋮

f_{n}(x_{1}^{(t)} + δx_{1}^{(t)}, x_{2}^{(t)} + δx_{2}^{(t)}, ⋯, x_{n}^{(t)} + δx_{n}^{(t)})

= f_{n}(x_{1}^{(t)}, x_{2}^{(t)} + ⋯, +x_{n}^{(t)}) + \frac{∂f_{n}}{∂x_{1}} δx_{1}^{(t)} + \frac{∂f_{n}}{∂x_{2}} δx_{2}^{(t)} + ⋯ + \frac{∂f_{n}}{∂x_{n}} δx_{n}^{(t)}

Si escribimos el sistema en forma matricial tenemos

[ f_{1}(x_{1}^{(t)} + δx_{1}^{(t)}, x_{2}^{(t)} + δx_{2}^{(t)}, ⋯, x_{n}^{(t)} + δx_{n}^{(t)}) ; f_{2}(x_{1}^{(t)} + δx_{1}^{(t)}, x_{2}^{(t)} + δx_{2}^{(t)}, ⋯, x_{n}^{(t)} + δx_{n}^{(t)}) ; ⋮ ; f_{n}(x_{1}^{(t)} + δx_{1}^{(t)}, x_{2}^{(t)} + δx_{2}^{(t)}, ⋯, x_{n}^{(t)} + δx_{n}^{(t)}) ] =

[ f_{1}(x_{1}^{(t)}, x_{2}^{(t)}, ⋯, x_{n}^{(t)}) ; f_{2}(x_{1}^{(t)}, x_{2}^{(t)}, ⋯, x_{n}^{(t)}) ; ⋮ ; f_{n}(x_{1}^{(t)}, x_{2}^{(t)}, ⋯, x_{n}^{(t)}) ] + [ \begin{matrix}\frac{∂f_{1}(x)}{∂x_{1}} & \frac{∂f_{1}(x)}{∂x_{2}} & ⋯ & \frac{∂f_{1}(x)}{∂x_{n}} \\ \frac{∂f_{2}(x)}{∂x_{1}} & \frac{∂f_{2}(x)}{∂x_{2}} & ⋯ & \frac{∂f_{2}(x)}{∂x_{n}} \\ ⋮ & ⋮ & ⋯ & ⋮ \\ \frac{∂f_{n}(x)}{∂x_{1}} & \frac{∂f_{n}(x)}{∂x_{2}} & ⋯ & \frac{∂f_{n}(x)}{∂x_{n}} \end{matrix} ] [ δx_{1}^{(t)} ; δx_{2}^{(t)} ; ⋮ ; δx_{n}^{(t)} ]

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

x^{(t+1)} = x^{(t)} − [J(x^{(t)})]^{−1} 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;
end;
r = x2;

Ejemplo 1

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

f_{1}(x_{1}, x_{2}) = x_{1}^{2} + x_{1}x_{2} − 10
f_{2}(x_{1}, x_{2}) = x_{2} + 3x_{1}x_{2}^{2} − 57

El Jacobiano es

J(x) = [ \begin{matrix}2x_{1} + x_{2} & x_{1} \\ 3x_{2}^{2} & 1 + 6x_{1}x_{2} \end{matrix} ]

y el arreglo de funciones

f(x) = [ \begin{matrix}x_{1}^{2} + x_{1}x_{2} − 10 \\ x_{2} + 3x_{1}x_{2}^{2} − 57 \end{matrix} ]

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

4.2. MÉTODOS PARA SISTEMAS NO LINEALES 105

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

[ \begin{matrix}x_{1}^{(1)} \\ x_{2}^{(1)} \end{matrix} ] = [ \begin{matrix}1.5000 \\ 3.5000 \end{matrix} ] − [ \begin{matrix}6.5000 & 1.5000 \\ 36.7500 & 32.5000 \end{matrix} ]^{−1} [ \begin{matrix}−2.5000 \\ 1.6250 \end{matrix} ] = [ \begin{matrix}2.0360 \\ 2.8439 \end{matrix} ]

Segunda iteración

[ \begin{matrix}x_{1}^{(2)} \\ x_{2}^{(2)} \end{matrix} ] = [ \begin{matrix}2.0360 \\ 2.8439 \end{matrix} ] − [ \begin{matrix}6.9159 & 2.0360 \\ 24.2629 & 35.7413 \end{matrix} ]^{−1} [ \begin{matrix}−0.0644 \\ −4.7562 \end{matrix} ] = [ \begin{matrix}1.9987 \\ 3.0023 \end{matrix} ]

Tercer iteración

[ \begin{matrix}x_{1}^{(3)} \\ x_{2}^{(3)} \end{matrix} ] = [ \begin{matrix}1.9987 \\ 3.0023 \end{matrix} ] − [ \begin{matrix}6.9997 & 1.9987 \\ 27.0412 & 37.0041 \end{matrix} ]^{−1} [ \begin{matrix}−0.0045 \\ 0.0496 \end{matrix} ] = [ \begin{matrix}2.0000 \\ 3.0000 \end{matrix} ]

Cuarta iteración

[ \begin{matrix}x_{1}^{(4)} \\ x_{2}^{(4)} \end{matrix} ] = [ \begin{matrix}2.0000 \\ 3.0000 \end{matrix} ] − [ \begin{matrix}7.0000 & 2.0000 \\ 27.0000 & 37.0000 \end{matrix} ]^{−1} [ \begin{matrix}−0.00000129 \\ −0.00002214 \end{matrix} ] = [ \begin{matrix}2.0000 \\ 3.0000 \end{matrix} ]

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);
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 4.2. MÉTODOS PARA SISTEMAS NO LINEALES 107

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

f_{1}(x_{1}, x_{2}) = x_{1}^{2}–2x_{1}–x_{2} + 0.5
f_{2}(x_{1}, x_{2}) = x_{1}^{2} + 4x_{2}^{2}–4

El Jacobiano es

J(x) = [ \begin{matrix}2x_{1} − 2 & −1 \\ 2x_{1} & 8x_{2} \end{matrix} ]

y el arreglo de funciones

f(x) = [ \begin{matrix}x_{1}^{2}–2x_{1}–x_{2} + 0.5 \\ x_{1}^{2} + 4x_{2}^{2}–4 \end{matrix} ]

Considerando como valores iniciales x^{(0)} = [0, 1]^{T} tenemos: Primer iteración

[ \begin{matrix}x_{1}^{(1)} \\ x_{2}^{(1)} \end{matrix} ] = [ \begin{matrix}0 \\ 1 \end{matrix} ] − [ \begin{matrix}−2 & −1 \\ 0 & 8 \end{matrix} ]^{−1} [ \begin{matrix}−0.5 \\ 0.0 \end{matrix} ] = [ \begin{matrix}−0.25 \\ 1.00 \end{matrix} ]

Segunda iteración

[ \begin{matrix}x_{1}^{(2)} \\ x_{2}^{(2)} \end{matrix} ] = [ \begin{matrix}−0.2500 \\ 1.0000 \end{matrix} ] − [ \begin{matrix}2.5000 & −1.0000 \\ −0.5000 & 8.0000 \end{matrix} ]^{−1} [ \begin{matrix}0.0625 \\ 0.0625 \end{matrix} ] = [ \begin{matrix}−0.2226 \\ 0.9939 \end{matrix} ]

Tercer iteración

[ \begin{matrix}x_{1}^{(3)} \\ x_{2}^{(3)} \end{matrix} ] = [ \begin{matrix}−0.2226 \\ 0.9939 \end{matrix} ] − [ \begin{matrix}−2.4451 & −1.0000 \\ −0.4451 & 7.9512 \end{matrix} ]^{−1} [ \begin{matrix}−0.0008 \\ 0.0009 \end{matrix} ] = [ \begin{matrix}−0.2222 \\ 0.9938 \end{matrix} ]

Cuarta iteración

[ \begin{matrix}x_{1}^{(4)} \\ x_{2}^{(4)} \end{matrix} ] = [ \begin{matrix}−0.2222 \\ 0.9938 \end{matrix} ] − [ \begin{matrix}−2.4444 & −1.0000 \\ −0.4444 & 7.9505 \end{matrix} ]^{−1} [ \begin{matrix}−0.00002300 \\ 0.00000038 \end{matrix} ] = [ \begin{matrix}−0.2222 \\ 0.9938 \end{matrix} ]

La implementación en Matlab para este ejemplo son:

Para la función tenemos

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.

Figura 4.12: Circuito eléctrico de dos mallas

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

V_{1} − R_{1}(i_{1} + i_{2}) − L_{1}/i_{1} = 0
V_{1} − R_{1}(i_{1} + i_{2}) − R_{2}i_{2} − L_{2}/i_{2} = 0

Reorganizando las funciones tenemos

F = [ \begin{matrix}V i_{1} − R_{1}(i_{1} + i_{2})i_{1} − L_{1} \\ V i_{2} − R_{1}(i_{1} + i_{2})i_{2} − R_{2}i_{2}^{2} − L_{2} \end{matrix} ] = 0

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:

J = [ \begin{matrix}V − R_{1}(2i_{1} + i_{2}) & −i_{1}R_{1} \\ −i_{2}R1 & V_{1} − R_{1}(i_{1} + 2i_{2}) − 2R_{2}i_{2} \end{matrix} ]

function J = JacSistema(i)
V = 100;
R1 = 2;
R2 = 3;
%L1 = 100;
%L2 = 200;
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

    1.0728
    2.3185

Potencia de la fuente P_{V} = V (i_{1} + i_{2}) = 100(1.0728 + 2.3185) = +339.1282 Potencia consumida por R_{1} es P_{R_{1}} = −R_{1}(i_{1} + i_{2})^{2} = −2(1.0728 + 2.3185)^{2} = −23.0016 Potencia consumida por R_{2} es P_{R_{1}} = −R_{2}i_{2}^{2} = −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) = x^{10}–1.

La solución utilizando el método de Newton-Raphson queda:

x^{(k+1)} = x^{(k)} − \frac{f(x^{(k)})}{f′(x^{(k+1)})}

Sustituyendo valores tenemos

x^{(k+1)} = x^{(k)} − \frac{(x^{(k)})^{10} − 1}{10 (x^{(k)})^{9}}

Y la solución numérica es:

\begin{matrix}x^{(k)} & f(x^{(k)}) & f′(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 \end{matrix}

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 [?]).

l_{0} = l_{1} + l_{2}  (5.9)

\frac{l_{1}}{l_{0}} = \frac{l_{2}}{l_{1}}  (5.10)

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

\frac{l_{1}}{l_{1} + l_{2}} = \frac{l_{2}}{l_{1}}  (5.11)

Definimos R = \frac{l_{2}}{l_{1}} y sustituimos en la ecuación 5.11 para obtener R^{2} + R − 1, cuya solución

positiva es R = \frac{\sqrt{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;

Algoritmo 1 Algoritmo de Búsqueda con Razón Dorada Entrada: x_{u}, x_{l}, f(x) Salida: x

mientras x_{u} − x_{l} > T ol hacer d = R(x_{u} − x_{l}) x_{1} = x_{l} + d x_{2} = x_{u} − d k = k + 1 si f(x_{1}) < f(x_{2}) entonces

x_{l} = x_{2} si no

x_{u} = x_{1} fin si

fin mientras si f(x_{1}) < f(x_{2}) entonces

devolver x_{1} si no

devolver x_{2} 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 DORADA115

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) = −2seno(x) + \frac{x^{2}}{10} en el intervalo [0,4]. Los resultados de este ejemplo se muestran en la siguiente tabla

\begin{matrix}k & x_{l} & f_{l} & x_{2} & f_{2} & x_{1} & f_{1} & x_{u} & f_{u} & 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 \end{matrix}

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

Use la búsqueda de la sección dorada para encontrar el mínimo de la función f(x) = −xe^{−x^{2}} en el intervalo [0,4]. Los resultados de este ejemplo se muestran en la siguiente tabla

\begin{matrix}k & x_{l} & f_{l} & x_{2} & f_{2} & x_{1} & f_{1} & x_{u} & f_{u} \\ 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 \end{matrix}

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

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 : ℝ → ℝ es de clase dos, es decir que la segunda derivada puede ser calculada. La idea consiste en reemplazar en la vecindad del punto x^{k} de la función f por una aproximación cuadrática q(x) dada por

q(x) = f(x^{(k)}) + f′(x^{(k)})(x − x^{(k)}) + \frac{1}{2}f′′(x^{(k)})(x − x^{(k)})^{2}

llamaremos a x^{(k+1)} el mínimo de q(x). Para calcularlo, es necesario que la matriz f′′(x^{(k)}) sea positivo. 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)}) = −f′′(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

x^{(k+1)} = x^{(k)} − \frac{f′(x^{(k)})}{f′′(x^{(k)})}  (5.12)

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

Algoritmo 2 Algoritmo de Newton Unidimensional Entrada: f(x), x_{0} Salida: x^{(k)}

mientras ∥f′(x^{(k)})∥ ≥ ε hacer x^{(k+1)} = x^{(k)} − \frac{f′(x^{(k)})}{f′′(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

Calcular el máximo de la función f(x) = −2seno(x) + \frac{x^{2}}{10} utilizando el método de Newton con un valor inicial x_{0} = 0.5.

Para resolver tenemos que calcular f′(x) y f′′(x)

f′(x) = \frac{x}{5} − 2cos(x)

f′′(x) = \frac{1}{5} + 2sin(x)

Para resolver hacemos

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

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

Dada la función f(x) = −xe^{−x^{2}}, calcular el mínimo utilizando el método de Newton para un valor inicial x_{0} = −1.0. Para resolver tenemos que calcular f′(x) y f′′(x)

f′(x) = (2x^{2} − 1)e^{−x^{2}}

f′′(x) = (6x − 4x^{3})e^{−x^{2}}

Para soluciona hacemos

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

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 x^{k} de la función f por una aproximación cuadrática q(x) dada por

q(x) = f(x^{(k)}) + ∇f^{T} (x^{(k)})(x − x^{(k)}) + \frac{1}{2}(x − x^{(k)})^{T} ∇^{2}f(x^{(k)})(x − x^{(k)})

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)}. Llamaremos 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 x_{k+1} es el mínimo, lo cual da lugar a la recurrencia

x^{(k+1)} = x^{(k)} − [∇^{2}f(x^{(k)})]^{−1} ∇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 x_{0} Salida: x^{(k)}

mientras (∥∇f(x^{(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.5. Ejemplo 1

Minimizar es f(x) = x_{1}e^{−x_{1}^{2}−x_{2}^{2}}, con un punto inicial x_{1}^{(0)} = −0.5, x_{2}^{(0)} = −0.1 aplicando el Método de Newton.

El vector gradiente para esta función es:

∇f(x_{1}, x_{2}) = [ \begin{matrix}(1 − 2x_{1}^{2})e^{(−x_{1}^{2}−x_{2}^{2})} \\ −2x_{1}x_{2}e^{(−x_{1}^{2}−x_{2}^{2})} \end{matrix} ]

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}f(x_{1}, x_{2}) = [ \begin{matrix}(−6x_{1} + 4x_{1}^{3})e^{(−x_{1}^{2}−x_{2}^{2})} & (−2x_{2} + 4x_{1}^{2}x_{2})e^{(−x_{1}^{2}−x_{2}^{2})} \\ (−2x_{2} + 4x_{1}^{2}x_{2})e^{(−x_{1}^{2}−x_{2}^{2})} & (−2x_{1} + 4x_{1}x_{2}^{2})e^{(−x_{1}^{2}−x_{2}^{2})} \end{matrix} ]

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

[ \begin{matrix}x_{1}^{(1)} \\ x_{2}^{(1)} \end{matrix} ] = [ \begin{matrix}−0.5000 \\ −0.1000 \end{matrix} ] − [ \begin{matrix}1.9276 & 0.0771 \\ 0.0771 & 0.7556 \end{matrix} ]^{−1} [ \begin{matrix}0.3855 \\ −0.0771 \end{matrix} ] = [ \begin{matrix}−0.7049 \\ 0.0230 \end{matrix} ]

[ \begin{matrix}x_{1}^{(2)} \\ x_{2}^{(2)} \end{matrix} ] = [ \begin{matrix}−0.7049 \\ 0.0230 \end{matrix} ] − [ \begin{matrix}1.7199 & −0.0002 \\ −0.0002 & 0.8564 \end{matrix} ]^{−1} [ \begin{matrix}0.0038 \\ 0.0197 \end{matrix} ] = [ \begin{matrix}−0.7071 \\ −0.0000 \end{matrix} ]

Tercer iteración

[ \begin{matrix}x_{1}^{(3)} \\ x_{2}^{(3)} \end{matrix} ] = [ \begin{matrix}−0.7071 \\ −0.0000 \end{matrix} ] − [ \begin{matrix}1.7155 & 0.0000 \\ 0.0000 & 0.8578 \end{matrix} ]^{−1} [ \begin{matrix}0.0180 \\ −0.2114 \end{matrix} ] × 10^{−4} = [ \begin{matrix}−0.7071 \\ −0.0000 \end{matrix} ]

En la siguiente tabla se muestra como la función f(x) disminuye su valor en el proceso de convergencia

\begin{matrix}k & f(x^{(k)}) \\ 0 & -0.3855 \\ 1 & -0.4287 \\ 2 & -0.4289 \\ 3 & -0.4289 \end{matrix}

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

(a) Funsión  (b) Curvas de Nivel

Figura 5.13: Mínimo para la función f(x_{1}, x_{2}) = x_{1}e^{(−x_{1}^{2}−x_{2}^{2})}

5.2.6. Ejemplo 2

Minimizar es f(x) = −3.5x_{1} − 2x_{2} − x_{2}^{2} + x_{1}^{4} + 2x_{1}x_{2} + x_{2}^{4}, con un punto inicial x_{1}^{(0)} = 1.0, x_{2}^{(0)} = 1.0 aplicando el Método de Newton.

El vector gradiente para esta función es:

∇f(x_{1}, x_{2}) = [ \begin{matrix}−3.5 + 4x_{1}^{3} + 2x_{2} \\ −2 + 2x_{1} − 2x_{2} + 4x_{2}^{3} \end{matrix} ]

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:

∇^{2}f(x_{1}, x_{2}) = [ \begin{matrix}12x_{1}^{2} & 2 \\ 2 & −2 + 12x_{2}^{2} \end{matrix} ]

function H = Hessiano_f2(x)
n = length(x);
H = zeros(n, 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

[ \begin{matrix}x_{1}^{(1)} \\ x_{2}^{(1)} \end{matrix} ] = [ \begin{matrix}1 \\ 1 \end{matrix} ] − [ \begin{matrix}12 & 2 \\ 2 & 10 \end{matrix} ]^{−1} [ \begin{matrix}2.5000 \\ 2.0000 \end{matrix} ] = [ \begin{matrix}0.8190 \\ 0.8362 \end{matrix} ]

Segunda iteración

[ \begin{matrix}x_{1}^{(2)} \\ x_{2}^{(2)} \end{matrix} ] = [ \begin{matrix}0.8190 \\ 0.8362 \end{matrix} ] − [ \begin{matrix}8.0485 & 2.0000 \\ 2.0000 & 6.3909 \end{matrix} ]^{−1} [ \begin{matrix}0.3695 \\ 0.3044 \end{matrix} ] = [ \begin{matrix}0.7820 \\ 0.8001 \end{matrix} ]

Tercer iteración

[ \begin{matrix}x_{1}^{(3)} \\ x_{2}^{(3)} \end{matrix} ] = [ \begin{matrix}0.7820 \\ 0.8001 \end{matrix} ] − [ \begin{matrix}7.3385 & 2.0000 \\ 2.0000 & 5.6828 \end{matrix} ]^{−1} [ \begin{matrix}0.0132 \\ 0.0129 \end{matrix} ] = [ \begin{matrix}0.7807 \\ 0.7983 \end{matrix} ]

cuarta iteración

[ \begin{matrix}x_{1}^{(4)} \\ x_{2}^{(4)} \end{matrix} ] = [ \begin{matrix}0.7807 \\ 0.7983 \end{matrix} ] − [ \begin{matrix}7.3139 & 2.0000 \\ 2.0000 & 5.6483 \end{matrix} ]^{−1} [ \begin{matrix}0.1610 \\ 0.3115 \end{matrix} ] × 10^{−4} = [ \begin{matrix}0.7807 \\ 0.7983 \end{matrix} ]

En la siguiente tabla se muestra como la función f(x) disminuye su valor en el proceso de convergencia

\begin{matrix}k & f(x^{(k)}) \\ 0 & -2.5000 \\ 1 & -2.9296 \\ 2 & -2.9422 \\ 3 & -2.9423 \end{matrix}

Para ejecutar dar

>> Newton(@Gradiente_f2, @Hessiano_f2, [1;1])
ans =

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

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

f(x) = \frac{1}{2}x^{T} Ax + x^{T} b + c

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) = 10x_{1}^{2} + x_{2}^{2} 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:

∇f(x) = \begin{matrix}20x_{1} \\ 2x_{2} \end{matrix}

y el Hessiano es:

A(x) = 20 0 0 2

Aplicando la ecuación 5.13 tenemos

x^{(1)} = 1 2 − 20 0 0 2 ^{−1} 20 4 = 0 0

5.2.9. Ejemplo 4

Minimizar es f(x) = x_{1}e^{−x_{1}^{2}−x_{2}^{2}}, con un punto inicial x_{1}^{(0)} = −0.5, x_{2}^{(0)} = −0.5 aplicando el Método de Newton.

Primer iteración

[ \begin{matrix}x_{1}^{(1)} \\ x_{2}^{(1)} \end{matrix} ] = [ \begin{matrix}−0.5000 \\ −0.5000 \end{matrix} ] − [ \begin{matrix}1.5163 & 0.3033 \\ 0.3033 & 0.3033 \end{matrix} ]^{−1} [ \begin{matrix}0.3033 \\ −0.3033 \end{matrix} ] = [ \begin{matrix}−1.0000 \\ 1.0000 \end{matrix} ]

[ \begin{matrix}x_{1}^{(2)} \\ x_{2}^{(2)} \end{matrix} ] = [ \begin{matrix}−1.0000 \\ 1.0000 \end{matrix} ] − [ \begin{matrix}0.2707 & 0.2707 \\ 0.2707 & −0.2707 \end{matrix} ]^{−1} [ \begin{matrix}−0.1353 \\ 0.2707 \end{matrix} ] = [ \begin{matrix}−1.2500 \\ 1.7500 \end{matrix} ]

Tercer iteración

[ \begin{matrix}x_{1}^{(3)} \\ x_{2}^{(3)} \end{matrix} ] = [ \begin{matrix}−1.2500 \\ 1.7500 \end{matrix} ] − [ \begin{matrix}−0.0031 & 0.0729 \\ 0.0729 & −0.1256 \end{matrix} ]^{−1} [ \begin{matrix}−0.0208 \\ 0.0429 \end{matrix} ] = [ \begin{matrix}−1.3535 \\ 2.0314 \end{matrix} ]

Cuarta iteración

[ \begin{matrix}x_{1}^{(4)} \\ x_{2}^{(4)} \end{matrix} ] = [ \begin{matrix}−1.3535 \\ 2.0314 \end{matrix} ] − [ \begin{matrix}−0.0046 & 0.0280 \\ 0.0280 & −0.0507 \end{matrix} ]^{−1} [ \begin{matrix}−0.0069 \\ 0.0142 \end{matrix} ] = [ \begin{matrix}−1.4416 \\ 2.2629 \end{matrix} ]

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

\begin{matrix}k & x_{1}^{(k)} & x_{2}^{(k)} & 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 \end{matrix}

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.

Figura 5.15: Función f(x) = x_{1}e^{−x_{1}^{2}−x_{2}^{2}}.

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′(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

\begin{matrix}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 \end{matrix}

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 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 x_{k}, el tamaño de paso puede ser controlado a través de una formula iterativa de tipo:

x^{(k+1)} = x^{(k)} − λ^{(k)} [∇^{2}f(x^{(k)})]^{−1} ∇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:

d^{(k)} = − [∇^{2}f(x^{(k)})]^{−1} ∇f(x^{(k)})

5.2.11. Ejemplo 5

Minimizar f(x) = \frac{(x−3)^{5}}{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)

u′(x) = \frac{f′(x)}{f′′(x)}

Se puede mostrar que esta función tiene las mismas raíces que f′(x) y que la multiplicidad de raíces no afectará. La formulación del método de Newton es:

x_{k+1} = x_{k} − \frac{u′(x)}{u′′(x)}

La derivada de u′(x) es:

u′′(x) = \frac{f′′(x)f′′(x) − f′(x)f′′′(x)}{[f′′(x)]^{2}}

Sustituyendo esta, tenemos la formulación final del Método de Newton modificado.

x^{(k+1)} = x^{(k)} − \frac{f′′(x^{(k)})f′(x^{(k)})}{f′′(x^{(k)})f′′(x^{(k)}) − f′(x^{(k)})f′′′(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

Para la función f(x) = \frac{(x−3)^{5}}{5} para un valor inicial x_{0} = 2 la solución es:

La primer derivada es:

f′(x) = (x − 3)^{4}

La segunda derivada

f′′(x) = 4(x − 3)^{3}

y la tercer derivada

f′′′(x) = 12(x − 3)^{2}

Evaluando en el punto inicial tenemos f′(2) = 1, f′′(2) = −4 y f′′′(2) = 12 sustituyendo en la iteración de Newton tenemos

x^{(1)} = 2 − \frac{(1) × (−4)}{(4)^{2} − (1) ∗ (12)} = 3

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 = c_{1}x_{1} + c_{2}x_{2} + ⋯ + c_{n}x_{n}

donde c_{j} es el pago por cada unidad de la j-esima actividad que se lleva a cabo y x_{j} es la magnitud o cantidad de la j-esima actividad.

Las restricciones se pueden representar en forma general como:

a_{i,1}x_{1} + a_{i,2}x_{2} + ⋯ + a_{i,n}x_{n} ≤ b_{i}

donde a_{i,j} cantidad de i-ésima fuente que se consume por cada unidad de j-ésima actividad y b_{i} cantidad de la i-ésima fuente que ésta disponible.

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 m^{3}/tonelada  11 m^{3}/tonelada 77 m^{3}/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 x_{1} y x_{2} respectivamente, la ganancia total se puede calcular como

Ganancia total = 150x_{1} + 175x_{2}

o escribirla como una función objetivo en programación lineal

Maximiza Z = 150x_{1} + 175x_{2}

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 = 7x_{1} + 11x_{2}

Este total no puede exceder el abastecimiento disponible de 77 m3/semana, así que la restricción se puede representar como

7x_{1} + 11x_{2} ≤ 77

Las restricciones restantes se pueden desarrollar en una forma similar, la formulación total resultante para la PL está dada por

Maximizar Z = 150x_{1} + 175x_{2}

Sujeta a

7x_{1} + 11x_{2} ≤ 77
10x_{1} + 8x_{2} ≤ 80
x_{1} ≤ 9
x_{2} ≤ 6
x_{1} ≥ 0
x_{2} ≥ 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:

7x_{1} + 11x_{2} ≤ 77

Se puede definir una variable h_{1} como la cantidad de gasolina cruda que no se usa para una nivel de producción en particular (x_{1}, x_{2}). Si esta cantidad se agrega al lado izquierdo de la restricción, forma la relación exacta.

7x_{1} + 11x_{2} + h_{1} = 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.

Z = 150x_{1} + 175x_{2}

Sujeta a

7x_{1} +11x_{2} +h_{1}  = 77
10x_{1} +8x_{2}  +h_{2}  = 80
x_{1}  +h_{3}  = 9
x_{2}  +h_{4} = 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 c_{j} mas grande.

3. Seleccionar la variable de salida de las variables básicas actuales. Tomamos la i-ésima variable tal que b_{i}/a_{i,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;

    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 = 150x_{1} + 175x_{2}

Sujeta a

7x_{1} +11x_{2} +h_{1}  = 77
10x_{1} +8x_{2}  +h_{2}  = 80
x_{1}  +h_{3}  = 9
x_{2}  +h_{4} = 6

Comenzamos por escribir la forma estándar del problema seleccionando como solución básica factible x_{1} = 0, x_{2} = 0, h_{1} = 77, h_{2} = 80, h_{3} = 9 y h_{4} = 6. Note que las variables de holgura tiene los valores que hacen las desigualdades ver como igualdades

[ \begin{matrix}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 \end{matrix} ]

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.

Figura 5.16: Área de Factibilidad del ejemplo 1.

Dado que el costo mayor es 175 comenzamos por introducir la variable x_{2} por lo tanto la columna es la 2 y sacar la variable de holgura h_{4} dado que esta restricción es la mas cercana del punto básico. Por lo tanto el pivote es 4, 2

[ \begin{matrix}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 \end{matrix} ] \begin{matrix}7 \\ 10 \\ ∞ \\ 6 \end{matrix}

Una vez aplicado el método de Gauss Jordan tenemos

[ \begin{matrix}7.00 & 0 & 1.00 & 0 & 0 & −11.00 & 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 \end{matrix} ]

Segunda Iteración

La siguiente variable a introducir es x_{1} dado que el mayor de los costos es 150 y sacar la variable de holgura h_{1} dado que es la mas cercana de nuestro punto extremo. Por lo tanto tenemos el elemento 1, 1 como pivote

[ \begin{matrix}7.00 & 0 & 1.00 & 0 & 0 & −11.00 & 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 \end{matrix} ] \begin{matrix}1.57 \\ 3.2 \\ 9 \\ ∞ \end{matrix}

Aplicando el método de Gauss-Jordan en el elemento 1,1 tenemos

[ \begin{matrix}1.00 & 0 & 0.14 & 0 & 0 & −1.57 & 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 \end{matrix} ]

Tercer iteración

En la función de Costo tenemos un término positivo de 60.71 corresponden a la variable de holgura h_{4}, por lo tanto introducimos la variable h_{4} y sacamos la variable h_{2}. Por lo tanto el pivote para esta iteración es 2, 6

[ \begin{matrix}1.00 & 0 & 0.14 & 0 & 0 & −1.57 & 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 \end{matrix} ] \begin{matrix}−1.00 \\ 2.11 \\ 4.73 \\ 6 \end{matrix}

Una vez eliminada la variable de holgura h_{2} tenemos

[ \begin{matrix}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 \end{matrix} ]

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 x_{1} la solución esta en el renglón 1 dado que hay un 1 en la posición 1,1 y es x_{1} = 4.89. Para x_{2} el 1 esta en la posición 4 por lo tanto la solución es x_{2} = 3.89. Para h_{1} no tenemos un 1 en la columna correspondiente y de igual manera para h_{2}, por lo tanto tenemos h_{1} = 0 y h_{2} = 0. Para h_{3} tenemos un 1 en el renglón 3 por lo tanto h_{3} = 4.11. Finalmente para h_{4} tenemos un 1 en la posición 2 por lo tanto h_{4} = 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 = 6x_{1} + 4x_{2}

                                 Sujeta a

2x_{1} + 2x_{2} ≤ 160

x_{1} + 2x_{2} ≤ 120
4x_{1} + 2x_{2} ≤ 280

Su formulación estándar es:

[ \begin{matrix}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 \end{matrix} ]

Figura 5.17: Área de Factibilidad del ejemplo 2.

Primer iteración Tomamos como pivote el renglón 3 y columna 1

[ \begin{matrix}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 \end{matrix} ] \begin{matrix}80.0 \\ 120.0 \\ 70 \end{matrix}

Realizada la eliminación de la variable x_{1} tenemos

[ \begin{matrix}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 \end{matrix} ]

Segunda Iteración Seleccionamos como pivote al renglón 1 columna 2.

[ \begin{matrix}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 \end{matrix} ] \begin{matrix}20.00 \\ 33.33 \\ 70.00 \end{matrix}

Realizada la eliminación de x_{2} tenemos

[ \begin{matrix}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 \end{matrix} ]

Dado que no tenemos términos negativos en el renglón de costos terminamos con solución x_{1} = 60, x_{2} = 20, h_{1} = 0, h_{2} = 20, h_{3} = 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 Z = 3x_{1} + 4x_{2}

                                  Sujeta a

2x_{1} + 3x_{2} ≤ 1200 2x_{1} + x_{2} ≤ 1000

4x_{2} ≤ 800

La formulación utilizando Simplex queda

[ \begin{matrix}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 \end{matrix} ]

Primer Iteración Tomamos como pivote el renglón 3 y columna 2

[ \begin{matrix}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 \end{matrix} ] \begin{matrix}400.00 \\ 1000.00 \\ 200.00 \end{matrix}

Reduciendo tememos como resultado

[ \begin{matrix}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 \end{matrix} ]

Segunda Iteración Tomamos como pivote el renglón 1 y columna 1

[ \begin{matrix}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 \end{matrix} ] \begin{matrix}300.00 \\ 400.00 \\ ∞ \end{matrix}

Aplicando la eliminación tenemos

[ \begin{matrix}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 \end{matrix} ]

Tercer iteración

Tomamos como pivote el renglón 2 la columna 5

[ \begin{matrix}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 \end{matrix} ] \begin{matrix}−789.47 \\ 400.00 \\ 800.00 \end{matrix}

[ \begin{matrix}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 \end{matrix} ]

La solución es x_{1} = 450, x_{2} = 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 143 Figura 5.18: Área de Factibilidad del ejemplo 3.

144 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: [x_{1}, y_{1}], [x_{2}, y_{2}], [x_{3}, y_{3}],..., [x_{n}, y_{n}] a una línea recta. La expresión matemática de la línea recta es:

y = a_{0} + a_{1}x + e

donde a_{0} y a_{1}, 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.

Figura 6.19: Un conjunto de puntos Una estrategia, para ajustar a la mejor línea, es minimizar la suma al cuadrado de los errores para todos los datos disponibles

E(a) = ∑_{i=1}^{n} e_{i}^{2} = ∑_{i=1}^{n}(y_{i} − a_{0} − a_{1}x_{i})^{2}

Esta misma ecuación la podemos escribir en forma matricial como

E(a) = [e_{1}, e_{2}, ⋯, e_{n}] [ e_{1} ; e_{2} ; ⋮ ; e_{n} ]

Los elementos del vector de error e_{i} en forma matricial queda como

e_{i} = y_{i} − [1, x_{i}] [ \begin{matrix}a_{0} \\ a_{1} \end{matrix} ]

y en general

[ e_{1} ; e_{2} ; e_{3} ; ⋮ ; e_{n} ] = [ y_{1} ; y_{2} ; y_{3} ; ⋮ ; y_{n} ] − [ \begin{matrix}1 & x_{1} \\ 1 & x_{2} \\ 1 & x_{3} \\ ⋮ & ⋮ \\ 1 & x_{n} \end{matrix} ] [ \begin{matrix}a_{0} \\ a_{1} \end{matrix} ]

En forma compacta tenemos que e = y–Ma, 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.

\frac{∂E(a)}{∂a} = \frac{∂}{∂a}[y − Ma]^{T} [y − Ma] = 0

\frac{∂E(a)}{∂a} = −2M^{T} [y − Ma] = 0

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:

[ \begin{matrix}∑_{i=1}^{n} 1 & ∑_{i=1}^{n} x_{i} \\ ∑_{i=1}^{n} x_{i} & ∑_{i=1}^{n} x_{i}^{2} \end{matrix} ] [ \frac{a_{0}}{a_{1}} ] = [ \frac{∑_{i=1}^{n} y_{i}}{∑_{i=1}^{n} x_{i}y_{i}} ]

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

\begin{matrix}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 \end{matrix}

La matriz M queda como

M = [ \begin{matrix}1 & 1.00 \\ 1 & 2.00 \\ 1 & 3.00 \\ 1 & 4.00 \\ 1 & 5.00 \\ 1 & 6.00 \\ 1 & 7.00 \end{matrix} ]

M^{T} M = [ \begin{matrix}1 & 1 & 1 & 1 & 1 & 1 & 1 \\ 1.00 & 2.00 & 3.00 & 4.00 & 5.00 & 6.00 & 7.00 \end{matrix} ] [ \begin{matrix}1 & 1.00 \\ 1 & 2.00 \\ 1 & 3.00 \\ 1 & 4.00 \\ 1 & 5.00 \\ 1 & 6.00 \\ 1 & 7.00 \end{matrix} ] = [ \begin{matrix}7.00 & 28.00 \\ 28.00 & 140.00 \end{matrix} ]

M^{T} y = [ \begin{matrix}1 & 1 & 1 & 1 & 1 & 1 & 1 \\ 1.00 & 2.00 & 3.00 & 4.00 & 5.00 & 6.00 & 7.00 \end{matrix} ] [ \begin{matrix}0.50 \\ 2.50 \\ 2.00 \\ 4.00 \\ 3.50 \\ 6.00 \\ 5.50 \end{matrix} ] = [ \begin{matrix}24.00 \\ 119.50 \end{matrix} ]

Aplicando las formulas anteriores, tenemos que el sistema de ecuaciones a resolver es

[ \begin{matrix}7.00 & 28.00 \\ 28.00 & 140.00 \end{matrix} ] [ \begin{matrix}a_{0} \\ a_{1} \end{matrix} ] = [ \begin{matrix}24.00 \\ 119.50 \end{matrix} ]

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 149

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.

[ \begin{matrix}1 & x_{1} & x_{1}^{2} & x_{1}^{3} & ⋯ & x_{1}^{m} \\ 1 & x_{2} & x_{2}^{2} & x_{2}^{3} & ⋯ & x_{2}^{m} \\ 1 & x_{3} & x_{3}^{2} & x_{3}^{3} & ⋯ & x_{3}^{m} \\ ⋮ & ⋮ & ⋮ & ⋮ & ⋮ & ⋮ \\ 1 & x_{n} & x_{n}^{2} & x_{n}^{3} & ⋯ & x_{n}^{m} \end{matrix} ] [ a_{0} ; a_{1} ; a_{2} ; a_{3} ; ⋮ ; a_{m} ] = [ y_{0} ; y_{1} ; y_{2} ; ⋮ ; y_{n} ]

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]

6.1.4. Ejemplo 2

Ajustar a un polinomio de segundo orden los datos en la siguiente tabla.

\begin{matrix}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 \end{matrix}

En este caso por ser un polinomio de segundo grado tenemos una matriz M dada por

M = [ \begin{matrix}1 & 0 & 0 \\ 1 & 1 & 1 \\ 1 & 2 & 4 \\ 1 & 3 & 9 \\ 1 & 4 & 16 \\ 1 & 5 & 25 \end{matrix} ]

El sistema de ecuaciones que debemos resolver es:

[ \begin{matrix}6.00 & 15.00 & 55.00 \\ 15.00 & 55.00 & 225.00 \\ 55.00 & 225.00 & 979.00 \end{matrix} ] [ \begin{matrix}a_{0} \\ a_{1} \\ a_{2} \end{matrix} ] = [ \begin{matrix}152.60 \\ 585.60 \\ 2488.80 \end{matrix} ]

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écnica, llamada interpolación lineal, la podemos representar por la siguiente formulación, la cual se calcula considerando que se tienen dos puntos P_{1} = [x_{1}, f(x_{1})]^{T} y P_{0} = [x_{0}, f(x_{0})]^{T} Figura 6.21: Un conjunto de puntos y su aproximación cuadrática

\frac{f(x) − f(x_{0})}{x − x_{0}} = \frac{f(x_{1}) − f(x_{0}))}{x_{1} − x_{0}}

La cual da lugar a la siguiente ecuación

f(x) = f(x_{0}) + \frac{f(x_{1}) − f(x_{0})}{x_{1} − x_{0}}(x − x_{0})

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

6.2.1. Ejemplo 1

Dados los puntos

\begin{matrix}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 \end{matrix}

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 153

Figura 6.22: Un conjunto de puntos y su interpolación lineal q(x) = b_{0} + b_{1}(x − x_{0}) + b_{2}(x − x_{0})(x − x_{1})

Para calcular los valores b_{0}, b_{1} y b_{2} necesitamos introducir información de tres puntos [x_{0}, f(x_{0})], [x_{1}, f(x_{1})] y [x_{2}, f(x_{2})]. Si sustituimos en primer x_{0} tenemos que

f(x_{0}) = b_{0} + b_{1}(x_{0} − x_{0}) + b_{2}(x_{0} − x_{0})(x − x_{1})

por lo tanto

b_{0} = f(x_{0})

Para calcular b_{1} utilizamos el segundo punto así tenemos

f(x_{1}) = b_{0} + b_{1}(x_{1} − x_{0}) + b_{2}(x_{1} − x_{0})(x_{1} − x_{1})

despejando tenemos

b_{1} = \frac{f(x_{1}) − f(x_{0})}{x_{1} − x_{0}}

Para el calculo de b_{2} sustituimos los valores de b_{0}, b_{1} y [x_{2}, f(x_{2})] de la siguiente manera

f(x_{2}) = f(x_{0}) + \frac{f(x_{1}) − f(x_{0})}{x_{1} − x_{0}}(x_{2} − x_{0}) + b_{2}(x_{2} − x_{0})(x_{2} − x_{1})

despejando a b_{2}

b_{2} = \frac{f(x_{2}) − f(x_{0}) − \frac{f(x_{1})−f(x_{0})}{x_{1}−x_{0}}(x_{2} − x_{0})}{(x_{2} − x_{0})(x_{2} − x_{1})}

b_{2} = \frac{f(x_{2}) − f(x_{1}) + f(x_{1}) − f(x_{0}) − \frac{f(x_{1})−f(x_{0})}{x_{1}−x_{0}}(x_{2} − x_{0})}{(x_{2} − x_{0})(x_{2} − x_{1})}

b_{2} = \frac{f(x_{2}) − f(x_{1}) + (f(x_{1}) − f(x_{0})) (1 − \frac{x_{2}−x_{0}}{x_{1}−x_{0}} )}{(x_{2} − x_{0})(x_{2} − x_{1})}

b_{2} = \frac{f(x_{2}) − f(x_{1}) − (f(x_{1}) − f(x_{0})) (\frac{x_{2}−x_{1}}{x_{1}−x_{0}} )}{(x_{2} − x_{0})(x_{2} − x_{1})}

finalmente obtenemos

b_{2} = \frac{\frac{f(x_{2})−f(x_{1})}{x_{2}−x_{1}} − \frac{f(x_{1})−f(x_{0})}{x_{1}−x_{0}}}{x_{2} − x_{0}}

En general podemos extender el método para N puntos haciendo

k x f(x) b_{0}^{(k)}  b_{1}^{(k)}  b_{2}^{(k)}
0 x_{0} f(x_{0}) f(x_{0}) \frac{f(x_{1})−f(x_{0})}{x_{1}−x_{0}}  \frac{\frac{f(x_{2})−f(x_{1})}{x_{2}−x_{1}} − \frac{f(x_{1})−f(x_{0})}{x_{1}−x_{0}}}{x_{2}−x_{0}}
1 x_{1} f(x_{1}) f(x_{1}) \frac{f(x_{2})−f(x_{1})}{x_{2}−x_{1}}  \frac{\frac{f(x_{3})−f(x_{2})}{x_{3}−x_{2}} − \frac{f(x_{2})−f(x_{1})}{x_{2}−x_{1}}}{x_{3}−x_{1}}
2 x_{2} f(x_{2}) f(x_{2}) \frac{f(x_{3})−f(x_{2})}{x_{3}−x_{2}}  \frac{\frac{f(x_{4})−f(x_{3})}{x_{4}−x_{3}} − \frac{f(x_{3})−f(x_{2})}{x_{3}−x_{2}}}{x_{4}−x_{2}}
3 x_{3} f(x_{3}) f(x_{3}) \frac{f(x_{4})−f(x_{3})}{x_{4}−x_{3}}
4 x_{4} f(x_{4}) f(x_{4})

La función quadratica correspondiente al k-esimo intervalo queda representada por q^{(k)}(x) = b_{0}^{(k)} + b_{1}^{(k)}(x − x_{0}) + b_{2}^{(k)}(x − x_{1})(x − x_{2})

6.3.1. Ejemplo 1

Calcular el logaritmo de x = 2 dados tres puntos

\begin{matrix}x_{0} = 1 & f(x_{0}) = 0 \\ x_{1} = 4 & f(x_{1}) = 1.386294 \\ x_{2} = 6 & f(x_{2}) = 1.791759 \end{matrix}

Para resolver tenemos

b_{0} = 0

b_{1} = \frac{f(x_{1}) − f(x_{0})}{x_{1} − x_{0}} = \frac{1.386294 − 0}{4 − 1} = 0.4620981

El coeficiente b_{2} tenemos

b_{2} = \frac{\frac{f(x_{2})−f(x_{1})}{x_{2}−x_{1}} − \frac{f(x_{1})−f(x_{0})}{x_{1}−x_{0}}}{x_{2} − x_{0}}

b_{2} = \frac{\frac{1.791759−1.386294}{6−4} − 0.4620981}{6 − 1} = −0.0518731

En Forma Tabular

k x f(x)  b_{0}^{(k)}  b_{1}^{(k)}  b_{2}^{(k)}
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) = b_{0} + b_{1}(x − x_{0}) + b_{2}(x − x_{0})(x − x_{1})

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.2. Ejemplo 2

Dados los puntos

\begin{matrix}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 \end{matrix}

En Forma Tabular los coeficientes para interpolar son:

k x f(x) b_{0}^{(k)} b_{1}^{(k)} b_{2}^{(k)}
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);

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

f_{n}(x) = b_{0} + b_{1}(x − x_{0}) + b_{2}(x − x0)(x − x_{1}) + ⋯ + b_{n}(x − x_{0})(x − x_{1}) ⋯ (x − x_{n−1}) (6.15)

Como se hizo antes con las interpolaciones lineales y cuadráticas, los puntos de los datos evaluaban los coeficientes b_{0}, b_{1}, ⋯, b_{n}. Para un polinomio de n-ésimo orden se requiere n + 1 puntos: [x_{0}, f(x_{0})], [x_{1}, f(x_{1})], ..., [x_{n}, f(x_{n})]. Usamos estos datos y las siguientes ecuaciones para evaluar los coeficientes Figura 6.23: Un conjunto de puntos y su interpolación cuadrática

b_{0} = f(x_{0})
b_{1} = f[x1, x_{0}]
b_{2} = f[x_{2}, x_{1}, x_{0}]
⋮
b_{n} = f[x_{n}, x_{n−1}, ⋯, x_{1}, x_{0}]

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 como

f[x_{i}, x_{j}] = \frac{f(x_{i}) − f(x_{j})}{x_{i} − x_{j}}

La segunda diferencia dividida finita, la cual representa la diferencia de las dos primeras diferencias divididas, se expresa por lo general como

f[x_{i}, x_{j}, x_{k}] = \frac{f[x_{i}, x_{j}] − f[x_{j}, x_{k}]}{x_{i} − x_{k}}

En forma similar, la n-ésima diferencia dividida finja es

f[x_{n}, x_{n−1}, ⋯, x_{1}, x_{0}] = \frac{f[x_{n}, x_{n−1}, ⋯, x_{1}] − f[x_{n−1}, x_{n−2}, ⋯, x_{1}, x_{0}]}{x_{n} − x_{0}}

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 interpolación

f_{n}(x) = f(x_{0}) + f[x_{1}, x_{0}](x − x_{0}) + f[x_{2}, x_{1}, x_{0}](x − x0)(x − x_{1}) +
⋯ +f[x_{n}, x_{n−1}, ⋯, x_{1}, x_{0}](x − x_{0})(x − x_{1}) ⋯ (x − x_{n−1})

En la siguiente tabla se muestra el procedimiento para el calculo de las diferencias finitas divididas.

i x_{i} f(x_{i}) Primero  Segundo  Tercero
b_{0}  b_{1}  b_{2}  b_{3}
0 x_{0} f(x_{0}) f[x_{1}, x_{0}] f[x_{2}, x_{1}, x_{0}] f[x_{3}, x_{2}, x_{1}, x_{0}]
1 x_{1} f(x_{1}) f[x_{2}, x_{1}] f[x_{3}, x_{2}, x_{1}]
2 x_{2} f(x_{2}) f[x_{3}, x_{2}]
3 x_{3} f(x_{3})

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

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 x_{i} f(x_{i}) Primero Segundo Tercero
b_{0} b_{1} b_{2} b_{3}
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

f_{3}(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 f_{3}(2) = 0.6287686

6.4.2. Ejemplo 2

Dados los puntos

\begin{matrix}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 \end{matrix}

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 polinomio 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 163 Figura 6.24: Un conjunto de puntos y su interpolación con Polinomios de Newton de Quinto grado

f_{n}(x) = ∑_{i=0}^{n} L_{i}(x)f(x_{i})

donde

L_{i}(x) = n ; ∏ ; \begin{matrix}j = 0 \\ j ≠ i \end{matrix} \frac{x − x_{j}}{x_{i} − x_{j}}

Por ejemplo la versión lineal n = 1 es

f_{1}(x) = \frac{x − x_{1}}{x_{0} − x_{1}} f(x_{0}) + \frac{x − x_{0}}{x_{1} − x_{0}} f(x_{1})

y la versión de segundo orden es

f_{2}(x) = \frac{(x − x_{1})(x − x_{2})}{(x_{0} − x_{1})(x_{0} − x_{2})}f(x_{0}) + \frac{(x − x_{0})(x − x_{2})}{(x_{1} − x_{0})(x_{1} − x_{2})}f(x_{1}) + \frac{(x − x_{0})(x − x_{1})}{(x_{2} − x_{0})(x_{2} − x_{1})}f(x_{2})

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

f_{1}(x) = \frac{x − 4}{1 − 4}0 + \frac{x − 1}{4 − 1}1.386294 = −0.462098 + 0.462098x

f_{1}(2) = \frac{2 − 4}{1 − 4}0 + \frac{2 − 1}{4 − 1}1.386294 = 0.4620981

y la solución de segundo n = 2 orden es

f_{2}(x) = \frac{(x − 4)(x − 6)}{(1 − 4)(1 − 6)}0 + \frac{(x − 1)(x − 6)}{(4 − 1)(4 − 6)}1.386294 + \frac{(x − 1)(x − 4)}{(6 − 1)(6 − 4)}1.791760

La ecuación resultante de segundo grado es

f_{2}(x) = −0.66959 + 0.721463x^{2} − 0.0518731x^{2}

6.5. INTERPOLACIÓN DE POLINOMIOS DE LAGRANGE 165 Para calcular el valor de ln(2) resolvemos

f_{2}(2) = \frac{(2 − 4)(2 − 6)}{(1 − 4)(1 − 6)}0 + \frac{(2 − 1)(2 − 6)}{(4 − 1)(4 − 6)}1.386294 + \frac{(2 − 1)(2 − 4)}{(6 − 1)(6 − 4)}1.791760 = 0.5658444

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:

\begin{matrix}x & f(x) \\ 1 & 0.0000 \\ 2 & 0.6931 \\ 3 & 1.0986 \\ 4 & 1.3863 \end{matrix}

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

f_{3}(x) = \frac{(x − 2)(x − 3)(x − 4)}{(1 − 2)(1 − 3)(1 − 4)}0.0000 + \frac{(x − 1)(x − 3)(x − 4)}{(2 − 1)(2 − 3)(2 − 4)}0.6931 +

\frac{(x − 1)(x − 2)(x − 4)}{(3 − 1)(3 − 2)(3 − 4)}1.0986 + \frac{(x − 1)(x − 2)(x − 3)}{(4 − 1)(4 − 2)(4 − 3)}1.3863

Simplificando la expresión tenemos

f_{3}(x) = −1.1505 + 1.4358x − 0.3136x^{2} + 0.0283x^{3}

Para calcular el valor interpolado hacemos

f_{3}(1.4) = \frac{(1.4 − 2)(1.4 − 3)(1.4 − 4)}{(1 − 2)(1 − 3)(1 − 4)}0.0000 + \frac{(1.4 − 1)(1.4 − 3)(1.4 − 4)}{(2 − 1)(2 − 3)(2 − 4)}0.6931 +

\frac{(1.4 − 1)(1.4 − 2)(1.4 − 4)}{(3 − 1)(3 − 2)(3 − 4)}1.0986 + \frac{(1.4 − 1)(1.4 − 2)(1.4 − 3)}{(4 − 1)(4 − 2)(4 − 3)}1.3863

obviamente que la otra alternativa para evaluar es:

f_{3}(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:

f_{3}(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

\frac{df(x)}{dx} = lím_{h→0} \frac{f(x) − f(x − h)}{h}

entonces para valores pequeños de h podemos hacer una aproximación de la derivada haciendo

\frac{df(x)}{dx} ≈ \frac{f(x) − f(x − h)}{h}

En el caso de considerar la diferencia hacia adelante podemos hacer

\frac{df(x)}{dx} ≈ \frac{f(x + h) − f(x)}{h}

Considerando que los incrementos se dan hacia adelante y hacia atrás, podemos dar una representación de la derivada centrada como

\frac{df(x)}{dx} ≈ \frac{f(x + h) − f(x − h)}{2h}

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

I = ∫_{a}^{b} f(x)dx ≈ ∫_{a}^{b} f(a)dx = f(a)x|_{a}^{b} = f(a) ∗ (b − a)

7.3.1. Ejemplo

Para la función f(x) = 0.2 + 25x − 200x^{2} + 675x^{3} − 900x^{4} + 400x^{5}, 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:

∫_{a}^{b} f(x)dx ≈ ∑_{k=0}^{N−1} f(a + kh) ∗ h

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

f(x) = f(a) + \frac{(x − a)}{b − a}(f(b) − f(a))

A partir de esto podemos hacer la aproximación de nuestra integral

I = ∫_{a}^{b} f(x)dx ≈ ∫_{a}^{b} (f(a) + \frac{(x − a)}{b − a}(f(b) − f(a))) dx

resolviendo la integral tenemos

I ≈ (f(a)x + \frac{(x − a)^{2}}{2(b − a)} (f(b) − f(a)))|_{a}^{b}

I ≈ \frac{f(b) + f(a)}{2}(b − a)

La cual es el área de un trapecio de altura menor f(a) y altura mayor f(b).

170 DIFERENCIACIÓN E INTEGRACIÓN

7.4.1. Ejemplo

Para la función f(x) = 0.2 + 25x − 200x^{2} + 675x^{3} − 900x^{4} + 400x^{5}, calcular la integral utilizando el método de la Regla Trapezoidal en el intervalo a = 0 b = 0.8 .

I ≈ \frac{f(b) + f(a)}{2}(b − a) = \frac{(0.2320 + 0.2)(0.8 − 0)}{2} = 0.1728

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

I ≈ (b − a)\frac{f(a) + 2 ∑_{k=1}^{N−1} f(a + kh) + f(b)}{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

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

f(x) = \frac{(x − x_{1})(x − x_{2})}{(x_{0} − x_{1})(x_{0} − x_{2})}f(x_{0}) + \frac{(x − x_{0})(x − x_{2})}{(x_{1} − x_{0})(x_{1} − x_{2})}f(x_{1}) + \frac{(x − x_{0})(x − x_{1})}{(x_{2} − x_{0})(x_{2} − x_{1})}f(x_{2})

Aplicando la integración de la función de interpolación tenemos:

I ≈ ∫_{a}^{b} f(x)dx = (b − a)\frac{f(x_{0}) + 4f(x_{1}) + f(x_{2})}{6}

7.5.1. Ejemplo

Para la función f(x) = 0.2 + 25x − 200x^{2} + 675x^{3} − 900x^{4} + 400x^{5}, calcular la integral utilizando el método Simpson 1/3 en el intervalo a = 0 b = 0.8 .

I ≈ (b − a)\frac{f(x_{0}) + 4f(x_{1}) + f(x_{2})}{6} = (0.8 − 0)\frac{f(0) + 4f(0.4) + f(0.8)}{6} =

I ≈ (0.8 − 0)\frac{(0.2 + 4 × 2.4560 + 0.2320)}{6} = 1.3675

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:

I ≈ (b − a)\frac{f(x_{a}) + 4 ∑_{k=1,3,5,···}^{N−1} f(a + k ∗ h) + 2 ∑_{k=2,4,6,···}^{N−1} f(a + k ∗ h) + f(b)}{3N}

y la implementación en Matlab es:

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

f(x) = \frac{(x − x_{1})(x − x_{2})(x − x_{3})}{(x_{0} − x_{1})(x_{0} − x_{2})(x_{0} − x_{3})}f(x_{0})
+ \frac{(x − x_{0})(x − x_{2})(x − x_{3})}{(x_{1} − x_{0})(x_{1} − x_{2})(x_{1} − x_{3})}f(x_{1})
+ \frac{(x − x_{0})(x − x_{1})(x − x_{3})}{(x_{2} − x_{0})(x_{2} − x_{1})(x_{2} − x_{3})}f(x_{2})
+ \frac{(x − x_{0})(x − x_{1})(x − x_{2})}{(x_{3} − x_{0})(x_{3} − x_{1})(x_{3} − x_{2})}f(x_{3})

Resolviendo para esta función polinomial

I ≈ ∫_{a}^{b} f(x)dx = (b − a)\frac{f(x_{0}) + 3f(x_{1}) + 3f(x_{2}) + f(x_{3})}{8}

7.6.1. Ejemplo

Para la función f(x) = 0.2 + 25x − 200x^{2} + 675x^{3} − 900x^{4} + 400x^{5}, calcular la integral utilizando la regla Simpson 3/8 en el intervalo a = 0 b = 0.8 .

I ≈ (0.8 − 0)\frac{f(0) + 3f(0.2667) + 3f(0.5333) + f(0.8)}{8} =

I ≈ (0.8 − 0)\frac{(0.2 + 3 × 1.4327 + 3 × 3.4872 + 0.2320)}{8} = 1.5192

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

7.7. Ejemplos

7.7.1. Ejemplo 1

Dada la función

f(x) = 0.2 + 25x − 200x^{2} + 675x^{3} − 900x^{4} + 400x^{5}

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)

I(x) = ∫_{a}^{b} f(x)dx = 0.2x + \frac{25}{2}x^{2} − \frac{200}{3}x^{3} + \frac{675}{4}x^{4} − \frac{900}{5}x^{5} + \frac{400}{6}x^{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

\frac{dy}{dx} = f(x, y)

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 estimació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:

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^{′(k)} = f(x^{(k)}, y^{(k)})

y se usa para extraporlar linealmente a y^{(k+1)}

y_{p}^{(k+1)} = y^{(k)} + f(x^{(k)}, y^{(k)})h

La pendiente en el punto final del intervalo la podemos calcular como:

y^{′(k+1)} = f(x^{(k+1)}, y_{p}^{(k+1)})

y la pendiente promedio la podemos calcular como

ȳ′ = \frac{y^{′(k+1)} + y^{′(k)}}{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

y_{p}^{(k+1)} = y^{(k)} + f(x^{(k)}, y^{(k)})h

Corrección

y^{(k+1)} = y^{(k)} + \frac{f(x^{(k)}, y^{(k)}) + f(x^{(k+1)}, y_{p}^{(k+1)})}{2}h

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

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 k_{1} y k_{2} utilizando

k_{1} = f(x^{(k)}, y^{(k)})

k_{2} = f(x^{(k)} + \frac{3}{4}h, y^{(k)} + \frac{3}{4}k_{1}h)

La actualización se lleva a cabo haciendo

y^{(k+1)} = y^{(k)} + (\frac{1}{3}k_{1} + \frac{2}{3}k_{2}) h

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 k_{1}, k_{2} y k_{3} utilizando las siguientes formulas

k_{1} = f(x^{(k)}, y^{(k)})

k_{2} = f(x^{(k)} + \frac{1}{2}h, y^{(k)} + \frac{1}{2}k_{1}h)

k_{3} = f(x^{(k)} + h, y^{(k)} − k_{1}h + 2k_{2}h)

La actualización se lleva a cabo haciendo

y^{(k+1)} = y^{(k)} + \frac{1}{6} (k_{1} + 4k_{2} + k_{3}) h

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 k_{1}, k_{2}, k_{3} y k_{4} utilizando las siguientes formulas

k_{1} = f(x^{(k)}, y^{(k)})

k_{2} = f(x^{(k)} + \frac{1}{2}h, y^{(k)} + \frac{1}{2}k_{1}h)

k_{3} = f(x^{(k)} + \frac{1}{2}h, y^{(k)} + \frac{1}{2}k_{2}h)

k_{4} = f(x^{(k)} + h, y^{(k)} + k_{3}h)

La actualización se lleva a cabo haciendo

y^{(k+1)} = y^{(k)} + \frac{1}{6} (k_{1} + 2k_{2} + 2k_{3} + k_{4}) h

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

f(x, y) = −2x^{3} + 12x^{2} − 20x + 8.5

La integral la podemos calcular como

∫ \frac{dy}{dx}dx = ∫ f(x, y)dx = −0.5x^{4} + 4x^{3} − 10x^{2} + 8.5x

La solución para y para un valor inicial y(0) = 1 lo cual da la siguiente expresión

y(x) = −0.5x^{4} + 4x^{3} − 10x^{2} + 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 x^{(k)} y^{(k)} y_{E}^{(k)} y_{H}^{(k)} y_{P M}^{(k)} y_{RK}^{(k)} y_{RK3}^{(k)} y_{RK4}^{(k)}
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.

\begin{matrix}k & |y^{(k)} − y_{E}^{(k)}| & |y^{(k)} − y_{H}^{(k)}| & |y^{(k)} − y_{P M}^{(k)}| & |y^{(k)} − y_{RK}^{(k)}| & |y^{(k)} − y_{RK3}^{(k)}| & |y^{(k)} − y_{RK4}^{(k)}| \\ 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 \end{matrix}

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),...

          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

\frac{di}{dt} = \frac{V − Ri}{L}

La ecuación diferencial en Matlab es:

    function di = Circuito_RL(t, i)
        %Parametros

        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:

i(t) = \frac{V}{R} (1 − e^{(−Rt/L)})

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:

\begin{matrix}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 \end{matrix}

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

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

        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

\begin{matrix}\frac{d^{2}x}{dt^{2}} = 0 \\ \frac{d^{2}y}{dt^{2}} = a \end{matrix}

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 v_{x} y la velocidad vertical v_{y} tal como se muestra a continuación:

\begin{matrix}\frac{d^{2}x}{dt^{2}} = 0 ≡ \{ \begin{matrix}\frac{dx}{dt} = v_{x} \\ \frac{dv_{x}}{dt} = 0 \end{matrix} \\ \frac{d^{2}x}{dt^{2}} = −g ≡ \{ \begin{matrix}\frac{dy}{dt} = v_{y} \\ \frac{dv_{y}}{dt} = −g \end{matrix} \end{matrix}

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 diferenciales, para un tiempo t_{f} = 2.0 seg, asumiendo los siguientes inicialmente x(0) = 0 mts, y_{0} = 5 mts, v_{x}(0) = 10 m/s, v_{y}(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);

[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 velocidad inicial v_{x}(0) horizontalmente y v_{y}(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

\begin{matrix}x(t) = x(0) + v_{x}(0)t \\ y(t) = y(0) + v_{y}(0)t − \frac{1}{2}gt^{2} \end{matrix}

La solución de acuerdo con la ecuaciones de movimiento es:

x(t) = x(0) + v_{x}(0)t
x(2) = 0 + 10 ∗ 2 = 20
y(t) = y(0) + v_{y}(0)t − \frac{1}{2}gt^{2}
y(2) = 5 + 10 ∗ 2 − \frac{1}{2}(9.8)2^{2} = 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.

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 amortiguamiento C y se aplica una fuerza F. El modelo dinámico para este sistema es:

Figura 8.28: Sistema Masa Resorte

M \frac{dx^{2}}{dt^{2}} + C \frac{dx}{dt} + Kx = F

Note que tenemos una ecuación diferencial de segundo orden la cual plantearemos como un par de ecuaciones de primer orden como:

\frac{dx}{dt} = v

\frac{dv}{dt} = \frac{F − Cv − Kx}{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 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).

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

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

194 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

C_{1} \frac{dy}{dx} + C_{2}y = C_{3}

Si hacemos la aproximación de la derivada mediante la ecuación

\frac{dy}{dx} ≈ \frac{y(x_{k}) − y(x_{k} − h)}{h} ≡ \frac{y_{k} − y_{k−1}}{h}

Aplicándolo a la ecuación diferencial original

C_{1} (\frac{y_{k} − y_{k−1}}{h} ) + C_{2}y_{k} = C_{3}

Agrupando términos semejantes tenemos

(C_{1} + C_{2}h)y_{k} − C_{1}y_{k−1} = C_{3}h

Lo cual da lugar a una recurrencia de la siguiente forma

(C_{1} + C_{2}h)y_{1} − C_{1}y_{0} = C_{3}h
(C_{1} + C_{2}h)y_{2} − C_{1}y_{1} = C_{3}h
(C_{1} + C_{2}h)y_{3} − C_{1}y_{2} = C_{3}h
(C_{1} + C_{2}h)y_{4} − C_{1}y_{3} = C_{3}h
⋮
(C_{1} + C_{2}h)y_{N} − C_{1}y_{N−1} = C_{3}h

Lo cual da Lugar a un sistema de ecuaciones de la forma

[ \begin{matrix}(C_{1} + C_{2}h) & 0 & 0 & ⋯ & 0 \\ −C_{1} & (C_{1} + C_{2}h) & 0 & ⋯ & 0 \\ 0 & −C_{1} & (C_{1} + C_{2}h) & ⋯ & 0 \\ ⋮ & ⋮ & ⋮ & ⋮ & ⋮ \\ 0 & 0 & 0 & −C_{1} & (C_{1} + C_{2}h) \end{matrix} ] [ y_{1} ; y_{2} ; y_{3} ; ⋮ ; y_{N} ] = [ C_{3}h + C_{1}y_{0} ; C_{3}h ; C_{3}h ; ⋮ ; C_{3}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 FINITAS197

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

L\frac{di}{dt} + Ri = V

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

[ \begin{matrix}0.3020 & 0 & 0 & 0 \\ −0.3000 & 0.3020 & 0 & 0 \\ 0 & −0.3000 & 0.3020 & 0 \\ 0 & 0 & −0.3000 & 0.3020 \end{matrix} ] [ \begin{matrix}i_{1} \\ i_{2} \\ i_{3} \\ i_{4} \end{matrix} ] = [ \begin{matrix}0.0100 \\ 0.0100 \\ 0.0100 \\ 0.0100 \end{matrix} ]

La solución del sistema de ecuaciones es:

[ \begin{matrix}i_{1} \\ i_{2} \\ i_{3} \\ i_{4} \end{matrix} ] = [ \begin{matrix}0 \\ 0.0331 \\ 0.0660 \\ 0.0987 \\ 0.1311 \end{matrix} ]

La solución utilizando el método de Euler es:

Euler Diferencias
k  t  i_{E}  i_{D}
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

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

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 correspondiente comparada con los valores reales de la función en un intervalo [0, 5] 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 Bisecció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 x_{Bk} f(x_{Bk}) x_{Rk} f(x_{Rk}) x_{P k} f(x_{P k}) x_{Nk} f(x_{Nk})
0 x_{B0} f(x_{B0}) x_{R0} f(x_{R0}) x_{P 0} f(x_{P 0}) x_{N0} f(x_{N0})
1 x_{B1} f(x_{B1}) x_{R1} f(x_{R1}) x_{P 1} f(x_{P 1}) x_{N1} f(x_{N1})
2 x_{B2} f(x_{B2}) x_{R2} f(x_{R2}) x_{P 2} f(x_{P 2}) x_{N2} f(x_{N2})
⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮  ⋮
N x_{BN} f(x_{BN}) x_{RN} f(x_{RN}) x_{P N} f(x_{P N}) x_{NN} f(x_{NN})

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(x_{B}k), f(x_{R}k), f(x_{P} k) y f(x_{N}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 f_{n}(x) = a_{n}x^{n} + a_{n−1}x^{n−1} ⋯ + a_{1}x + a_{0} con un monomio x + s.

11.5. Tarea 5

a) Calcular las raíces del polinomio x^{4} − 1 utilizando el método de Bairstow.

b) Dada la función 0.1 + (x − 3)e^{−(x−3)^{2}} 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

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(x_{1}, x_{2}) = (x_{1} − 2)^{4} + (x_{1} − 2)^{2}x_{2}^{2} + (x_{2} + 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

3x_{1} − 0.1x_{2} − 0.2x_{3} = 7.85
0.1x_{1} + 7x_{2} − 0.3x_{3} = −19.3
0.3x_{1} − 0.2x_{2} + 10x_{3} = 71.4

Calcular la solución del sistema y la inversa utilizando el algoritmos de Gauss-Jordan.

11.10. Tarea 10

Dadas la funciones a optimizar Z_{1} y Z_{2}, dadas por la siguiente expresiones,

Z_{1} = 6x_{1} + 4x_{2}

                                 Sujeta a

2x_{1} + 2x_{2} ≤ 160 x_{1} + 2x_{2} ≤ 120 4x_{1} + 2x_{2} ≤ 280

Z_{2} = 3x_{1} + 4x_{2}

                                  Sujeta a

2x_{1} + 3x_{2} ≤ 1200

2x_{1} + x_{2} ≤ 1000

4x_{2} ≤ 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 deberán ser realizados a mano y comprobar que la solución es la correcta utilizando el algoritmo implementado en Matlab.

Z = 3x_{1} + 2x_{2} + 5x_{3}

                                    sujeto a

x_{1} <= 10 x_{2} <= 5 x_{3} <= 6

x_{1} + x_{2} + x_{3} = 15

11.12. Tarea 12

Dados los puntos

\begin{matrix}x & ln(x) \\ 1 & 0.0000 \\ 2 & 0.6931 \\ 3 & 1.0986 \\ 4 & 1.3863 \\ 5 & 1.6094 \\ 6 & 1.7918 \end{matrix}

a) Encontrar los polinomios de mínimos cuadrados f_{k}(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  f_{k}(1.5)  Error  f̂_{k}(1.5)  Error
1  f_{1}(1.5) (0.4055 − f_{1}(1.5))^{2}  f̂_{1}(1.5)  (0.4055 − f̂_{1}(1.5))^{2}
2  f_{2}(1.5) (0.4055 − f_{2}(1.5))^{2}  f̂_{2}(1.5)  (0.4055 − f̂_{2}(1.5))^{2}
3  f_{3}(1.5) (0.4055 − f_{3}(1.5))^{2}  f̂_{3}(1.5)  (0.4055 − f̂_{3}(1.5))^{2}
4  f_{4}(1.5) (0.4055 − f_{4}(1.5))^{2}  f̂_{4}(1.5)  (0.4055 − f̂_{4}(1.5))^{2}
5  f_{5}(1.5) (0.4055 − f_{5}(1.5))^{2}  f̂_{5}(1.5)  (0.4055 − f̂_{5}(1.5))^{2}