a,af,equed,r,c,b,x,rcond,ferr,berr,info= PySLK.pvgesvx(a,b[,fact,trans,equed,ACTS_af,ACTS_x])
La rutina "pvgesvx" resuelve la ecuacion del sistema lineal siguiente:
donde
es una matriz
, y
y
son matrices de tamaño
.
Los errores en la solución y las condiciones de la estimación tambien se especifican en esta rutina.
La utilización de estas rútinas es mas complejas que las rutinas sencillas (
fact='E', con el fin de equilibrar el sistema se computan los factores
reales escalares.
trans='N':
trans='T':
trans='C':
Que el sistema sea o no equilibrado depende de la matriz
, pero si la equilibración es utilizada
,
se sobreescribirá por
y
por
(si trans='N') o por
(si trans='T').
fact='E', o fact='N', se utiliza la descomposición
, donde
es una matriz permutación,
es una matriz unitaria triangular inferior, y
es una matriz triangular.
fact='E' y se utiliza equilibración, la matriz trans='N') o por trans='T' o 'C'). De este modo se resuelve
la ecuación antes de la equilibración.
pvgesvx(ACTS_a,ACTS_b,fact='N',trans='N',equed='N',x=None,ACTS_af=None,rcond=0
Parámetros de Entrada
a: Matriz de tipo PyACTS de dimensiones b: Matriz de tipo PyACTS de dimensiones fact: Indicaremos si la entra fact='F': La matriz af contendrá la forma factorizada de a. Si equed<>'N', la
matriz a ha sido equilibrada con los factores dados por r y c.
fact='N': La matriz a se copiará en la matriz af y se factorizará.
fact='E': La matriz a será equilibrada si es necesario y entonces se copiará y factorizará en af.
trans: Indica la forma del sistema de ecuaciones:
trans='N':
trans='T':
trans='C':
af: Este parametro es opcional. Dependiendo de los parámetros de entrada
la matriz af tendrá diferente forma.
fact='F', entonces af es un argumento de entrada y contiene los factores
L y U de la factorizacion
psgetrf. Si equed='N',
entonces af contiene la forma factorizada forma de la matriz a.
fact='N', entonces af es un argumento de salida que devuelve la forma factorizada
fact='E', entonces af es un argumento de salida que devuelve la forma factorizada
a.
Parámetros de Salida
a: Como argumento de salida, si equed<>'N' , entonces a
es escalada del siguiente modo:
equed='R' :
equed='C' :
equed='B' :
af: Como argumento de salida puede tener las siguientes formas:
fact='N' : entonces af es devuelve los factores a.
fact='E' : entonces af es devuelve los factores a.
equed: Indica la forma en la que fue realizada la equilibracion:
equed='N' : No se realizó equilibración.
equed='R' : Equilibración por filas.
equed='C' : Equilibración por columnas.
equed='B' : Ambas equilibraciones fueron realizadas (filas y columnas).
r: Contiene los factores de escala para las filas.
c: Contiene los factores de escala para las columnas.
b: Si equed = 'N', b no se modificará; si
trans='N' y equed = 'R' o 'B', b se sobrrescribe por
x: Si info=0, la matriz
solución
rcond: Es un número real que expresa la estimación de la equilibración.
Si rcond es menor que la precisión de la maquina (rcond=0), la matriz es singular a la precisión de trabajo.
ferr: La estimación del error ''hacia delante'' para cada elemento del vector x
berr: La estimación del error ''hacia atrás'' para cada elemento del vector x
info: Indica el estado de salida de la rutina:
info=0 : Ejecución con éxito
info<0 : Si info=-i el i-ésimo argumento tuvo un valor ilegal.
info>0 : Si info=i, y i es
rcond es menor que la precisión de la maquina
Consideramos que son muchos los parametros y las opciones de ejecución en estas rutinas para expertos. A continuación mostramos un ejemplo que resuelve el mismo problema que la rutina pvgesv vista en el apartado anterior.
from PyACTS import *
import PyACTS.PyScaLAPACK as PySLK
from RandomArray import *
from Numeric import *
n,nrhs=8,2
#Initiliaze the Grid
PyACTS.gridinit()
if PyACTS.iread==1:
print "Ejemplo de Utilizacion ScaLAPACK: PvGESVX"
print "N=",n,";nprow x npcol:",PyACTS.nprow,"x",PyACTS.npcol
print "Tam. Bloques:",PyACTS.mb,"*",PyACTS.nb
a=8*identity(n,Float)
print "a=",a
b=ones((n,nrhs))
print "b'=",transpose(b)
else:
a,b=None,None
#We convert Numeric Array to PyACTS.Scalapack Array
ACTS_lib=1 # 1=Scalapack
a=Num2PyACTS(a,ACTS_lib)
b=Num2PyACTS(b,ACTS_lib)
#We call PBLAS routine
a,af,equed,r,c,b,x,rcond,ferr,berr,info= PySLK.pvgesvx(a,b,fact='E')
x_num=PyACTS2Num(x)
if PyACTS.iread==1:
print "a*x=b --> x'=",transpose(x_num)
print "r=",transpose(r)
print "c=",transpose(c)
print "ferr:",transpose(ferr),"; berr=",transpose(berr)
print "Info:",info
PyACTS.gridexit()
El resultado en la ejecución de este ejemplo sería el siguiente:
[vgaliano@localhost EXAMPLES]$ mpirun -np 4 mpipython exPyScapvgesvx.py
Ejemplo de Utilizacion ScaLAPACK: PvGESVX
N= 8 ;nprow x npcol: 2 x 2
Tam. Bloques: 32 * 32
a= [[ 8. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 8. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 8. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 8. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 8. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 8. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 8. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 8.]]
b'= [[1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1]]
a*x=b --> x'= [[ 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125]
[ 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125]]
r= [ [ 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125]]
c= [ [ 1. 1. 1. 1. 1. 1. 1. 1.]]
ferr: [ [ 1.99840144e-15 1.99840144e-15 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]] ; berr= [ [ 0. 0. 0. 0. 0. 0. 0. 0.]]
Info: 0
See Sobre este documento... para sugerencias en cambios.