[SciPy-user] Matlab to scipy
Nils Wagner
wagner.nils at vdi.de
Fri Oct 24 09:01:14 EDT 2003
Dear experts,
I tried to convert the following Matlab code to scipy.
(LU-factorization with complete pivoting)
http://www1.mate.polimi.it/~calnum/programs.html
However it failed. Any help would be appreciated
Nils
function [L,U,P,Q] = LUpivtot(A,n)
P=eye(n); Q=P; Minv=P;
for k=1:n-1
[Pk,Qk]=pivot(A,k,n);
A=Pk*A*Qk;
[Mk,Mkinv]=MGauss(A,k,n);
A=Mk*A;
P=Pk*P;
Q=Q*Qk;
Minv=Minv*Pk*Mkinv;
end
U=triu(A);
L=P*Minv;
function [Mk,Mkinv]=MGauss(A,k,n)
Mk=eye(n);
for i=k+1:n
Mk(i,k)=-A(i,k)/A(k,k);
end
Mkinv=2*eye(n)-Mk;
return
function [Pk,Qk]=pivot(A,k,n)
[y,i]=max(abs(A(k:n,k:n)));
[piv,jpiv]=max(y);
ipiv=i(jpiv);
jpiv=jpiv+k-1;
ipiv=ipiv+k-1;
Pk=eye(n);
Pk(ipiv,ipiv)=0;
Pk(k,k)=0;
Pk(k,ipiv)=1;
Pk(ipiv,k)=1;
Qk=eye(n);
Qk(jpiv,jpiv)=0;
Qk(k,k)=0;
Qk(k,jpiv)=1;
Qk(jpiv,k)=1;
return
-------------------------------------------------------------
from scipy import *
import MLab
def LUpivot(A,n):
P = MLab.eye(n)
Q = P
Minv = P
for k in arange(0,n):
Pk,Qk = pivot(A,k,n)
A = dot(Pk,dot(A,Qk))
Mk,Mkinv = MGauss(A,k,n)
A = dot(Mk,A)
P = dot(Pk,P)
Q = dot(Q,Qk)
Minv = dot(Minv,dot(Pk,Mkinv))
U = MLab.triu(A)
L = dot(P,Minv)
return L,U,P,Q
def MGauss(A,k,n):
Mk = MLab.eye(n)
for i in arange(k+1,n):
Mk[i,k]=-A[i,k]/A[k,k]
Mkinv = 2.0*MLab.eye(n)-Mk
return Mk, Mkinv
def pivot(A,k,n):
y,i = MLab.max(abs(A[k:n,k:n]))
piv,jpiv = MLab.max(y)
ipiv=i[jpiv]
jpiv=jpiv+k-1
ipiv=ipiv+k-1
Pk = MLab.eye(n)
Pk[ipiv,ipiv]=0
Pk[k,k] =0
Pk[k,ipiv] =1
Pk[ipiv,k] =1
Qk=MLab.eye(n)
Qk[jpiv,jpiv]=0
Qk[k,k] =0
Qk[k,jpiv] =1
Qk[jpiv,k] =1
#
# Example
#
A = array((
[-4000.0, 2000.0, 2000.0],
[ 2000.0, 0.78125, 0.0],
[ 2000.0, 0.0, 0.0]))
n,m=shape(A)
L,U,P,Q = LUpivot(A,n)
More information about the SciPy-User
mailing list