Métodos Numéricos en Ingeniería Eléctrica
Métodos Numéricos en Ingeniería Eléctrica
7 de noviembre 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
Sist. Lineales 25
2.1. Suma, resta, multiplicación y división de matrices . . . . . . . . . . . . . . . 25
ÍNDICE GENERAL
Sist. no lineales 71
3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.2. Métodos de punto fijo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.3. El método de Bisecciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.3.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.4. Método de Regula Falsi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.4.1. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
3.4.2. Solución de un circuito con un diodo . . . . . . . . . . . . . . . . . . 80
3.5. El método Newton Raphson . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.5.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.5.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
3.5.3. Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
3.6. Convergencia del método de Newton Raphson . . . . . . . . . . . . . . . . . 92
Ajuste de curvas 95
4.1. Regresión lineal por el método de mı́nimos cuadrados . . . . . . . . . . . . 95
ÍNDICE GENERAL
1.1.1. Introducción
Matlab puede considerarse como un lenguaje de programación tal como C, Fortran, Java,
etc. Algunas de las caracterı́sticas de Matlab son:
La programación es mucho mas sencilla.
Hay continuidad entre valores enteros, reales y complejos.
La amplitud del intervalo y la exactitud de los números es mayor.
Cuenta con una biblioteca matemática amplia.
Abundantes herramientas gráficas, incluidas funciones de interfaz gráfica con el usua-
rio.
Capacidad de vincularse con los lenguajes de programación tradicionales.
Transportabilidad de los programas.
Algunas de sus desventajas son:
Necesita de muchos recursos de sistema como son Memoria, tarjeta de videos, etc.
para funcionar correctamente.
El tiempo de ejecución es lento.
No genera código ejecutable.
Es caro.
En una estación de trabajo UNIX, MATLAB puede abrirse tecleando
¿matlab
1
2 INTRODUCCIÓN
En el caso de sistemas LINUX, existe una versión similar al MATLAB , llamado OCTAVE,
el cual tiene las mismas funciones y desempeño que el MATLAB. En este caso para iniciar
la sesión se da:
¿octave
En Macintosh o Windows, haga clic en el icono de MATLAB.
1.1.2. Ayuda
Si no entiende el significado de un comando, teclee help y el nombre del comando que desea
revisar. Este comando desplegara información concisa respecto que será de utilidad para
el usuario. Ası́ por ejemplo cuando se da el comando
)) help help
Se despliega en la pantalla.
HELP On-line help, display text at command line. HELP, by itself, lists all primary help
topics. Each primary topic corresponds to a directory name on the MATLABPATH.
”HELP TOPIC”gives help on the specified topic. The topic can be a command name, a
directory name, or a MATLABPATH relative partial pathname (see HELP PARTIAL-
PATH). If it is a command name, HELP displays information on that command. If it is
a directory name, HELP displays the Table-Of-Contents for the specified directory. For
example, ”help [Link] ”help matlab/general”both list the Table-Of-Contents for the
directory toolbox/matlab/general.
HELP FUN displays the help for the function FUN.
T = HELP(’topic’) returns the help text in a \ n separated string.
LOOKFOR XYZ looks for the string XYZ in the first comment line of the HELP text in
all M-files found on the MATLABPATH. For all files in which a match occurs, LOOKFOR
displays the matching lines.
MORE ON causes HELP to pause between screenfuls if the help text runs to several
screens.
In the online help, keywords are capitalized to make them stand out. Always type com-
mands in lowercase since all command and function names are actually in lowercase.
For tips on creating help for your m-files ’type help.m’.
See also LOOKFOR, WHAT, WHICH, DIR, MORE.
1.1. INTRODUCCIÓN (VARIABLES Y OPERADORES) 3
El comando what (Qué) muestra una lista de archivos M, MAT y MEX presentes en
el directorio de trabajo. Otra manera de realizar esta operación es utilizar el comando
dir.
El comando who (Quien) lista las variables utilizadas en el espacio de trabajo actual.
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:
2. nombres de funciones.
Trigonométricas
4 INTRODUCCIÓN
Exponencial.
Complejos.
1.1. INTRODUCCIÓN (VARIABLES Y OPERADORES) 5
Redondeo y residuos.
3. nombres de comandos.
Comandos
1.1.4. Ejemplo
clear;
r = 2
vol = (4/3)*pi*r^3
6 INTRODUCCIÓN
1.1.5. Operadores
Los operadores aritméticos como +, -, *, / son los mismos que en los lenguajes tradicionales
como C, Java, Fortran, etc., ası́ como la precedencia de estos.
Operador Simbolo
suma +
resta -
multiplicación *
división /
reciproco \
Un operador no convencional es el reciproco
clear;
c = 3 \ 1
Los operadores condicionales que existen en Matlab son:
Operador Simbolo
Mayor que >
Menor que <
Mayor igual >=
Menor igual <=
Igual a ==
Diferente de ˜=
Los cuales son utilizados para hacer condicionales con la sentencia if
clear;
r = -2
if r > 0, (4/3)*pi*r\^3
end
Note que todas las sentencias if deben ir acompañadas por un end.
Los operadores lógicos and y or se denotan con & y k
g = 5
if g>3 | g <0, a = 6
end
y se puede hacer agrupamiento con los operadores & y k
clear;
a = 2
b = 3
1.2. INSTRUCCIONES SECUENCIALES 7
c = 5
if((a==2 | b==3) & c < 5) g=1; end;
Para hacer condicionales se utiliza la sentencia if, la cual, siempre debe ir terminada con
la sentencia end
r = -2
if r > 0, (4/3)*pi*r^3
end
Los enunciados lógicos and y or se denotan con & y k, pueden ser utilizados para imple-
mentar condicionales de la manera siguiente.
clear;
g = 5
if g>3 | g <0, a = 6
end
pause;
además los operadores & y k se puede agrupar como
clear;
a = 2
b = 3
c = 5
pause;
Las condicionales if se pueden utilizar con else o elseif
clear;
r = 2;
if r > 3 b = 1;
elseif r == 3 b = 2;
8 INTRODUCCIÓN
else b = 0;
end;
Ver código ejem001.m
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.
end;
El siguiente conjunto de instrucciones realiza una cuenta de 100 a 80 con decrementos de
0.5.
for x=100:-0.5: 80
end;
en el caso de decrementos o incrementos unitarios, se puede omitir el valor del incremen-
to.
1.4. INSTRUCCIONES DE REPETICIÓN 9
1.4.2. Ejemplo 1
x = 1;
while x <= 100
x
x = x + 1;
end
Ver ejemplo while.m
El ejemplo para desplegar el volumen de una esfera con radios de 1, 2, 3, 4 y 5 queda.
r = 0;
while r<5
r = r+1;
vol = (4/3)*pi*r^3;
disp([r, vol])
end;
otro ejemplo interesante es:
clear;
r = 0
while r<10
r = input(’Teclee el radio (o -1 para terminar): ’);
if r< 0, break, end
vol = (4/3)*pi*r*3;
fprintf(’volumen = \%7.3f\n’, vol)
end
Ver esferas while.m
1.4.4. Ejemplo 2
Hacer un programa que permita imprimir un triángulo rectángulo formado por asteris-
cos.
% Codigo para imprimir un triangulo
fprintf(’\ntriangulo\n\n’)
for k=1:7
for l=1:k
fprintf(’*’)
end;
1.4. INSTRUCCIONES DE REPETICIÓN 11
fprintf(’\n’)
end
Ver triangulo.m
1.4.5. Ejemplo 3
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
for i=1:a
clear cad2 cad1
num_ast=2*i-1;
num_esp=n-i;
cad1(1:num_esp)=’ ’;
cad2(1:num_ast)=’*’;
fprintf(’\%s\%s\n’,cad1,cad2)
end
12 INTRODUCCIÓN
for i=1:t
fprintf(’\%s\%s\n’,cad1,cad2)
end
Ver pino.m
1.4.7. Ejemplo 5
Ver pascal.m
1.5. MANEJO DE MATRICES Y VECTORES 13
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;
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]
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
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’
v = ’Hola Mundo’
v = v’
1.5.1. Ejemplo 1
1.5.2. Ejemplo 2
m(:,1)
m(:,2)
m(:,3)
o también renglones
m(1,:)
m(2,:)
m(3,:)
podemos realizar operaciones de +. -, * y / con matrices
a = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9]
b = [0.3, 0.4, 1.3; 0.6, -0.7, 1.0; -2.0, 1.8, 9]
suma = a + b
resta = a - b
mult = a .* b
div = a ./ b
lo cual es equivalente a
a = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9]
b = [0.3, 0.4, 1.3; 0.6, -0.7, 1.0; -2.0, 1.8, 9]
for i=1:3
for j=1:3
suma(i,j) = a(i,j) + b(i,j);
end
end
%suma
for i=1:3
for j=1:3
resta(i,j) = a(i,j) - b(i,j);
end
end
%resta
for i=1:3
for j=1:3
mult(i,j) = a(i,j) * b(i,j);
18 INTRODUCCIÓN
end
end
%multiplicación
for i=1:3
for j=1:3
div(i,j) = a(i,j) / b(i,j);
end
end
%división
pause;
también podemos utilizar el operador de potenciación en arreglos
clear;
g = a .^2
pause;
el cual es equivalente
a = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9]
for i=1:3
for j=1:3
g(i,j) = a(i,j)^2;
end
end
Ver arreglos 2d.m
Algebra de Matrices
Cuando queremos realizar las operaciones del álgebra lineal de suma, resta, multiplicación
y división hacemos
la suma y resta son iguales pero la multiplicación cambia
A = [0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9]
1.6. ESTRUCTURAS DE PROGRAMA Y FUNCIONES 19
x = [1, 2, 3]’
b = A*x
para la división tendremos
A = [1, 4; 3, 5]
x = [2, 3]’
b = A\x
Las funciones en MATLAB, que se guardan como archivos independientes, equivalen a las
subrutinas y funciones de otros lenguajes.
Una función puede devolver más de una variable y la sintaxis para escribir esta función
es
function [Y1, Y2, ..., Yn ] = fun_regresa_varias(X)
...
...
...
20 INTRODUCCIÓN
Y1 = ....
Y2 = ....
...
...
Supongamos que dado un conjunto de datos queremos realizar una función que devuelva la
media y la desviación estándar. Primero escribimos un archivo llamado fun02.m, que tenga
las siguientes instrucciones.
[m d] = fun02(x)
y la ejecución regresa.
m =
d =
0.5774
Note que la función recibe dos argumentos a los que llamamos m y d. De hacer el llamado
de la función sin poner estos dos, no se genera error alguno pero solo se imprime el primer
parámetro que devuelve la función.
fun02(x)
ans =
2
1.6. ESTRUCTURAS DE PROGRAMA Y FUNCIONES 21
1.6.3. Ejemplo 1
Se tiene un circuito eléctrico formado por una fuente de voltaje variable en el tiempo
v(t) = 10cos(20t), una resistencia R = 5 y un diodo conectados en serie tal como se
muestra en la figura 3.4.
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
if vt > 0.7
vd = 0.7;
else
vd = vt;
end
it = (vt - vd)/R;
end
Dado que tenemos un operador condicional, no es posible hacer la sectorización. Es este caso
utilizamos la función arrayfun de matlab tal como se muestra en el siguiente código.
22 INTRODUCCIÓN
t = [0:0.01:2]; % tiempo
vt = 10*cos(20*t); % Voltaje variante en el tiempo
it = arrayfun(@diodo, vt); % Calculo de la corriente
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
2
v(t) y i(t)
−2
−4
−6
−8
−10
0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2
t (seg.)
1.6.4. Ejemplo 2
f (xk )
xk+1 = xk −
f 0 (xk )
for k = 1: 100
1.6. ESTRUCTURAS DE PROGRAMA Y FUNCIONES 23
xnva = x0 - f(x0)/df(x0);
x0 = xnva;
fprintf(’Iteracion \%d f(\%f) = \%f\n’, k, x0, f(x0));
if(abs(f(x0)) < 0.00001) break; end;
end;
z =x0;
function y = f(x)
y = x-cos(x);
function dy = df(x)
dy = 1+sin(x);
1.6.5. Ejemplo 3
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));
function y = f(x)
y = x-cos(x);
Solución de Sistemas Lineales de Ecuacio-
nes
Una matriz se define como un arreglo bidimensional de datos, que tiene n renglones y m
columnas. Un elemento del arreglo puede ser identificado con aij
a1,1 a1,2 a1,3 ... a1,N
a2,1 a2,2 a2,3 ... a2,N
A=
a3,1 a3,2 a3,3 ... a3,N
aM,1 aM,2 aM,2 ... aM,N
Algunas de las operaciones básicas que pueden realizarse con matrices son suma, resta
y multiplicación. La división de matrices como tal no existe y en su lugar se calcula la
inversa.
Para que la sumar las matrices AN ×M y BR×S , se requiere que las matrices tengan el
mismo número de renglones N = R y de columnas M = S . Si queremos encontrar la suma
C = A + B, cada elemento de la matriz C lo calculamos de la siguiente forma:
25
26 SIST. LINEALES
function C = suma(A, B)
[N, M] = size(A);
[R, S] = size(B);
if N~=R || M~=S
fprintf(’Las dimensiones tienen que ser iguales\n’);
return;
end;
C = zeros(N, M);
for n=1:N
for m = 1:M
C(n,m) = A(n,m)+B(n,m);
end;
end
end
En este caso, se deben cumplir las mismas propiedades que la rsuma de matrices y el calculo
de los elemento de la matriz C se calculan como:
[N, M] = size(A);
[R, S] = size(B);
if N~=R || M~=S
fprintf(’Las dimensiones tienen que ser iguales\n’);
return;
end;
C = zeros(N, M);
2.1. SUMA, RESTA, MULTIPLICACIÓN Y DIVISIÓN DE MATRICES 27
for n=1:N
for m = 1:M
C(n,m) = A(n,m)-B(n,m);
end;
end
end
M
X
Cn,m = an,k ∗ bk,m
k=1
if M~=R
fprintf(’El numero de renglones no es igual al numero de columnas\n’);
return;
end;
C = zeros(N, S);
for n=1:N
for m= 1:S
suma = 0;
28 SIST. LINEALES
for k = 1:M
suma = suma + A(n,k)*B(k,m);
end;
C(n,m) = suma;
end;
end;
end
a1,1 a1,2 a1,3 1 0 0 u1,1 u1,2 u1,3
a2,1 a2,2 a2,3 = l2,1 1 0 ∗ 0 u2,3 u2,3
a3,1 a3,2 a3,3 l3,1 l3,2 1 0 0 u3,3
[LU ]x = b
1 0 0 0 y1 b1
l2,1 1 0 0 y2 b2
=
l3,1 l3,2 1 0 y3 b3
l4,1 l4,2 l4,3 1 y4 b4
y1 = b1
y2 = b2 − l2,1 y1
y3 = b3 − l3,1 y1 − l3,2 y2
y4 = b4 − l4,1 y1 − l4,2 y2 − l4,3 y3
n<k
X
yk = bk − lk,n xn
n=1
u1,1 u1,2 u1,3 u1,4 x1 y1
0 u2,2 u2,3 u2,4 x2 y2
=
0 0 u3,3 u3,4 x3 y3
0 0 0 u4,4 x4 y4
y4
x4 =
u4,4
y3 − u3,4 x4
x3 =
u3,3
y2 − u2,3 x3 − u2,4 x4
x2 =
u2,2
y1 − u1,2 x2 − u1,3 x3 − u1,4 x4
x1 =
u1,1
PN
yk − n=k+1 uk,n xn
xk =
uk,k
2.2.3. Ejemplo
x1 + 2x2 + 4x3 + x4 = 21
2x1 + 8x2 + 6x3 + 4x4 = 52
3x1 + 10x2 + 8x3 + 8x4 = 79
4x1 + 12x2 + 10x3 + 6x4 = 82
2.2. FACTORIZACIÓN TRIANGULAR LU 31
y1 = 21
2y1 + y2 = 52
3y1 + y2 + y3 = 79
4y1 + y2 + 2y3 + y4 = 82
y1 = 21
y2 = 10
y3 = 6
y4 = −24
Posteriormente solucionamos U x = y
x1 + 2x2 + 4x3 + x4 = 21
4x2 − 2x3 + 2x4 = 10
−2x3 + 3x4 = 6
−6x4 = −24
X = [1, 2, 3, 4]T
32 SIST. LINEALES
Consideremos un sistema más grande, por ejemplo de 4 ecuaciones con cuatro incógni-
tas.
a1,1 a1,2 a1,3 a1,4 1 0 0 0 u1,1 u1,2 u1,3 u1,4
a2,1 a2,2 a2,3 a2,4 l2,1 1 0 0 0 u2,2 u2,3 u2,4
= ×
a3,1 a3,2 a3,3 a3,4 l3,1 l3,2 1 0 0 0 u3,3 u3,4
a4,1 a4,2 a4,3 a4,4 l4,1 l4,2 l4,3 1 0 0 0 u4,4
Si hacemos las multiplicaciones indicadas y dejamos los valores en la misma matriz tene-
mos:
Para el primer renglón de la matriz (n = 1)
arriba de la diagonal
arriba de la diagonal
Tercer renglón (n = 3)
bajo la diagonal
arriba de la diagonal
arriba de la diagonal
Pm−1
an,m − k=1 an,k ak,m
an,m =
am,m
n = 1, · · · , N m = 1, · · · , n − 1
n−1
X
an,m = an,m − ak,m
k=1
n = 1, · · · , N m = n, ..., N.
for n = 1:N
for m = 1: n-1
suma = 0;
34 SIST. LINEALES
for k = 1:m-1
suma = suma + a(n,k) * a(k,m);
end;
for m = n:N
suma = 0;
for k = 1: n-1
suma = suma + a(n,k) * a(k,m);
end;
a(n,m) = a(n,m) - suma;
end;
end;
end
2.2.5. Ejemplo
1 2 4 1
2 8 6 4
3 10 8 8
4 12 10 6
Paso 1.
1 2 4 1
2
4 −2 2
3 4 −4 5
4 4 −6 2
Paso 2.
2.2. FACTORIZACIÓN TRIANGULAR LU 35
1 2 4 1
2
4 −2 2
3 1 −2 3
4 1 −4 0
Paso 3.
1 2 4 1
2
4 −2 2
3 1 −2 3
4 1 −2 6
ans =
1 2 4 1
2 4 -2 2
3 1 -2 3
4 1 2 -6
2.2.6. Ejemplo
10 −1 2 1 x1 1
−1 15 −3 1 x2
2
=
2 −3 6 −3 x3 2
1 1 −3 7 x4 1
Af =
y =
1.0000
2.1000
2.1946
2.0397
para luego realizar la sustitución hacia atrás
>> x = sustitucion_hacia_atras(Af, y)
x =
-0.0508
0.2372
0.6707
0.4037
Ax = b
a1,1 a1,2 a1,3 a1,4 x1 0
a2,1 a2,2 a2,3 a2,4 x2 0
=
a3,1 a3,2 a3,3 a3,4 x3 1
a4,1 a4,2 a4,3 a4,4 x4 0
x = A−1 b
0
a01,2 a01,3 a01,4 a01,3
x1 a1,1 0
x2 a02,1 a02,2 a02,3 a02,4 0 a02,3
x3 = a03,1
=
a03,2 a03,3 a03,4 1 a03,3
donde a0n,m son los elementos de la matriz inversa A−1 . Note que poniendo un 1 en b3
obtuvimos la tercer columna de la matriz inversa, por lo tanto si solucionamos el sistema
de ecuaciones utilizando descomposición LU obtendrı́amos la tercer columna.
(k) bn = 1 si n = k
b =
bn = 0 si n <> k
Af = Factorizacion(A);
Ainv = zeros(N,N);
for k = 1: N
b = zeros(N,1);
b(k) = 1;
y = sustitucion_hacia_adelante(Af, b);
x = sustitucion_hacia_atras(Af, y);
Ainv(:,k) = x;
end;
end
38 SIST. LINEALES
2.2.8. Ejemplo
10 −1 2 1
−1 15 −3 1
A=
2 −3
6 −3
1 1 −3 7
El resultado es
1.0000 0.0000 0.0000 0.0000 10.0000 −1.0000 2.0000 1.0000
−0.1000 1.0000 0.0000 0.0000 0.0000 14.9000 −2.8000
1.1000
LU =
0.2000 −0.1879
1.0000 0.0000 0.0000 0.0000 5.0738 −2.9933
0.1000 0.0738 −0.5899 1.0000 0.0000 0.0000 0.0000 5.0529
(1)
x1
1.0000 0.0000 0.0000 0.0000 1.0000
−0.1000 (1)
1.0000 0.0000 0.0000 x2 0.1000
=
0.2000 −0.1879 1.0000 0.0000 x(1) −0.1812
3
0.1000 0.0738 −0.5899 1.0000 (1)
x4 −0.2143
(2)
y1
10.0000 −1.0000 2.0000 1.0000 0
0.0000 14.9000 −2.8000 (2)
1.1000 y2 1
=
0.0000 0.0000 5.0738 −2.9933 y3(2) 0
0.0000 0.0000 0.0000 5.0529 y4
(2) 0
(2)
x1
1.0000 0.0000 0.0000 0.0000 0
−0.1000 (2)
1.0000 0.0000 0.0000 x2 1.0000
=
0.2000 −0.1879 1.0000 0.0000 x(2) 0.1879
3
0.1000 0.0738 −0.5899 1.0000 (2)
x4 0.0370
(3)
y1
10.0000 −1.0000 2.0000 1.0000 0
0.0000 14.9000 −2.8000 (3)
1.1000 y2 0
=
0.0000 0.0000 5.0738 −2.9933 y3(3) 1
0.0000 0.0000 0.0000 5.0529 y4
(3) 0
(3)
x1
1.0000 0.0000 0.0000 0.0000 0
−0.1000 (3)
1.0000 0.0000 0.0000 x2 0
=
0.2000 −0.1879 1.0000 0.0000 x(3) 1.0000
3
0.1000 0.0738 −0.5899 1.0000 (3)
x4 0.5899
(4)
y1
10.0000 −1.0000 2.0000 1.0000 0
0.0000 14.9000 −2.8000 (4)
1.1000 y2 0
=
0.0000 0.0000 5.0738 −2.9933 y3(4) 0
0.0000 0.0000 0.0000 5.0529 y4
(4) 1
40 SIST. LINEALES
(4)
x1
1.0000 0.0000 0.0000 0.0000 0
−0.1000 (4)
1.0000 0.0000 0.0000 x2 0
=
0.2000 −0.1879 1.0000 0.0000 x(4) 0
3
0.1000 0.0738 −0.5899 1.0000 (4)
x4 1
0.1162 −0.0016 −0.0607 −0.0424
−0.0016 0.0743 0.0414 0.0073
A−1 = [x(1) , x(2) , x(3) , x(4) ] =
−0.0607
0.0414 0.2660 0.1168
−0.0424 0.0073 0.1168 0.1979
a1,1 a1,2 a1,3 x1 b1
a2,1 a2,2 a2,3 x2 = b2
a3,1 a3,2 a3,3 x3 b3
b1 − a1,2 x2 − a1,3 x3
x1 =
a1,1
b1 − a1,2 x2 − a1,3 x3
a3,1 + a3,2 x2 + a3,3 x3 = b3
a1,1
a3,1 a1,2 a3,1 a1,3 b1
a3,2 − x2 + a3,3 − x3 = b3 − a3,1
a1,1 a1,1 a1,1
a1,1 a1,2 a1,3 x1 b1
0 a02,2 a02,3 x2 = b02
0 a03,2 a03,3 x3 b03
ak,m
a0n,m = an,m − an,k
ak,k
bk
b0n = bn − an,k
ak,k
a1,1 a1,2 a1,3 x1 b1
0 a02,2 a02,3 x2 = b02
0 0 a003,3 x3 b003
a = A0;
b = b0;
N = length(b);
for k =1:N-1
for n = k+1:N
b(n) = b(n) - a(n,k)*b(k)/a(k,k);
42 SIST. LINEALES
for m=N:-1:k
a(n,m) = a(n,m) - a(n,k)*a(k,m)/a(k,k);
end;
end;
end;
disp(a);
disp(b);
x = sustitucion_hacia_atras(a, b);
end
que corresponde a un sistema triangular superior que podemos solucionar utilizando susti-
tución hacia atrás.
Ejemplo 1
10 −1 2 1 x1 1
−1 15 −3 1 x2
2
=
2 −3 6 −3 x3 2
1 1 −3 7 x4 1
Primer paso k = 1
−1
10 2 1 x1 1
149
− 14 11 21
0 x2
10 5 10 10
=
0
− 14
5
28
5 − 16
5
x3
9
5
11
0 10 − 16
5
69
10 x4 9
10
10.0000 −1.0000 2.0000 1.0000 x1 1.0000
0 14.9000 −2.8000 1.1000 x2
2.1000
=
0 −2.8000 5.6000 −3.2000 x3 1.8000
0 1.1000 −3.2000 6.9000 x4 0.9000
Segundo paso k = 2
2.3. ELIMINACIÓN GAUSSIANA 43
10 −1
2 1 x1 1
149
− 14 11 21
0 x2
10 5 10 10
=
756
0
0 149 − 446
149
x3
327
149
446 1016 111
0 0 − 149 149 x4 149
10.0000 −1.0000 2.0000 1.0000 x1 1.0000
0 14.9000 −2.8000 1.1000 x2
2.1000
=
0 0 5.0738 −2.9933 x3 2.1946
0 0 −2.9933 6.8188 x4 0.7450
Tercer paso k = 3
10 −1
2 1 x1 1
149
− 14 11 21
0 x2
10 5 10 10
=
756
0
0 149 − 446
149
x3
327
149
955 257
0 0 0 189 x4 126
10.0000 −1.0000 2.0000 1.0000 x1 1.0000
0 14.9000 −2.8000 1.1000 x2
2.1000
=
0 0 5.0738 −2.9933 x3 2.1946
0 0 0 5.0529 x4 2.0397
Paso 1 k = 4
b4
x4 =
a4,4
2.0397
x4 = = 0.4037
5.0529
44 SIST. LINEALES
Paso 2 k = 3
b3 − a3,4 x4
x3 =
a3,3
2.1946 − (−2.9933)(0.4037)
x3 = = 0.6707
5.0738
Paso 3 k = 2
b2 − a2,3 x3 − a2,4 x4
x2 =
a2,2
2.1000 − (−2.8000)(0.6707) − (1.1000)(0.4037)
x2 = = 0.2372
14.9000
Paso 4 k = 1
La solución en Matlab es
ans =
-0.0508
0.2372
0.6707
0.4037
2.3. ELIMINACIÓN GAUSSIANA 45
Ejemplo 2
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
46 SIST. LINEALES
Ejemplo 3
3 −1 −1 x 0
−1 1 0 y = 1
−1 0 1 z 1
3 −1 −1 x 0
0 2/3 −1/3 y = 1
0 0 1/2 z 3/2
La solución en Matlab es
0
1.0000
1.5000
ans =
2.0000
3.0000
3.0000
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.
2.3. ELIMINACIÓN GAUSSIANA 47
1 2 6
4 8 −1
−2 3 5
1 2 6
0 0 −25
0 7 17
note, que aparece un cero en el elemento 22, lo cual nos da un sistema sin solución. Per-
mutando los renglones 2 y 3 el sistema tiene solución.
1 2 6
−2 3 5
4 8 −1
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
48 SIST. LINEALES
1
3
-3
ans =
0.0057
0.1371
0.1200
2.4. Gauss-Jordan
a1,1 a1,2 a1,3 x1 b1
a2,1 a2,2 a2,3 x2 = b2
a3,1 a3,2 a3,3 x3 b3
Ax = Ib
a1,1 a1,2 a1,3 x1 1 0 0 b1
a2,1 a2,2 a2,3 x2 = 0 1 0 b2
a3,1 a3,2 a3,3 x3 0 0 1 b3
2.4. GAUSS-JORDAN 49
a1,1 a1,2 a1,3 1 0 0 b1
a2,1 a2,2 a2,3 0 1 0 b2 (2.1)
a3,1 a3,2 a3,3 0 0 1 b3
Primer paso
Vamos a despejar la variable x1 del sistema y la sustituimos en las otras dos ecuacio-
nes
b1 − a1,2 x2 − a1,3 x3
= x1 (2.2)
a1,1
Sustituyendo en la ecuación 2
b1 − a1,2 x2 − a1,3 x3
a2,1 + a2,2 x2 + a2,3 x3 = b2
a1,1
a2,1 a2,1 a1,2 a2,1 a1,3
0x1 + b1 + a2,2 − x2 + a2,3 x3 = b2 (2.3)
a1,1 a1,1 a1,1
Sustituyendo en la ecuación 3
b1 − a1,2 x2 − a1,3 x3
a3,1 + a3,2 x2 + a3,3 x3 = b3
a1,1
a3,1 a3,1 a1,2 a3,1 a1,3
0x1 + b1 + a3,2 − x2 + a3,3 − x3 = b3 (2.4)
a1,1 a1,1 a1,1
a1,2 a1,3
1 a1,1 a1,1
1
0 0 b1
x 1 a1,1
a a1,2 a a1,3 a2,1
a2,2 − 2,1 a2,3 − 2,1
0 a1,1 a1,1
x2 = −
a1,1 1 0
b2
a
0
a3,1 a1,2
a3,2 − a1,1
a3,1 a1,3
a3,3 − a1,1 x3 − a3,1 0 1 b3
1,1
a1,2 a1,3 1 1
1 a1,1 a1,1 a1,1 0 0 a1,1 b1
a a1,2 a a1,3 a a
a2,2 − 2,1 a2,3 − 2,1 − a2,1 b2 − a2,1
0 a1,1 a1,1 1 0 b1
1,1 1,1
a3,1 a1,2 a3,1 a1,3 a a
0 a3,2 − a1,1 a3,3 − a1,1 − a3,1
1,1
0 1 b3 − a3,1
1,1
b1
Segundo Paso
Para un sistema equivalente
1 a01,2 a01,3
0 0
x1 c1,1 0 0 b1
0 a02,2 a02,3 x2 = c02,1 1 0 b02 (2.5)
0 a03,2 a03,3 x3 c03,1 0 1 b03
Despejamos x2 de la ecuación 2
Sustituyendo en la ecuación 1
!
c02,1 b01 + b02 − a02,3 x3
x1 + a01,2 + a01,3 = c01,1 b01
a02,2
! !
0
a01,2 a02,3 0 0
a01,2 c02,1 a02,1 0
x1 + 0x2 + a1,3 − x3 = c1,1 b1 − − 0 b2
a02,2 a02,2 a2,2
Sustituyendo en la ecuación 3
! !
a03,2 a02,3 a03,2 c02,1 a03,2 0
0x1 + 0x2 + a03,3 − x3 = c03,1 − b01 − b 2 + b0 3
a02,2 a02,2 a02,2
En forma matricial
Tercer Paso
Dado el sistema equivalente
1 0 a001,3
00
c1,1 c001,2 0
00
x1 b1
0 1 a002,3 x2 = c002,1 c002,2 0 b002
0 0 a003,3 x3 c003,1 c003,2 1 b003
a00 00
1,3 c3,2 a00
c001,1 c001,2 − 00 − a1,3
00
a3,3
b001
1 0 0 x1 3,3
a00 a00
00
c002,1
0 1 0 x2 = 00
c2,2 − a2,300 − a2,3
00 b2
3,3 3,3
0 0 1 x3 b003
00
c00
c3,1 3,2 1
a00
3,3 a00
3,3 a00
3,3
Como resultado tenemos que la matrix c00 es la inversa de nuestro sistema y b00 la solución
del sistema de ecuaciones
Resumen
Dado el sistema
a1,1 a1,2 a1,3 · · · a1,M
a2,1 a2,2 a2,3 · · · a2,M
a3,1 a3,2 a3,3 · · · a3,M
Paso 1
Dividimos la primer ecuación entre a1,1
1
a1,1 a1,1 a1,2 a1,3 ··· a1,M
a2,1 a2,2 a2,3 ··· a2,M
a3,1 a3,2 a3,3 ··· a3,M
Paso 2
Dividimos la segunda ecuación entre a2,2
a1,1 a1,2 a1,3 ··· a1,M
1
a2,2
a2,1 a2,2 a2,3 ··· a2,M
a3,1 a3,2 a3,3 ··· a3,M
a2,1 a2,3 a2,M
a1,1 − a1,2 a2,2 0 a1,3 − a1,2 a2,2 ··· a1,M − a1,2 a2,2
a2,1 a2,3 a2,M
a2,2 1 a2,2 ··· a2,2
a3,1 a3,2 a3,3 ··· a3,M
2.4. GAUSS-JORDAN 53
Paso 3
Dividimos la tercera ecuación entre a3,3
a1,1 a1,2 a1,3 ··· a1,M
a2,1 a2,2 a2,3 ··· a2,M
1
a3,3 a3,1 a3,2 a3,3 ··· a3,M
a3,1 a3,2 a3,M
a1,1 − a1,3 a3,3 a1,2 − a1,3 a3,3 0 ··· a1,M − a1,3 a3,3
a2,1 a2,2 a2,3 ··· a2,M
a3,1 a3,2 a3,M
a3,3 a3,3 1 ··· a3,3
a3,1 a3,2 a3,M
a1,1 − a1,3 a3,3 a1,2 − a1,3 0 ··· a1,M − a1,3
a3,3 a3,3
a3,1 a a
a −
2,1 a2,3 a3,3 a2,2 − a2,3 a3,2
3,3
0 ··· a2,M − a2,3 a3,M
3,3
a3,1 a3,2 a3,M
a3,3 a3,3 1 ··· a3,3
Note la similitud del método con el método de sumas y restas. No olvidar que este método
es equivalente al calculo parcial de la matriz inversa. El método se ilustra mejor con un
ejemplo.
2.4.1. Ejemplo 1
30x1 − x2 − 2x3 = 78
x1 + 70x2 − 3x3 = −193
3x1 − 2x2 + 100x3 = 714
Primero exprese los coeficientes y el lado derecho como una matriz aumentada
30 −1 −2 1 0 0 78
1 70 −3 0 1 0 −193
3 −2 100 0 0 1 714
Primer iteración
Luego se normaliza el primer renglón, al dividirlo entre el elemento pivote, 30, se obtie-
ne
1 1 1 13
1 − 30 − 15 30 0 0 5
1
70 −3 0 1 0 −193
3 −2 100 0 0 1 714
El término x1 se puede eliminar del segundo renglón restando el primer renglón multiplicado
por 1 del segundo renglón. En forma similar restando el primer renglón multiplicando por
3 eliminará el término x1 del tercer renglón
2.4. GAUSS-JORDAN 55
1 1 1 13
1 − 30 − 15 30 0 0 5
0 2101 − 44 1
− 978
30 15 − 30 1 0 5
0 − 19
10
501
5
1
− 10 0 1 3531
5
1. −0.0333 −0.0667 0.0333 0. 0. 2.6
0. 70.0333 −2.9333 −0.0333 1. 0. −195.6
0. −1.9 100.2 −0.1 0. 1. 706.2
Segunda Iteración
2101
En seguida, se normaliza el segundo renglón dividiéndolo entre 30
1 1 1 13
1 − 30 − 15 30 0 0 5
8 1 30
− 5868
0
1 − 191 − 2101 2101 0 2101
19 501 1 3531
0 − 10 5 − 10 0 1 5
1. −0.0333 −0.0667 0.0333 0. 0. 2.6
0. 1. −0.0419 −0.0005 0.0143 0. −2.793
0. −1.9 100.2 −0.1 0. 1. 706.2
1. 0. −0.0681 0.0333 0.0005 0. 2.5069
0. 1. −0.0419 −0.0005 0.0143 0. −2.793
0. 0. 100.12 −0.1009 0.0271 1. 700.893
Tercer iteración
19123
El tercer renglón se normaliza entonces al dividirlo entre 191
56 SIST. LINEALES
13 70 1 5267
1 0 − 191 2101 2101 0 2101
0 1 − 8 1 30
− 5868
191 − 2101 2101 0 2101
212 57 191 1472577
0 0 1 − 210353 210353 19123 210353
1. 0. −0.0681 0.0333 0.0005 0. 2.5069
0. 1. −0.0419 −0.0005 0.0143 0. −2.793
0. 0. 1. −0.001 0.0003 0.01 7.0005
Por último, los términos x3 se pueden reducir de la primera y segunda ecuación para
obtener
538 8 1 48274
1 0 0 16181 16181 1471 16181
0 1 0 − 109 3006 8
− 525828
210353 210353 19123 210353
212 57 191 1472577
0 0 1 − 210353 210353 19123 210353
1. 0. 0. 0.0332 0.0005 0.0007 2.9834
0. 1. 0. −0.0005 0.0143 0.0004 −2.4997
0. 0. 1. −0.001 0.0003 0.01 7.0005
2.4.2. Ejemplo 2
1 1 2 x1 −1
1 3 −6 x2 = 7
2 −1 2 x3 0
1 1 2 −1
1 3 −6 7
2 −1 2 0
Primer iteración
2.4. GAUSS-JORDAN 57
1 1 2 −1
0 2 −8 8
0 −3 −2 2
Segunda iteración
1 0 6 −5
0 1 −4 4
0 0 −14 14
Tercer iteración
1 0 0 1
0 1 0 0
0 0 1 −1
2.4.3. Ejemplo 3
10 −1 2 1 x1 1
−1 15 −3 1 x2 2
=
2 −3 6 −3 x3 2
1 1 −3 7 x4 1
Primer iteración
58 SIST. LINEALES
1 1 1 1 1
1 − 10
5 10 10 0 0 0 10
0 149 − 14 11 1 21
10 5 10 10 1 0 0 10
0 − 14 28
− 16 − 51 0 1 0 9
5 5 5 5
11
0 10 − 16
5
69
10
1
− 10 0 0 1 9
10
1.0000 −0.1000 0.2000 0.1000 0.1000 0 0 0 0.1000
0 14.9000 −2.8000 1.1000 0.1000 1.0000 0 0 2.1000
0 −2.8000 5.6000 −3.2000 −0.2000 0 1.0000 0 1.8000
0 1.1000 −3.2000 6.9000 −0.1000 0 0 1.0000 0.9000
Segunda iteración
27 16 15 1 17
1 0 149 149 149 149 0 0 149
0 1 − 28 11 1 10 21
149 149 149 149 0 0 149
756
0 0
149 − 446
149
27
− 149 28
149 1 0 327
149
446 1016 16 11 111
0 0 − 149 149 − 149 − 149 0 1 149
1.0000 0 0.1812 0.1074 0.1007 0.0067 0 0 0.1141
0 1.0000 −0.1879 0.0738 0.0067 0.0671 0 0 0.1409
0 0 5.0738 −2.9933 −0.1812 0.1879 1.0000 0 2.1946
0 0 −2.9933 6.8188 −0.1074 −0.0738 0 1.0000 0.7450
Tercer iteración
3 3 1 1
0 − 28
1 0 0 14 28 0 28
0 1 0 −1 2 1 2
27 0 27 27 0 9
0 0 1 − 223 1
− 28 1 149
0 109
378 27 756 252
955 3 1 223 257
0 0 0 189 − 14 27 378 1 126
2.5. INVERSA DE SHIPLAY 59
1.0000 0 0 0.2143 0.1071 0.0000 −0.0357 0 0.0357
0 1.0000 0 −0.0370 0 0.0741 0.0370 0 0.2222
0 0 1.0000 −0.5899 −0.0357 0.0370 0.1971 0 0.4325
0 0 0 5.0529 −0.2143 0.0370 0.5899 1.0000 2.0397
Cuarta iteración
111 3 58 81 97
− 1910 − 955 − 1910 − 1910
1 0 0 0 955
0 1 0 0 − 3 71 79 7 453
1910 955 1910 955 1910
0 0 1 0 − 58 79 254 223 1281
955 1910 955 1910 1910
81 7 223 189 771
0 0 0 1 − 1910 955 1910 955 1910
1.0000 0 0 0 0.1162 −0.0016 −0.0607 −0.0424 −0.0508
0 1.0000 0 0 −0.0016 0.0743 0.0414 0.0073 0.2372
0 0 1.0000 0 −0.0607 0.0414 0.2660 0.1168 0.6707
0 0 0 1.0000 −0.0424 0.0073 0.1168 0.1979 0.4037
a1,1 a1,2 a1,3 x1 b1
a2,1 a2,2 a2,3 x2 = b2
a3,1 a3,2 a3,3 x3 b3
b1 − a1,2 x2 − a1,3 x3
x1 =
a1,1
b1 a1,2 a1,3
− x2 − x3 = x1
a1,1 a1,1 a1,1
60 SIST. LINEALES
a3,1 a3,1 a1,2 a3,1 a1,3
b1 + a3,2 − x2 + a3,3 − x3 = b3
a1,1 a1,1 a1,1
1/a1,1 a1,2 /a1,1 a1,3 /a1,1 b1 x1
a2,1 /a1,1 a2,2 − a2,1 a1,2 /a1,1 a2,3 − a2,1 a1,3 /a1,1 x2 = b2
a3,1 /a1,1 a3,2 − a3,1 a1,2 /a1,1 a3,3 − a3,1 a1,3 /a1,1 x3 b3
a01,1 − a01,2 a02,1 /a02,2 a01,2 /a02,2 a01,3 − a01,2 a02,3 /a02,2
b1 x1
−a02,1 /a02,2 1/a02,2 −a02,3 /a02,2 b2 = x2
0 0 0 0 0 0 0 0
a3,1 − a3,2 a2,1 /a2,2 a3,2 /a2,2 a3,3 − a3,2 a2,3 /a2,20 0 x3 b3
a001,1 − a001,3 a003,1 /a003,3 a001,2 − a001,3 a003,2 /a003,3 a001,3 /a003,3
b1 x1
a002,1 − a002,3 a003,1 /a003,3 a002,2 − a002,3 a003,2 /a003,3 a002,3 /a003,3 b2 = x2
a003,1 /a003,3 a003,2 /a002,2 /a003,3 1/a003,3 b3 x3
2.5.1. Ejemplo:
3 −1 −1
−1 1 0
−1 0 1
Primer paso:
1/3 1/3 1/3
−1/3 2/3 −1/3
−1/3 −1/3 2/3
Segundo paso:
1/2 1/2 1/2
1/2 3/2 1/2
−1/2 −1/2 1/2
Tercer paso:
1 1 1
1 2 1
1 1 2
ans =
10 −1 −1 −1 1 x1 1
1 4 0 0 0
x2
2
A=
1 0 4 0 0 x3
=
3
1 0 0 4 0 x4
4
1 0 0 0 3 x5 5
Para ésta matriz el total de elementos es 25 de los cuales 13 son diferentes de cero y 12 son
igual cero. A este tipo de matrices o sistemas de ecuaciones se les conoce como dispersos o
ralos dado que tienen una cantidad de ceros igual o mayor que los diferentes de cero.
Para este tipo de sistema cuando calculamos la solución por lo métodos dados tene-
mos
Descomposición LU
>> Factorizacion(A)
ans =
ans =
Note que en todos los casos la dispersidad se pierde y tenemos una matriz con números
diferentes de cero ahı́ donde existı́an ceros.
En este caso una opción es el manejo de Matrices Ralas del Matlab para no almacenar los
valores iguales a cero y utilizar métodos iterativo como los de la siguiente sección.
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);
a1,1 a1,2 a1,3 x1 b1
a2,1 a2,2 a2,3 x2 = b2
a3,1 a3,2 a3,3 x3 b3
b1 − a1,2 x2 − a1,3 x3
x1 =
a1,1
b2 − a2,1 x1 − a2,3 x3
x2 =
a2,2
b3 − a3,1 x1 − a3,2 x2
x3 =
a3,3
(t) (t)
(t+1) b1 − a1,2 x2 − a1,3 x3
x1 =
a1,1
(t) (t)
(t+1) b2 − a2,1 x1 − a2,3 x3
x2 =
a2,2
(t) (t)
(t+1) b3 − a3,1 x1 − a3,2 x2
x3 =
a3,3
PN (t)
(t+1) bk – l=1,l6=k ak,l xl
xk =
ak,k
La implementación en Matlab es
function y = Jacobi(A, x, b)
N = length(x);
y = zeros(N,1);
for iter=1:100000
for k = 1:N
suma =0;
for l= 1:N
if k ~= l
suma = suma + A(k,l)*x(l);
end;
66 SIST. LINEALES
end;
y(k) = (b(k) - suma)/A(k,k);
end;
if sqrt(norm(x-y)) < 1e-6
break;
else
x = y;
end;
end;
El cambio que debemos hacer respecto al de Jacobi, es que las variables nuevas son uti-
lizadas una vez que se realiza el cálculo de ellas ası́, para un sistema de tres ecuaciones
tendremos:
(t) (t)
(t+1) b1 − a1,2 x2 − a1,3 x3
x1 =
a1,1
(t+1) (t)
(t+1) b2 − a2,1 x1 − a2,3 x3
x2 =
a2,2
(t+1) (t+1)
(t+1) b3 − a3,1 x1 − a3,2 x2
x3 =
a3,3
La implementación en Matlab es
function y = Gauss_Seidel(A, x, b)
N = length(x);
y = zeros(N,1);
for iter=1:100000
for k = 1:N
suma =0;
for l= 1:N
if k ~= l
suma = suma + A(k,l)*x(l);
end;
2.7. MÉTODO ITERATIVO DE JACOBI Y GAUSS-SEIDEL 67
end;
x(k) = (b(k) - suma)/A(k,k);
end;
if sqrt(norm(x-y)) < 1e-6
break;
else
y=x;
end;
end;
Ejemplo
4 −1 1 x1 7
4 −8 1 x2 = −21
−2 1 5 x3 15
ans =
68 SIST. LINEALES
2.0000
4.0000
3.0000
La solución utilizando Gauss-Seidel es :
k x1 x2 x3
1 1.0000 2.0000 2.0000
2 1.7500 3.7500 2.9500
3 1.9500 3.9688 2.9863
4 1.9956 3.9961 2.9990
5 1.9993 3.9995 2.9998
6 1.9999 3.9999 3.0000
7 2.0000 4.0000 3.0000
8 2.0000 4.0000 3.0000
Note que Gauss-Seidel requiere de 7 iteraciones mientras Jacobi de 11, para convergir. Para
correr hacer
>> Gauss_Seidel([4 -1 1; 4 -8 1; -2 1 5], [1,2,2]’, [7,-21, 15]’)
ans =
2.0000
4.0000
3.0000
10 −1 −1 −1 1 x1 1
1 4 0 0 0 x2
2
A=
1 0 4 0 0 x3
=
3
1 0 0 4 0 x4 4
1 0 0 0 3 x5 5
A = sparse(5,5);
A(1,1) = 10;
A(1,2) = -1;
A(1,3) = -1;
2.7. MÉTODO ITERATIVO DE JACOBI Y GAUSS-SEIDEL 69
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
70 SIST. LINEALES
Solución de Ecuaciones No lineales
3.1. Introducción
Una ecuación no lineal es aquella que tiene una forma diferente a f (x) = a0 + a1 x en cuyo
caso calcular la solución consiste en resolver despejando de x = −a0 /a1 . Pero el caso es
que queremos resolver un sistema de ecuaciones no lineales de la forma
f1 (x1 , x2 , · · · , xN ) = 0
f2 (x1 , x2 , · · · , xN ) = 0
.. .
. = ..
fn (x1 , x2 , · · · , xN ) = 0
f1 (x1 , x2 , · · · , xn ) = 0
f2 (x1 , x2 , · · · , xn ) = 0
.. .
. = ..
fn (x1 , x2 , · · · , xn ) = 0
71
72 SIST. NO LINEALES
El método de iteración de punto fijo intentara despejar de cada una de la las ecuaciones
fi (x1 , x2 , · · · , xn ) la i-esima variable tal que
x1 − g1 (x1 , x2 , · · · , xn ) = f1 (x1 , x2 , · · · , xn )
x2 − g2 (x1 , x2 , · · · , xn ) = f2 (x1 , x2 , · · · , xn )
.. .
. = ..
xn − gn (x1 , x2 , · · · , xn ) = fn (x1 , x2 , · · · , xn )
La implementación en Matlab es
function r = Punto_Fijo(g, x1)
while 1
x2 = g(x1)
error = abs(norm((x2-x1)/x2));
if(error < 0.0001) break
else x1 = x2;
end;
end;
r = x2;
Ejemplo 1
Utilice el método de iteración de punto fijo para determinar las raı́ces del sistema de
(0) (0)
ecuaciones dado. Considere como valores iniciales x1 = 1.5 y x2 = 3.5.
x21 + x1 x2 − 10 = 0
x2 + 3x1 x22 − 57 = 0
3.2. MÉTODOS DE PUNTO FIJO 73
√
f1 (x1 , x2 ) = x1 − 10 − x1 x2
r
57 − x2
f2 (x1 , x2 ) = x2 −
3x1
q
(t+1) (t) (t)
x1 = 10 − x1 x2
v
u 57 − x(t)
u
(t+1) 2
x2 = t (t+1)
3x1
La implementación en Matlab es
function x = g1(x)
q
(1) (0) (0)
p
x1 = 10 − x1 x2 = 10 − (1.5)(3.5) = 2.1794
v s
u 57 − x(0)
u
(1) 2 57 − (3.5)
x2 = t (1)
= = 2.8605
3x1 3(2.1794)
Iteración 2
Con x(1) = [2.1794, 2.8605]T tenemos
q
(2) (1) (1)
p
x1 = 10 − x1 x2 = 10 − (2.1794)(2.8605) = 1.9405
v s
u 57 − x(0)
u
(2) 2 57 − (2.8605)
x2 = t (1)
= = 3.0496
3x1 3(1.9405)
74 SIST. NO LINEALES
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.
(k) (k)
k x1 x2
0 1.5000 3.5000
1 2.1794 2.8605
2 1.9405 3.0496
3 2.0205 2.9834
4 1.9930 3.0057
5 2.0024 2.9981
6 1.9992 3.0007
7 2.0003 2.9998
8 1.9999 3.0001
9 2.0000 3.0000
Ejemplo 2
Utilice el método de iteración de punto fijo para determinar las raı́ces del sistema de
(0) (0)
ecuaciones dado. Considere como valores iniciales x1 = 0.0 y x2 = 1.0.
√
f1 (x1 , x2 ) = x1 − 2x1 + x2 − 0.5
r
4 − x21
f2 (x1 , x2 ) = x2 −
4
q
(t+1) (t) (t)
x1 = 2x1 + x2 − 0.5
v
u 4 − x(t+1) 2
u
(t+1)
t 1
x2 =
4
La implementación en Matlab es
function x = g2(x)
Iteración 1
q
(1) (0) (0)
p
x1 = 2x1 + x2 − 0.5 = 2(0) + (1) − 0.5 = 0.7071
v
u 4 − x(1) 2 r
u
(1)
t 1 4 − (0.7071)2
x2 = = = 0.9354
4 4
Iteración 2
q
(2) (1) (1)
p
x1 = 2x1 + x2 − 0.5 = 2(0.7071) + (0.9354) − 0.5 = 1.3600
v
u 4 − x(2) 2 r
u
(2)
t 1 4 − (1.3600)2
x2 = = = 0.7332
4 4
El resumen el proceso iterativo se muestra en la siguiente tabla, donde podemos ver que la
solución es x∗ = [1.9007, 0.3112]T en 8 iteraciones.
76 SIST. NO LINEALES
(k) (k)
k x1 x2
0 0.0000 1.0000
1 0.7071 0.9354
2 1.3600 0.7332
3 1.7185 0.5116
4 1.8570 0.3713
5 1.8935 0.3220
6 1.8997 0.3127
7 1.9006 0.3114
8 1.9007 0.3112
Para realizar la ejecución dar en Matlab
Punto_Fijo(@g2, [0; 1])
if(f(mitad) == 0)
r = mitad;
return;
end;
if f(inicio)*f(mitad) < 0
3.4. MÉTODO DE REGULA FALSI 77
fin = mitad;
else
inicio = mitad;
end;
end;
r= mitad;
3.3.1. Ejemplo
Biseccion(@f2, 0, 1)
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.3 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.
function r = Regula_Falsi(f, a, b)
if(f(c) == 0)
r = c;
return;
end;
if f(a)*f(c) < 0
b = c;
else
a = c;
end;
end;
r= c;
Regula_Falsi(@f2, 0, 1)
3.4.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].
Consideremos un circuito de corriente alterna formado por una fuente, una resistencia y
un diodo tal como se muestra en la figura 3.4.
La ecuación que modela al diodo esta dada por (3.6) y la curva se muestra en la figura
3.5:
log(Id (t)/Is + 1) ∗ Vt Si Id (t) ≥ 0
Vd (t) =
V sino Id(t) < 0
155
x 10
12
10
6
Id
0
5 5.5 6 6.5 7 7.5 8 8.5 9 9.5 10
Vd
%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
82 SIST. NO LINEALES
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
−2
−4
−6
−8
−10
0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1
tiempo s
f1 (x1 , x2 , · · · , xn ) = 0
f2 (x1 , x2 , · · · , xn ) = 0
.. .
. = ..
fn (x1 , x2 , · · · , xn ) = 0
Utilizando la serie de Taylor podemos hacer una aproximación lineal para una función
(t) (t) (t) (t) (t) (t) (t) (t+1) (t)
fi (x1 +δx1 , x2 +δx2 , · · · , xn +δxn ) en un incremento δxi = xi −xi como:
84 SIST. NO LINEALES
En forma compacta
h i−1
x(t+1) = x(t) − J(x(t) ) f (x(t) )
while 1
x2 = x1 - inv(J(x1))* f(x1);
if norm((x1-x2)./x2) < 0.0001 break;
else x1 = x2;
end;
end;
r = x2;
3.5.1. Ejemplo 1
Resolver el siguiente sistema de ecuaciones dado por y cuya gráfica se muestra en la Figura
3.7
f1 (x1 , x2 ) = x21 + x1 x2 − 10
f2 (x1 , x2 ) = x2 + 3x1 x22 − 57
El Jacobiano es
2x1 + x2 x1
J(x) = 2
3x2 1 + 6x1 x2
y el arreglo de funciones
x21 + x1 x2 − 10
f (x) =
x2 + 3x1 x22 − 57
10
x2
0
-5
-10
-10 -5 0 5 10
x1
" # −1
(1)
x1 1.5000 6.5000 1.5000 −2.5000 2.0360
(1) = − =
x2 3.5000 36.7500 32.5000 1.6250 2.8439
Segunda iteración
" # −1
(2)
x1 2.0360 6.9159 2.0360 −0.0644 1.9987
(2) = − =
x2 2.8439 24.2629 35.7413 −4.7562 3.0023
Tercer iteración
" # −1
(3)
x1 1.9987 6.9997 1.9987 −0.0045 2.0000
(3) = − =
x2 3.0023 27.0412 37.0041 0.0496 3.0000
Cuarta iteración
" # −1
(4)
x1 2.0000 7.0000 2.0000 −0.00000129 2.0000
(4) = − =
x2 3.0000 27.0000 37.0000 −0.00002214 3.0000
3.5. EL MÉTODO NEWTON RAPHSON 87
Note que solamente 4 iteraciones son necesarias para llegar a la solución x = [2, 3]T
function f = f1(x)
n = length(x);
f = zeros(n,1);
El Jacobiano
function J = J1(x)
n = length(x);
J = zeros(n, n);
y la ejecución
ans =
2.0000
3.0000
3.5.2. Ejemplo 2
Resolver el siguiente sistema de ecuaciones dado por las ecuaciones y cuya solución gráfica
se muestra en la figura 3.8
88 SIST. NO LINEALES
x2
0
-1
-2
-2 -1 0 1 2
x1
El Jacobiano es
2x1 − 2 −1
J(x) =
2x1 8x2
y el arreglo de funciones
" # −1
(1)
x1 0 −2 −1 −0.5 −0.25
(1) = − =
x2 1 0 8 0.0 1.00
3.5. EL MÉTODO NEWTON RAPHSON 89
Segunda iteración
" # −1
(2)
x1 −0.2500 2.5000 −1.0000 0.0625 −0.2226
(2) = − =
x2 1.0000 −0.5000 8.0000 0.0625 0.9939
Tercer iteración
" # −1
(3)
x1 −0.2226 −2.4451 −1.0000 −0.0008 −0.2222
(3) = − =
x2 0.9939 −0.4451 7.9512 0.0009 0.9938
Cuarta iteración
" # −1
(4)
x1 −0.2222 −2.4444 −1.0000 −0.00002300 −0.2222
(4) = − =
x2 0.9938 −0.4444 7.9505 0.00000038 0.9938
n = length(x);
f = zeros(n,1);
ans =
-0.2222
0.9938
3.5.3. Ejemplo
Para el circuito que se muestra en la figura 3.9, 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.
V1 − R1 (i1 + i2 ) − L1 /i1 = 0
V1 − R1 (i1 + i2 ) − R2 i2 − L2 /i2 = 0
V i1 − R1 (i1 + i2 )i1 − L1
F = =0
V i2 − R1 (i1 + i2 )i2 − R2 i22 − L2
function f = Fun(i)
N = length(i);
f = zeros(N,1);
3.5. EL MÉTODO NEWTON RAPHSON 91
V = 100;
R1 = 2;
R2 = 3;
L1 = 100;
L2 = 200;
V − R1 (2i1 + i2 ) −i1 R1
J=
−i2 R1 V1 − R1 (i1 + 2i2 ) − 2R2 i2
function J = JacSistema(i)
V = 100;
R1 = 2;
R2 = 3;
%L1 = 100;
%L2 = 200;
I =
92 SIST. NO LINEALES
1.0728
2.3185
Ejemplo
f (x(k) )
x(k+1) = x(k) −
f 0 (x(k+1) )
10
(k+1) (k) x(k) −1
x =x − 9
10 x(k)
El ejemplo más simple de una aproximación por mı́nimos cuadrados es mediante el ajuste
de un conjunto de pares de observaciones: [x1 , y1 ], [x2 , y2 ], [x3 , y3 ],..., [xn , yn ] a una lı́nea
recta. La expresión matemática de la lı́nea recta es:
y = a0 + a1 x + e
donde a0 y a1 , son los coeficientes que representan el cruce con el eje y y la pendiente de
la lı́nea y e representa el error de nuestra aproximación. En la figura ??, se muestra un
ejemplo de puntos a los que se les desea ajustar a una linea recta.
y
6
x
2 3 4 5 6
95
96 AJUSTE DE CURVAS
Una estrategia, para ajustar a la mejor lı́nea, es minimizar la suma al cuadrado de los
errores para todos los datos disponibles
n
X n
X
E(a) = e2i = (yi − a0 − a1 xi )2
i=1 i=1
e1
e2
E(a) = [e1 , e2 , · · · , en ]
..
.
en
a0
ei = yi − [1, xi ]
a1
y en general
e1 y1 1 x1
e2 y2 1 x2
a0
e3 =
y3 −
1 x3
.. .. a1
.. ..
. . . .
en yn 1 xn
∂E(a) ∂
= [y − M a]T [y − M a] = 0
∂a ∂a
∂E(a)
= −2M T [y − M a] = 0
∂a
4.1. REGRESIÓN LINEAL POR EL MÉTODO DE MÍNIMOS CUADRADOS 97
[M T M ]a = M T y
Pn Pn Pn
1 x a0 yi
Pni=1 Pni=1 2i = Pn
i=1
i=1 xi i=1 xi a1 i=1 xi yi
N = length(x);
M = ones(N, 1);
for k=1:grado
M = [M,x.^k];
end
a=inv(M’*M)*M’*y;
end
4.1.2. Ejemplo 1
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
1 1.00
1 2.00
1 3.00
M =
1 4.00
1 5.00
1 6.00
1 7.00
1 1.00
1 2.00
1 3.00
1 1 1 1 1 1 1 7.00 28.00
MT M =
1 4.00 =
1.00 2.00 3.00 4.00 5.00 6.00 7.00 28.00 140.00
1 5.00
1 6.00
1 7.00
0.50
2.50
2.00
1 1 1 1 1 1 1 24.00
MT y =
4.00 =
1.00 2.00 3.00 4.00 5.00 6.00 7.00 119.50
3.50
6.00
5.50
7.00 28.00 a0 24.00
=
28.00 140.00 a1 119.50
y
6
x
1 2 3 4 5 6 7
Ma = y
[M T M ]a = M T y (4.7)
a = [M T M ]−1 [M T y]
100 AJUSTE DE CURVAS
4.1.4. Ejemplo 2
6.00 15.00 55.00 a0 152.60
15.00 55.00 225.00 a1 = 585.60
55.00 225.00 979.00 a2 2488.80
El modo más simple de interpolación es conectar dos puntos con una lı́nea recta. Esta técni-
ca, llamada interpolación lineal, la podemos representar por la siguiente formulación, la cual
se calcula considerando que se tienen dos puntos P1 = [x1 , f (x1 )]T y P0 = [x0 , f (x0 )]T
4.2. INTERPOLACIÓN LINEAL 101
60
50
40
30
20
x
1 2 3 4 5
f (x1 ) − f (x0 )
f (x) = f (x0 ) + (x − x0 )
x1 − x0
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
end
102 AJUSTE DE CURVAS
4.2.1. Ejemplo 1
x y
0.00 2.10
1.00 7.70
2.00 13.60
3.00 27.20
4.00 40.90
5.00 61.10
Implementar el código correspondiente para graficar los puntos intermedios a los valores
dados utilizando interpolación lineal
x = [0,1,2,3,4,5];
y = [2.1, 7.70, 13.60, 27.20, 40.90, 61.10];
x_nva = 0:0.01:5;
N = length(x_nva);
y_nva = zeros(N, 1);
for k=1:N
y_nva(k) = Interpolacion_Lineal(x_nva(k), x, y);
end;
El error que se observa en la figura 4.13, 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
4.3. INTERPOLACIÓN CUADRÁTICA 103
70
60
50
40
f(x)
30
20
10
0
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
x
q(x) = b0 + b1 (x − x0 ) + b2 (x − x0 )(x − x1 )
por lo tanto
b0 = f (x0 )
despejando tenemos
f (x1 ) − f (x0 )
b1 =
x1 − x0
104 AJUSTE DE CURVAS
f (x1 ) − f (x0 )
f (x0 ) = f (x0 ) + (x2 − x0 ) + b2 (x2 − x0 )(x2 − x1 )
x1 − x0
despejando tenemos
4.3.1. Ejemplo 1
b0 = 0
El coeficiente b2 tenemos
1.791759−1.386294
6−4 − 0.4620981
b2 = = −0.0518731
6−1
q(x) = b0 + b1 (x − x0 ) + b2 (x − x0 )(x − x1 )
4.3. INTERPOLACIÓN CUADRÁTICA 105
En Matlab dar
Interpolacion_Newton(2, [1, 4, 6] , [0, 1.386294, 1.791759])
ans =
0.5658
4.3.2. Ejemplo 2
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;
106 AJUSTE DE CURVAS
end;
end;
l = m+grado;
if l > M
l = M;
end;
70
60
50
40
f(x)
30
20
10
0
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
x
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
Como se hizo antes con las interpolaciones lineales y cuadráticas, los puntos de los datos
evaluaban los coeficientes b0 , b1 , · · · , bn . Para un polinomio de n-ésimo orden se requiere
n + 1 puntos: [x0 , f (x0 )], [x1 , f (x1 )], ..., [xn , f (xn )]. Usamos estos datos y las siguientes
ecuaciones para evaluar los coeficientes
b0 = f (x0 )
b1 = f [x1, x0 ]
b2 = f [x2 , x1 , x0 ]
..
.
bn = f [xn , xn−1 , · · · , x1 , x0 ]
donde las evaluaciones de la función puestas entre paréntesis son diferencias divididas
finitas. Por ejemplo, la primera diferencia dividida finita se representa por lo general co-
mo
f (xi ) − f (xj )
f [xi , xj ] =
xi − xj
La segunda diferencia dividida finita, la cual representa la diferencia de las dos primeras
diferencias divididas, se expresa por lo general como
f [xi , xj ] − f [xj , xk ]
f [xi , xj , xk ] =
xi − xk
Estas diferencias pueden usarse para evaluar los coeficientes en la ecuación 4.8, las cuales
entonces se sustituirán en la siguiente ecuación, para ası́ obtener el polinomio de interpo-
lación
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;
4.4. FORMULAS DE INTERPOLACIÓN DE NEWTON 109
end
4.4.1. Ejemplo 1
Calcular el logaritmo de 2 utilizando la interpolación de Newton y los valores [1, 0], [4, 1.386294],
[6, 1.791759] y [5, 1.609438]
La solución la llevaremos a cabo de forma tabular
i xi f (xi ) Primero Segundo Tercero
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
4.4.2. Ejemplo 2
x_nva = 0:0.01:5;
110 AJUSTE DE CURVAS
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;
n
X
fn (x) = Li (x)f (xi )
i=0
donde
4.5. INTERPOLACIÓN DE POLINOMIOS DE LAGRANGE 111
70
60
50
40
f(x)
30
20
10
0
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
x
n
Y x − xj
Li (x) =
xi − xj
j=0
j 6= i
x − x1 x − x0
f1 (x) = f (x0 ) + f (x1 )
x0 − x1 x1 − x0
suma = 0;
112 AJUSTE DE CURVAS
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
4.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
2−4 2−1
f1 (x) = 0+ 1.386294 = 0.4620981
1−4 4−1
Como era de esperar, ambos resultados concuerdan con los que se obtuvieron utilizando
interpolación utilizando polinomios de Newton.
Diferenciación e Integración
df (x) f (x) − f (x − h)
= lı́m
dx h→0 h
df (x) f (x) − f (x − h)
≈
dx h
df (x) f (x + h) − f (x)
≈
dx h
Considerando que los incrementos se dan hacia adelante y hacia atrás, podemos dar una
representación de la derivada centrada como
df (x) f (x + h) − f (x − h)
≈
dx 2h
113
114 DIFERENCIACIÓN E INTEGRACIÓN
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)
Z b Z b
I= f (x)dx ≈ f (a)dx = f (a)x|ba = f (a) ∗ (b − a)
a a
5.2.1. Ejemplo
Para la función f (x) = 0.2 + 25x − 200x2 + 675x3 − 900x4 + 400x5 , calcular la integral
utilizando el método de barras en el intervalo a = 0 b = 0.8 .
En Matlab
>> Barras(@f1, 0, 0.8, 1)
ans =
0.1600
Para una mejor aproximación podemos hacer N divisiones de la región de tamaño h y
aproximar la integral como:
Z b N
X −1
f (x)dx ≈ f (a + kh) ∗ h
a k=0
h = abs(b-a)/N;
suma = 0;
for k=0:N-1
5.3. INTEGRACIÓN POR EL MÉTODO DE TRAPEZOIDES 115
I = suma*h;
end
Suponer que todos los rectángulos son de altura constante es una suposición fuerte. En
lugar de ello supondremos, para este método, que los rectángulos varı́an linealmente de
acuerdo con la siguiente ecuación
(x − a)
f (x) = f (a) + (f (b) − f (a))
b−a
A partir de esto podemos hacer la aproximación de nuestra integral
Z b Z b
(x − a)
I= f (x)dx ≈ f (a) + (f (b) − f (a)) dx
a a b−a
f (b) + f (a)
I≈ (b − a)
2
La cual es el área de un trapecio de altura menor f (a) y altura mayor f (b).
5.3.1. Ejemplo
Para la función f (x) = 0.2 + 25x − 200x2 + 675x3 − 900x4 + 400x5 , calcular la integral
utilizando el método de la Regla Trapezoidal en el intervalo a = 0 b = 0.8 .
ans =
0.1728
Si aplicamos la formula para N divisiones de tamaño h tenemos que la regla trapezoidal
la podemos calcular como
PN −1
f (a) + 2 k=1 f (a + kh) + f (b)
I ≈ (b − a)
2N
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
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
Z b
f (x0 ) + 4f (x1 ) + f (x2 )
I≈ f (x)dx = (b − a)
a 6
5.4.1. Ejemplo
Para la función f (x) = 0.2 + 25x − 200x2 + 675x3 − 900x4 + 400x5 , calcular la integral
utilizando el método Simpson 1/3 en el intervalo a = 0 b = 0.8 .
ans =
1.3675
La implementación para N divisiones de tamaño h es:
PN −1 PN −1
f (xa ) + 4 k=1,3,5,··· f (a + k ∗ h) + 2 k=2,4,6,··· f (a + k ∗ h) + f (b)
I ≈ (b − a)
3N
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
118 DIFERENCIACIÓN E INTEGRACIÓN
end
(x − x1 )(x − x2 )(x − x3 )
f (x) = f (x0 )
(x0 − x1 )(x0 − x2 )(x0 − x3 )
(x − x0 )(x − x2 )(x − x3 )
+ f (x1 )
(x1 − x0 )(x1 − x2 )(x1 − x3 )
(x − x0 )(x − x1 )(x − x3 )
+ f (x2 )
(x2 − x0 )(x2 − x1 )(x2 − x3 )
(x − x0 )(x − x1 )(x − x2 )
+ f (x3 )
(x3 − x0 )(x3 − x1 )(x3 − x2 )
Z b
f (x0 ) + 3f (x1 ) + 3f (x2 ) + f (x3 )
I≈ f (x)dx = (b − a)
a 8
5.5.1. Ejemplo
Para la función f (x) = 0.2 + 25x − 200x2 + 675x3 − 900x4 + 400x5 , calcular la integral
utilizando la regla Simpson 3/8 en el intervalo a = 0 b = 0.8 .
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
5.6. Ejemplos
5.6.1. Ejemplo 1
Dada la función
Z b
25 2 200 3 675 4 900 5 400 6
I(x) = f (x)dx = 0.2x + x − x + x − x + x
a 2 3 4 5 6
120 DIFERENCIACIÓN E INTEGRACIÓN
5.6.2. Ejemplo 2
dy
= f (x, y)
dx
En general los métodos que veremos hacen una formulación lineal de la forma
y (k+1) = y (k) + φh
donde φ es una estimación de la pendiente de la lı́nea recta y utilizaremos esta linea para
hacer una predicción de los valores de la integral.
φ = f (x(k) , y (k) )
donde f (x(k) , y (k) ) es la ecuación diferencial evaluada en x(k) y y (k) . Utilizando esta esti-
mación tenemos
121
122 ECUACIONES DIFERENCIALES ORDINARIAS
solucion = zeros(N+1,D);
solucion(1,:) = [x,y];
for k = 2:N+1
x = x + h;
y = y + f(x, y)*h;
solucion(k,:)=[x, y];
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.
y 0(k+1) + y 0(k)
ȳ 0 =
2
De lo anterior podemos decir que el método tiene dos pasos, uno de predicción que es una
iteración de Euler y un Corrector donde se utiliza la estimación de la pendiente al final del
bloque. Estos pasos son:
Predicción
yp(k+1) = y (k) + f (x(k) , y (k) )h
Corrección
(k+1)
f (x(k) , y (k) ) + f (x(k+1) , yp )
y (k+1) = y (k) + h
2
solucion = zeros(N+1,D);
solucion(1,:) = [x,y];
for k = 2:N+1
%Predictor
k1 = f(x, y );
k2 = f(x+h, y + k1*h);
%corrector
x = x + h;
y = y + (k1 + k2 )*h/2.0;
solucion(k,:) = [x,y];
end;
end
Esta técnica usa el método de Euler para predecir un valor de y en el punto medio del
intervalo
124 ECUACIONES DIFERENCIALES ORDINARIAS
Después este valor es utilizado para calcular la pendiente en el punto medio y hacer la
solución en todo el intervalo como
La implementación en Matlab es
solucion = zeros(N+1,D);
solucion(1,:) = [x,y];
for k = 2:N+1
xm = x + h/2;
ym = y + f(x, y)*h/2;
x = x + h;
y = y + f(xm, ym)*h;
solucion(k,:) = [x,y];
end;
end
Los algoritmos de Runge-Kutta son los métodos de integración con mejor desempeño y
exactitud. En el caso del método de Runge-Kutta tenemos calcular dos valores k1 y k2
utilizando
k1 = f (x(k) , y (k) )
6.5. RUNGE-KUTTA 3ER ORDEN 125
3 3
k2 = f (x(k) + h, k1 h)
4 4
(k+1) (k) 1 2
y =y + k1 + k2 h
3 3
function solucion = RK(xini, h, N, f)
D = length(xini);
x = xini(1);
y = xini(2:D);
solucion = zeros(N+1,D);
solucion(1,:) = [x,y];
for k = 2:N+1
k1 = f(x, y);
k2 = f(x + 3*h/4, y+3*h*k1/4);
x = x + h;
y = y + (k1/3 + 2*k2/3)*h;
solucion(k,:) = [x,y];
end;
end
En el caso del método de Runge-Kutta de tercer orden tenemos que calcular tres valores
k1 , k2 y k3 utilizando las siguientes formulas
k1 = f (x(k) , y (k) )
1 1
k2 = f (x(k) + h, k1 h)
2 2
126 ECUACIONES DIFERENCIALES ORDINARIAS
1
y (k+1) = y (k) +
(k1 + 4k2 + k3 ) h
6
function solucion = RK3(xini, h, N, f)
D = length(xini);
x = xini(1);
y = xini(2:D);
solucion = zeros(N+1,D);
solucion(1,:) = [x,y];
for k = 2:N+1
k1 = f(x, y);
k2 = f(x + h/2, y + k1*h/2);
k3 = f(x + h, y - k1*h + 2*k2*h);
x = x + h;
y = y + (k1 + 4*k2 + k3)*h/6;
solucion(k,:) = [x,y];
end;
end
El más popular de los métodos RK es el de cuarto orden. En el caso del método de Runge-
Kutta de cuarto orden tenemos que calcular cuatro valores k1 , k2 , k3 y k4 utilizando las
siguientes formulas
k1 = f (x(k) , y (k) )
1 1
k2 = f (x(k) + h, y (k) + k1 h)
2 2
6.7. EJEMPLO 127
1 1
k3 = f (x(k) + h, y (k) + k2 h)
2 2
k4 = f (x(k) + h, y (k) + k3 h)
1
y (k+1) = y (k) + (k1 + 2k2 + 2k3 + k4 ) h
6
solucion = zeros(N+1,D);
solucion(1,:) = [x,y];
for k = 2:N+1
k1 = f(x, y);
k2 = f(x + h/2, y + k1*h/2);
k3 = f(x + h/2, y + k2*h/2);
k4 = f(x + h, y + k3*h);
x = x + h;
y = y + (k1 + 2*k2 + 2*k3 + k4)*h/6;
solucion(k,:) = [x,y];
end;
end
6.7. Ejemplo
Z Z
dy
dx = f (x, y)dx = −0.5x4 + 4x3 − 10x2 + 8.5x
dx
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
function dy = ecuacion(x, y)
dy = -2*x^3 + 12*x^2- 20*x + 8.5;
end
Para evaluar la exactitud de los métodos calculamos el valor absoluto de la diferencia entre
el valor real y el calculado.
6.7. EJEMPLO 129
% Valores Iniciales
xini = 0;
xfin = 4;
y_ini = 1;
h = (xfin-xini)/N;
x = [xini:h:xfin]’;
function dy = ecuacion(x, y)
130 ECUACIONES DIFERENCIALES ORDINARIAS
function y = solucion_real(x)
y = -0.5*x.^4 + 4*x.^3 - 10*x.^2 + 8.5*x +1;
end
end
6.7.2. Circuito RL
Para el circuito RL que se muestra en la figura 6.16 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
Solución
La ecuación diferencial para este problema es
di V − Ri
=
dt L
R = 2.0; % Ohms
L = 0.3; % Henries
V = 10.0; % Volts
di = (V - R *i)/L;
6.7. EJEMPLO 131
end
La solución real de la ecuación diferencial, en función del tiempo, es:
V
i(t) = 1 − e(−Rt/L)
R
La solución utilizando el Método de Runge-Kutta 4 para un valor inicial t = 0, i(0) = 0 y
un incremento h = 0.2 es:
t i(t)
0.0 0
0.2 3.5391
0.4 4.5732
0.6 4.8753
0.8 4.9636
1.0 4.9894
En la figura 6.17 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.
Solucion Circuito RL
7
5
Corriente (Amp.)
0
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
tiempo (seg.)
function Circuito_RL()
% Numero de puntos
N = 5;
% Valores Iniciales
tini = 0;
tfin = 1;
i_ini = 0;
h = (tfin-tini)/N;
xlabel(’tiempo (seg.)’);
ylabel(’Corriente (Amp.)’);
title(’Solucion Circuito RL’);
function x =Solucion_Real(xini, h, N)
%Parametros
R = 2.0; % Ohms
L = 0.3; % Henries
V = 10.0; % Volts
t = [xini:h:N*h]’;
Tau = L/R;
i = 5 *(1 - exp(-t/Tau));
6.7. EJEMPLO 133
x = [t, i];
end
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
El sistema masa resorte como el que se muestra en la figura 6.18, esta constituido por una
masa M , sujeta a un resorte de constante K, el cual esta sujeto a fuerzas de amortigua-
miento C y se aplica una fuerza F . El modelo dinámico para este sistema es:
dx2 dx
M 2
+C + Kx = F
dt dt
Note que tenemos una ecuación diferencial de segundo orden la cual plantearemos como
un par de ecuaciones de primer orden como:
134 ECUACIONES DIFERENCIALES ORDINARIAS
dx
=v
dt
dv F − Cv − Kx
=
dt M
% Numero de puntos
N = 1000;
% Valores Iniciales
tini = 0;
tfin = 40;
d_ini = 2;
v_ini = 0;
h = (tfin-tini)/N;
2 1.5
1
Desplazamiento (m.)
Velocidad (m/s.)
0.5
0 0
−0.5
−1
−1
−2 −1.5
0 10 20 30 40 0 10 20 30 40
tiempo (seg.) tiempo (seg.)
1.5
1
Velocidad (m/s.)
0.5
−0.5
−1
−1.5
−2 −1 0 1 2
Desplazamient (m.)
subplot(2,2,1)
plot(x(:,1), x(:,2));
xlabel(’tiempo (seg.)’);
ylabel(’Desplazamiento (m.)’);
subplot(2,2,2)
plot(x(:,1), x(:,3));
xlabel(’tiempo (seg.)’);
ylabel(’Velocidad (m/s.)’);
subplot(2,2,3)
plot(x(:,2), x(:,3));
xlabel(’Desplazamient (m.)’);
ylabel(’Velocidad (m/s.)’);
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);