Algoritmo pa
Algoritmo para matrices tridiago
ra matrices tridiagonales
nales
ElEl
algoritmo para matrices
algoritmo para matrices
tridiagonales
tridiagonales
o oalgoritmo de Thomas
algoritmo de Thomas
(por (porLlewellyn ThomasLlewellyn Thomas)) es unes un algoritmoalgoritmo del del álgebra lineal numéricaálgebra lineal numéricapara resolver para resolver matrices tridiagonalesmatrices tridiagonales de forma de forma eficiente.
eficiente.
Una matri tridiagonal se corresponde a
Una matri tridiagonal se corresponde a un sistema de ecuaciones de la un sistema de ecuaciones de la formaforma
donde
donde y y . . lo lo !ue !ue se se puede puede representarrepresentar matricialmentematricialmentecomocomo
"ara este tipo de sistemas se puede
"ara este tipo de sistemas se puede obtener con este algoritmo una soluci#n conobtener con este algoritmo una soluci#n con solo
solo operaciones operaciones en en ve ve de de las las !ue !ue re!uiere re!uiere lala eliminaci#n gaussianaeliminaci#n gaussiana.. El
El algoritmo algoritmo primero primero elimina elimina las las y y luego luego usa usa una una sustituci#n sustituci#n para para obtener obtener lala soluci#n.
soluci#n.
Este tipo de matrices suelen salir al
Este tipo de matrices suelen salir al plantear discretiaciones por métodosplantear discretiaciones por métodos de
dediferencias finitasdiferencias finitas$$ vol%menes finitosvol%menes finitos o oelementos finitoselementos finitos de problemas de problemas unidimensionales. &lgunos de los problemas f'sicos !ue se plantean as' son unidimensionales. &lgunos de los problemas f'sicos !ue se plantean as' son la
laEcuaci#n de "oissonEcuaci#n de "oisson$ la$ laecuaci#n de calor ecuaci#n de calor $ la$ laecuaci#n de ondaecuaci#n de onda o la interpolaci#n o la interpolaci#n por
por splinessplines..
Índice
Índice
ocultar ocultar • • * * +é+étotododo •• , , -mpl-mplemenementactacioneioness
o
o ,.* -mplementaci#,.* -mplementaci#n en n en
o
o ,., -mplementaci#,., -mplementaci#n en n en "ython"ython
o
o ,./ -mplementaci#,./ -mplementaci#n en n en +atlab+atlab
o
o ,.0 -mplementaci#,.0 -mplementaci#n en n en 1ortran 231ortran 23
•
o /.* &lgoritmo
o /., 1#rmulas para coeficientes
• 0 5ariantes
• 6 7eferencias
• 8 Enlaces e9ternos
Método
editar
El primer paso del método es modificar los coeficientes como sigue:
donde se marcan con super'ndice ; los nuevos coeficientes. 4e igual manera se opera:
a lo !ue se llama barrido hacia adelante. & continuaci#n se obtiene la soluci#n por sustituci#n hacia atrás:
Implementaciones
editar
Implementación en C
editar
La siguiente funci#n en resolverá el sistema (aun!ue sobreescribirá el vector de entrada c en el proceso). <e ha de notar !ue a!u' los sub'ndices están basados en el cero$ es
decir donde es el n%mero de
ecuaciones:
void solve_tridiagonal_in_place_destructive (float x[], const size_t N, const float a[], const float b[], float c[]) {
/*
solves Ax = v where A is a tridiagonal matrix consisting of vectors a, b, c
note that contents of input vector c will be modified, making this a one-time-use function x[] - initiall contains the input vector v, and returns the solution x! indexed from [", !!!, # -$]
# - number of e%uations
a[] - subdiagonal &means it is the diagonal below the main diagonal' -- indexed from [$, !!!, # - $] b[] the main diagonal, indexed from [", !!!, # -$]
c[] - superdiagonal &means it is the diagonal above the main diagonal' -- indexed from [", !!!, # - (] */
c[0] = c[0] b[0]; x[0] = x[0] b[0];
/* loop from $ to # - $ inclusive */
for (n = !; n " N; n##) {
float $ = !%0f (b[n] & a[n] ' c[n & !]); if(n " (N&!)) c[n] = c[n] ' $;
x[n] = (x[n] & a[n] ' x[n & !]) ' $;
/* loop from # - ( to " inclusive */
for (n = N & ; n&& * 0; ) { x[n] = x[n] & c[n] ' x[n # !];
La siguiente variante preserva el sistema de ecuaciones para
reutiliarlo en otras funciones. <e hacen llamadas a la biblioteca para reservar más especiao. =tras variantes usan un puntero a memoria disponible.
void solve_tridiagonal_in_place_reusable (float x[], const size_t N, const float a[], const float b[], const float c[]) {
size_t n;
/* allocate scratch space */
cpri$e[0] = c[0] b[0]; x[0] = x[0] b[0];
/* loop from $ to # - $ inclusive */
for (n = !; n " N; n##) {
float $ = !%0f (b[n] & a[n] ' cpri$e[n & !]); if(n " (N&!)) cpri$e[n] = c[n] ' $;
x[n] = (x[n] & a[n] ' x[n & !]) ' $;
/* loop from # - ( to " inclusive */
for (n = N & ; n&& * 0; )
x[n] = x[n] & cpri$e[n] ' x[n # !];
/* free scratch space */
free(cpri$e);
Implementación en Python
editar
La siguiente implementaci#n usa el lengua>e de
programaci#n "ython.4e nuevo$ los sub'ndices son basados en el cero ( donde es el n%mero de inc#gnitas). def +-./olve(a, b, c, d)
n = len(d))n in the numbers is rows ) odif the first-row coefficients
c[0] = b[0] )+ivision b ero risk!
d[0] = b[0]
for i in xrange(!, n$ax)
pte$p = b[i] & (a[i] ' c[i& !]) c[i] = pte$p
d[i] = (d[i] & a[i] ' d[i& !])pte$p
)ack .ubstitution
x = [0 for i in xrange(n$ax)] x[&!] = d[&!]
for i in range(&,&n$ax&!,&!) x[i] = d[i] & c[i] ' x[i#!]
return x
Implementación en Matlab
editar
En +atlab?=ctave el algoritmo !ueda como sigue. Esta ve los vectores están basados en el uno$ por lo !ue
function x = +-.solver(a,b,c,d)
1a, b, c are t2e colu$n vectors for t2e co$pressed tridiagonal $atrix, d is t2e rig2t vector
1 N is t2e nu$ber of ro3s N = lengt2(d);
1 -odif4 t2e first&ro3 coefficients
c(!) = c(!) b(!); 1 ivision b4 zero ris5% d(!) = d(!) b(!);
for n = !N
te$p = b(n) & a(n) ' c(n & !); c(n) = c(n) te$p;
d(n) = (d(n) & a(n) ' d(n & !)) te$p; end
1 No3 bac5 substitute% x(N) = d(N);
for n = (N & !)&!!
x(n) = d(n) & c(n) ' x(n # !); end
end
Implementación en Fortran 90
editar
1ortran usa también una nomenclatura basada en el uno$ es decir siendo el n%mero de inc#gnitas. &lgunas veces no es deseable !ue el programa sobreescriba los
coeficientes (por e>emplo para resolver diversos sistemas !ue solo difieren en el término independiente)$ as' !ue esta implementaci#n mantiene dichos coeficientes.
subroutine solve_tridiag(a,b,c,d,x,n ) i$plicit none
a - sub-diagonal &means it is the diagonal below the main diagonal'
b - the main diagonal
c - sup-diagonal &means it is the diagonal above the main diagonal'
d - right part x - the answer n - number of e%uations integer,intent(in) n real(6),di$ension(n),intent(in) a,b,c,d real(6),di$ension(n),intent(out) x real(6),di$ension(n) cp,dp
real(6) $ integer i
initialie c-prime and d-prime
cp(!) = c(!)b(!) dp(!) = d(!)b(!)
solve for vectors c-prime and d-prime
do i = ,n $ = b(i)&cp(i&!)'a(i) cp(i) = c(i)$ dp(i) = (d(i)&dp(i&!)'a(i))$ enddo initialie x x(n) = dp(n)
solve for x from the vectors c-prime and d-prime
do i = n&!, !, &!
x(i) = dp(i)&cp(i)'x(i#!) end do
end subroutine solve_tridiag
Derivación
editar
Algoritmo
editar
<e puede obtener dicho algoritmo usando la eliminaci#n gaussiana de forma genérica. <uponiendo como
inc#gnitas y con ecuaciones a resolver:
+odificando la segunda ecuaci#n a partir de la primera obtenemos:
lo !ue da:
y se ha eliminado de la segunda ecuaci#n. <i repetimos usando la segunda ecuaci#n en la tercera obtenemos:
Esta ve se ha eliminado . El
procedimiento se puede repetir hasta la fila enésima$ de>ando cada ecuaci#n con solo dos inc#gnitas menos la %ltima !ue solo tiene una inc#gnita. Entonces es inmediata la resoluci#n de esta y desde ah' la de las anteriores.
Fórmulas para coeficientes
editar
La determinaci#n de los coeficientes en las ecuaciones generales es más complicada. E9aminando el procedimiento$ se pueden definir de forma recursiva:
"ara acelerar la resoluci#n pu ede ser dividido (si no hay
problemas por divisi#n por cero) y los nuevos coeficientes$ indicados con primas$ serán:
Print document
In order to print this document from Scribd, you'll first need to download it.
Cancel
Download And Print
Lo !ue da el siguient e sistema con las mismas inc#gnit as y los coeficie ntes definido s en funci#n de los originale s: 4onde la %ltima ecuaci#n solo afecta a una inc#gnita. 7esolviendo la podemos resolver la anterior y as' sucesivame nte:
Variantes
edi
r
En algunas situaciones$ particularmente con condiciones d contorno peri#dica se busca resolver una forma perturbada de la matri tridiagonal:Print document
In order to print this document from Scribd, you'll first need to download it.
Cancel
Download And Print
"ara este caso se la 1#rmula <herm +orrison para evit operaciones adicio de una eliminaci#n gaussiana y poder seguir usando el algoritmo de Thom Este método re!ui resolver una versi c'clica del sistema la entrada y un ve correcci#n y combi los resultados. Tod se puede hacer eficientemente de ve dado !ue amb problemas compa el barrido hacia delante de la matri triangular.. En otras situacion sistema de ecuaci puede ser tridiago blo!ues$ con submatrices como elementos forman diagonales. Este ti problemas suelen cuando se !uiere e9tender los méto discretiaci#n a do dimensiones y pue verse también co matri pentadiago 5ariantes de este algoritmo se usan estas situaciones. El libro Numerical Mathematics de Auarteroni$ <acco <aleri$ recoge una versi#n modificada para multiplicacion ve de divisiones$ es %til en ciertas ar!uitectur
Print document
In order to print this document from Scribd, you'll first need to download it.
Cancel
Download And Print
Referencias
• onte$ <.4.$ a deBoor$ . (*2C,). Eleme Numerical Ana +cDraw@ill$ GorH.-<BF 33C3* • Este art'culo in te9to del art'culo Tridiag matri9 algorith T4+& (Thoma algorithm) publ con licencia DFU en 14 wiHi • "ress$ IJ TeuHolsHy$ <&J 5etterling$ ITJ 1lannery$ B" (,33C). K<ecti ,.0. Numeric Recipes: The Scientific Computing (/r edici#n). Few ambridge University "ress.-<BF 2CM@ MM38M@M.Print document
In order to print this document from Scribd, you'll first need to download it.
Cancel