Beruflich Dokumente
Kultur Dokumente
Programación Numérica
Objetivos
• Resolver un sistema de ecuaciones lineales
acopladas
• Obtener la inversa de una matriz
• Calcular el determinante de una matriz
• Factorizar matrices
Solución de sistemas pequeños
La solución de un sistema lineal de 2 ecuaciones puede
obtenerse fácilmente de forma gráfica
a b
a11x1 + a12x2 = b1 x2 11 x1 1
a12 a12
a21x1 + a22x2 = b2
Despejando x2 y graficando
solución
a11 b1
x2 x1
a12 a12
a b
a21 b2 x2 21 x1 2
x2 x1 a22 a22
a22 a22
Ejemplo
Sea el sistema
3x1 + 2x2 = 18
(4, 3)
–x1 + 2x2 = 2
Despejando
x2 = 9 – 1.5x1
x2 = 1 + 0.5x1
Tipos de soluciones
No hay solución Infinidad de soluciones Sistema mal condicionado
Las operaciones:
(E2 –2E1)E2, (E3 –3E1) E3, (E4 + E1)E4
Transforman el sistema en:
Simplificar
E1: x1 + x2 + 3x4 = 4
E2: - x2 – x3 - 5x4 = -7
E3: - 4x2 – x3 -7x4 =-15
E4: + 3x2 +3x3 + 2x4 = 8
Las operaciones:
(E3 –4E2)E3, (E4 +3E2) E4
Transforman el sistema en:
Simplificar
E1: x1 + x2 + 3x4 = 4
E2: - x2 – x3 - 5x4 = -7
E3: 3x3 +13x4 = 13
E4: -13x4 = -13
E1: (-1)+(2)+3(1)= 4
E2: 2(-1)+(2)–(0)+(1) = 1
E3: 3(-1)-(2)–(0)+2(1)= -3
E4: -(-1)+2(2)+3(0)-(1) = 4
Solución en Matlab
%sistema de ecuaciones
A = [1,1,0,3,4;2,1,-1,1,1;3,-1,-1,2,-3;-1,2,3,-1,4]
x = [0 0 0 0]’;
%operaciones
%(E2 - 2E1) -> E2
A(2,:) = A(2,:) - 2*A(1,:);
%(E3 - 3E1) -> E3
A(3,:) = A(3,:) - 3*A(1,:);
%(E4 + E1) -> E4
A(4,:) = A(4,:) + A(1,:);
%(E3 - 4E2) -> E3
A(3,:) = A(3,:) - 4*A(2,:);
%(E4 + 3E2) -> E4
A(4,:) = A(4,:) + 3*A(2,:);
x(4) = A(4,5)/A(4,4);
x(3) = (A(3,5)-A(3,4)*x(4))/A(3,3);
x(2) = (A(2,5)-A(2,3:4)*x(3:4))/A(2,2);
x(1) = (A(1,5)-A(1,2:4)*x(2:4))/A(1,1);
Actividad
Resolver
x1 + x2 + x4 = 2
2x1 + x2 - x3 + x4= 1
4 x1 - x2 - 2x3 + 2 x4 = 0
3x1 - x2 - x3 + 2 x4 = -3
Matrices
Una matriz es un arreglo rectangular de elementos de n
renglones y m columnas.
n1
a a n2 a nm
Representación matricial
El sistema de ecuaciones
a11x1 a12 x2 a1m xn b1
a21x1 a22 x2 a2 m xn b2
an1 x1 an 2 x2 anm xn bn
Se puede representar por una matriz ampliada
. .
n1
a a n2 a nn . bn
Ejemplo
(E2 –2E1) E2, (E3 –3E1) E3,
(E4 + E1) E4
1 1 0 3. 4 1 1 0 3 . 4
2 1 1 1 . 1 0 1 1 5 . 7
3 1 1 2 . 3 0 4 1 7 . 15
1 2 3 1. 4 0 3 3 1 . 8
1 1 0 3 . 4
0 1 1 5 . 7
0 0 3 13 . 13
0 0 0 13. 13
Eliminación Gaussiana con sustitución hacia
atrás
Se forma la matriz aumentada a11 a12 a1n . a1,n1
a a a . a
A A, b 21 22 2n 2, n 1
. .
n1
a a n2 a nn
. a n , n 1
. .
0 0 a nn
. a n , n 1
Sustitución hacia atrás
an ,n 1
xn
an , n
an 1,n 1 an 1,n xn
xn 1
an 1,n 1
En general
ai ,n 1 j i 1 ai , j x j
n
ai ,n 1 ai ,n xn ai ,n 1 xn 1 ... ai ,i 1 xi 1
xi
ai ,i ai ,i
Algoritmo Gauss
bnj
2 5 1 2 1
b11 b12 b13 5
9 9 9 9 9
9
4 1 2 4 2
b21 b22 b23 1
A
1
9 9 9
1 1 1 9 9 9
b31 b32 b33 1 1 1
3 3 3 3 3 3
Inversa en C
void inversa(double B[][20],int n,double x[][20]){
double I[20][20];
double temp,m,s;
int i,j,k,p;
for(i = 0; i<20; i++)
for(j = 0; j<20; j++)
if(i==j) I[i][j] = 1; else I[i][j] = 0;
double A[20][20];
for(i = 0; i<n; i++)
for(j = 0; j<2*n; j++)
if(j<n) A[i][j] = B[i][j]; else A[i][j] = I[i][j-n];
for(i = 0; i<20; i++)
for(j = 0; j<20; j++)
x[i][j] = 0;
for(i = 0; i<n-1;i++){
p = i;
while(p < n && A[p][i] == 0) p = p + 1;
if( p == n){
std::cout << "Matriz singular...\n";
return;
}
if( p != i)
for( k = 0; k<2*n; k++){
temp = A[i][k];
A[i][k] = A[p][k];
A[p][k] = temp;
}
for(j = i+1;j<n; j++){
m = A[j][i]/A[i][i];
for( k = 0; k<2*n; k++)
A[j][k] = A[j][k] - m*A[i][k];
}
}
if( A[n-1][n-1]==0){
std::cout << "Matriz singular...\n";
return;
}
for( k = 0; k<n ; k++){
x[n][k] = A[n-1][n+k]/A[n-1][n-1];
for( i = n-1; i>=0; i--){
s = A[i][n+k];
for( j = i+1 ; j<n; j++)
s = s - A[i][j]*x[j][k];
x[i][k] = s/A[i][i];
}
}
}
Inversa en Matlab
function x = inversa(B)
[n dumy] = size(B);
I = eye(n);
A = [B,I];
x = zeros(n);
for i = 1 : n-1
p = i;
while p < n && A(p,i) == 0; p = p + 1; end
if p == n
fprintf('Matriz singular...');
return;
end
if p ~= i
temp = A(i,:);
A(i,:) = A(p,:);
A(p,:) = temp;
end
for j = i+1 : n
m = A(j,i)/A(i,i);
for k = 1 : 2*n
A(j,k) = A(j,k) - m*A(i,k);
end
end
end
Inversa en Matlab
if A(n,n)==0
fprintf('Matriz singular...');
return;
end
for k = 1: n
x(n,k) = A(n,n+k)/A(n,n);
for i = n-1 : -1: 1
s = A(i,n+k);
for j = i+1 : n
s = s - A(i,j)*x(j,k);
end
x(i,k) = s/A(i,i);
end
end
Comandos de Matlab para matrices
inv(m) – invierte una matriz cuadrada m.También m^-1.
/ – divide, A/B es equivalente a B*inv(A)
\ – divide, A\B es equivalente a inv(A)*B
det(m) – calcula el determinante de m.
trace(m) – suma los elementos de la diagonal de m.
Tarea 30
1. Determine cual de las siguientes
matrices son no singulares y calcule su
inversa.
a.| 4 2 6| b.|1 2 0| c.|4 0 0|
| 3 0 7| |2 1 -1| |0 0 0|
|-2 -1 -3| |3 1 1| |0 0 3|
m
cij aik bkj ai1b1 j ai 2b2 j ... aimbmj
k 1
Definiciones
Una matriz cuadrada es la que tiene igual número de renglones
que de columnas.
Una matriz diagonal es una matriz cuadrada con D =(dij) con dij
= 0 simpre que i<>j.
La matriz identidad de orden n, In = (dij) es una matriz diagonal
con dij = 1 si i = j y dij =0 si i<>j.
Una matriz triangular superior de n x n U = (uij) tiene, para
toda j = 1, 2, ..., n, los elementos
uij = 0, para cada i = j +1, j + 2, ..., n
Una matriz triangular inferior de n x n L = (lij) tiene, para toda
j = 1, 2, ..., n, los elementos
lij = 0, para cada i = 1, 2, ..., j – 1
Traspuesta
La traspuesta de una matriz A de n x m es una matriz At tal que
la i_ésima columna de At es la misma que el i-ésimo renglón de
A.
Se cumple que
a. (At)t = A
b. (A + B)t = At + Bt
c. (AB)t = Bt At
d. Si A-1 existe, (A-1)t = (At)-1
Determinante
Si A es una matriz de 1 x 1, entonces det(A) = x.
Si a es de orden mayor que 1, calcule el determinante de
A como sigue:
Escoja cualquier fila o columna. para cada elemento A[i,
j] en esa fila o columna, forme el producto
(-1)(i+ j)*A[i, j]*det(menor(A[i, j]))
Donde det(menor(A[i, j])) es el determinante del menor
de A[i, j].
det(A) = suma de todos los productos para la columna o
fila seleccionada.
Propiedades
a. Si un renglón o columna tiene solo ceros, el determinante es cero.
b. Si se intercambian 2 renglones o columnas, el signo del determinante cambia
c. Si dos columnas o renglones son iguales, el determinante es cero.
d. Si se multiplica un renglón o columna por un numero real el determinante se
multiplica por ese número real.
e. Si se suma un múltiplo de un renglón o columna a otro renglón o columna, el
determinante no se altera.
f. El determinante de un producto de matrices es igual al producto de los
determinantes de cada una.
g. El determinante de la inversa es el inverso del determinante de la matriz
original.
Cálculo eficiente del
determinante
Convertir la matriz en una matriz triangular superior y
calcular el determinante de ésta.
El determinante de una matriz triangular superior es igual al
producto de los elementos de la diagonal principal.
La matriz triangular se obtiene mediante la eliminación
gaussiana.
Determinante en Matlab
function x = determinante(A) for j = i+1 : n
[n dumy] = size(A); m = A(j,i)/A(i,i);
for i = 1 : n-1 for k = 1 : n
p = i; A(j,k) = A(j,k) - m*A(i,k);
while p < n && A(p,i) == 0; end
p = p + 1; end
end end
if p == n if A(n,n)==0
x = 0; x = 0;
return; return;
end end
if p ~= i p = 1;
temp = A(i,:); for i = 1:n
A(i,:) = A(p,:); p = p*A(i,i);
A(p,:) = temp; end
end x = p;
Descomposición LU
La descomposición LU transforma una matriz a en el producto de dos matrices
triangulares
A = LU (1)
Donde L es triangular inferior y U es triangular superior.
1 0 0
L f 21 1 0
f 31 f 32 1
Ejemplo
3 0.1 0.2 Los valores de f 21, f 31 son
A 0.1 7 0.3 f 21 = 0.1/3 = 0.033333 y
0.3 0.2 10 f 31 = 0.3/3 = 0.1
3 0.1 0.2
0.03333 7.00333 0.29333
0.1 0.027130 10.0120
3 0.1 0.2
U 0 7.00333 0.29333
0 0 10.0120
1 0 0
L 0.03333 1 0
0.1 0.027130 1
1 0 0 3 0.1 0.2
A 0.03333 1 0 0 7.00333 0.29333
0.1 0.027130 1 0 0 10.0120
3 0.1 0.2
0.099999 7 0.3
0.3 0.2 9.99996
Algoritmo
Sub Decompose(a, n)
DoFor k=1, n – 1
DoFor i=k+1, n
factor = ai,k/ak,k
ai,k = factor
DoFor j=k+1, n
ai,j = ai,j – factor * ak,j
EndDo
EndDo
EndDo
End Decompose
Solución del sistema
Para resolver un sistema de ecuaciones procedemos
multiplicando L por un vector d y sustituyendo hacia adelante.
1 0 0 d1 b1 d1 b1
l 1 0 d b l21d1 d 2 b2
21 2 2
l31 l32 1 d 3 b3 l31d1 l32d 2 d 3 b3
1 0 0 z1 37 z1 = -37
Ly .6667 1 0 z2 25 -.6667z1 + z2 = -25
.8333 .5909 1 z3 34 -.8333z1 - .5909z2 + z3 = -34
6 1 1 x1 37 2.8182x3 = -94.180
Ux 0 3.6667 1.6667 x2 49.667 3.6667x1 + 1.6667x2 = -49.667
0 0 2.8182 x3 94.180 -6x1 + x2 + x3 = -37
X1 = 0.87097
X2 = 1.64516
X3 = -33.41935
Pivoteo
La descomposición LU se implementa con el algoritmo de Gauss. Si se modifica
el orden de las filas, se deberá tomar en cuenta este hecho.
El algoritmo siguiente genera una matriz P de permutación para tomar en cuenta
el intercambio de filas.
La matriz de permutación se obtiene intercambiando renglones en una matriz
identidad. Por ejemplo, la siguiente matriz intercambia el primer y segundo de
una matriz A al premultiplicarla por A.
0 1 0
P 1 0 0
0 0 1
El guión regresa
PA = LU
La ecuación original se escribe
PAx = Py
O
LUx = y
Comandos de Octave
function x=sub_atras(U,v)
[nRow,nCol]=size(U);
x=zeros(nRow,1);
x(nRow)=v(nRow)/U(nRow,nRow);
for n=(nRow-1):-1:1
x(n)=(v(n)-(U(n,n+1:end)*x(n+1:end))) / U(n,n);
end
Guión para resolver un sistema
function x=resolver(A,b)
% Resuelve Ax=b
%ENTRADA:
% A: matriz cuadrada
% b: vector de tamaño n
%
%SALIDA:
% x: la solución a A*x=b
[L,U,P] = descomposicionLU(A);
y = sub_adelante(L,P*b);
x = sub_atras(U,y);
Tarea 31
1. Factorice las siguientes matrices en la
descomposición LU con Octave y con los guiones para LU.
Haga a mano el producto PLU y confirme que es igual a
la matriz original. Utilice 3 cifras después del punto
decimal.
a.| 4 2 6| b.|1 2 6| c.|1 3 8|
| 3 5 7| |2 1 -1| |0 7 0|
|-2 -1 3| |3 1 1| |1 7 3|
R5 V1
R1 I1 I2
R4 R6
V2
V3 I3 I4 R9
R7 R8
R1 R2 R4 R5 R4 0 I1 0
R5 R3 R5 R6 0 R6 I V
2 1
R4 0 R4 R7 0 I 3 V3 V2
0 R6 0 R6 R8 R9 I 4 V2
Solución en Matlab
% Calculo de las corrientes de malla en una red eléctrica
% a - vector utilizado para leer los datos desde un archivo
% nm = numero de mallas
% nr = numero de resistencias
% m1 = vector con la malla uno de cada resistencia
% m2 = vector con la malla dos de cada resistencia
% res = vector con los valores de las resistencias leídas
% r = matriz de resistencias
% v = vector con los voltajes totales de malla
% amp = vector de corrientes de malla
% la descripción de la red se lee desde un archivo, el formato es
% nm
% nr
% res(1)
% m1(1)
% m2(1)
% ...
% res(nr)
% m1(nr)
% m2(nr)
% v(1)
% ...
% v(nm)
%
Solución en Matlab
nn = 1;
%almacena todos los datos en el vector a
a = textread('malla.txt');
nm = a(nn);nn = nn+1;
nr = a(nn);nn = nn+1;
%lee cada elemento
for n = 1:nr
res(n) = a(nn);nn = nn+1;
m1(n) = a(nn);nn = nn+1;
m2(n) = a(nn);nn = nn+1;
end
%descripcion de los datos leidos
for n = 1:nr
fprintf('R%d=%6.3f entre malla %d y %d\n',n,res(n),m1(n),m2(n));
end
%Leer voltajes de malla y los despliega
for n = 1:nm
v(n) = a(nn);nn = nn+1;
fprintf('Voltaje de malla %d = %12f8:\n',n,v(n))
end
Solución en Matlab
%crea matriz de resistencias
r = zeros(nm);
for n = 1:nr
j = m1(n);
k = m2(n);
if k~=0
r(k,k) = r(k,k) + res(n);
r(j,k) = r(j,k) - res(n);
r(k,j) = r(j,k);
end
r(j,j) = r(j,j) + res(n);
end
%imprime matriz de resistencias
fprintf('Matriz de resistencias');
r
%calcula corrientes
amp = inv(r)*v';
%imprimir resultados
for n = 1:nm
fprintf('Corrientes de malla %d = %12f8:\n',n,amp(n))
end
Ejemplo numérico
Número de mallas 5
4821
9
Número de resistencias 3
1017
4
38.9 I1 I5 1
949 986
3492 Valor de resistencia
3
1017 837 4
3492
0
4821
1
5732
42.1 986
Malla 1 2
I2 I4 4
Malla 2
837
5
2
5670
842 5732 4
5
59.76 949
I3 0
2
38.9
0
0
5670 842
42.1
3
0
5
59.76
Resultados
R1=1017.000 entre malla 1 y 3 Matriz de resistencias
R2=3492.000 entre malla 1 y 2 r=
R3=837.000 entre malla 2 y 4 4509 -3492 -1017 0 0
R4=949.000 entre malla 2 y 0 -3492 5278 0 -837 0
R5=842.000 entre malla 3 y 5 -1017 0 6680 -4821 -842
R6=4821.000 entre malla 3 y 4 0 -837 -4821 12376 -5732
R7=986.000 entre malla 4 y 0 0 0 -842 -5732 12244
R8=5732.000 entre malla 4 y 5
R9=5670.000 entre malla 5 y 0 Corrientes de malla 1 = 0.036338
Voltaje de malla 1 = 38.900000 Corrientes de malla 2 = 0.027346
Voltaje de malla 2 = 0.000000 Corrientes de malla 3 = 0.028966
Voltaje de malla 3 = 42.100000 Corrientes de malla 4 = 0.020833
Voltaje de malla 4 = 0.000000 Corrientes de malla 5 = 0.016626
Voltaje de malla 5 = 59.760000
2 1 1 4 2 3 1 2 1 1 1 1
a) 3 3 9 b) 3 1 4 c) 0 1 1 d ) 0 2 3
3 3 5 2 4 5 2 4 0 0 1 1
2 1 0 x1 1
1 2 1 x2 2
0 1 2 x3 3
2 1 1 x1 4
3 4 1 x2 5
1 1 1 x3 6