Matrix inversion

Jim Hurley jhurley at infostations.com
Mon Mar 31 09:18:01 EST 2003


Michael,

Thank you for these routines. I think if I can get them to work I 
can find the matrix inverse. My source for numerical work is : 
Numerical analysis, by Richard Burden. It gives only  algorithms and 
not program routines.

Unfortunately I am having trouble with your handlers. I tried a 
simple set of linear equations:

x + 2y = 1
x + y = 0

With the solution: x = -1 and y = 1.

But the routine below, LUBKSB, yields  x = -2 and y = 1.

I  used

aMatrix = 1,2
                 1,1

  with  n = 2

and

rhsMatrix =1
                   0

Any ideas?

Jim


At 2:40 PM +1000 3/31/03, Michael J. Lew wrote:
>Here are a couple of matrix handlers that I translated from Fortran 
>routines published in the excellent Numerical Recipes book by Press 
>et al. Not enough entirely to invert matrices (that wasn't what I 
>needed them for), but the small additional routine is fully 
>documented in a downloadable pdf from 
><http://lib-www.lanl.gov/numerical/bookfpdf.html>.
>
>For anyone who does numerical work I highly recommend the Numerical 
>Recipes books.
>
>#--****** LUBKSB ******
># Function Revolutionised from Numerical Recipes by MJL
># --Input is aMatrix, an n by n square matrix and rhsMatrix, an n by 1 vector
># also uses the global indx which is built by LUDCMP
># Returns an n by 1 vector solution
># For use with LUDCMP to solve linear equations or invert a matrix
># Note that the input and output parameters are not fully equivalent 
>to the originals
>
>function LUBKSB aMatrix,n,rhsMatrix
>   global indx
>   put aMatrix into a
>   put rhsMatrix into b
>   set the numberformat to "0.#########################"
>   put 0 into ii
>   repeat with i =1 to n
>      put indx[i] into ip
>     put b[ip] into mySum
>     put b[i] into b[ip]
>      if ii<>0 then
>       repeat with j = ii to i-1
>         put  mySum-a[i,j]*b[j] into mySum
>        end repeat --j
>     else
>       if mySum <> 0 then put i into ii
>      end if
>     put mySum into b[i]
>    end repeat --i
>   repeat with i = n down to 1
>     put b[i] into mySum
>     if i<n then
>       repeat with j = i+1 to n
>         put mySum-a[i,j]*b[j] into mySum
>       end repeat --j
>      end if
>     put mySum/a[i,i] into b[i]
>    end repeat --i
>   return b
>end LUBKSB
>
>
>
>#--***** LUDCMP *****
># Function Revolutionised by MJL from Numerical Recipes subroutine ludcmp
># input is an n by n square matrix, aMatrix
># returns aMatrix modified to be an LU decomposed version of itself
># also returns (a global) indx which is a vector of the row perms 
>affected by partial pivoting (!)
># For use in conjunction with LUBKSB to solve linear equations or 
>invert a matrix
># Note that the input and output parameters are not fully equivalent 
>to the originals
>
>function LUDCMP amatrix,n
>   global indx
>   set the numberformat to "0.#########################"
>   put 10^-22 into tiny
>   put aMatrix into a
>   put 1 into d
>   repeat with i = 1 to n
>     put 0 into big
>     repeat with j=1 to n
>       if abs(a[i,j]) >big then put a[i,j] into big
>     end repeat --j
>     if big =0 then
>       answer "Singular matrix in LUDCMP. Procedure failed"
>       exit to top
>     end if
>     put 1/big into vv[i]
>   end repeat --i
>   repeat with j=1 to n
>     repeat with i=1 to j-1
>       put a[i,j] into mySum
>       repeat with k = 1 to i-1
>         put mySum-a[i,k]*a[k,j] into mySum
>       end repeat --k
>       put mySum into a[i,j]
>     end repeat --i
>     put 0 into big
>     repeat with i=j to n
>       put a[i,j] into mySum
>       repeat with k=1 to j-1
>         put mySum-a[i,k]*a[k,j] into mySum
>       end repeat --k
>       put mySum into a[i,j]
>       put abs(mySum)*vv[i] into dum
>       if dum>big then
>         put dum into big
>         put i into imax
>       end if
>     end repeat --i
>     if j<>imax then
>       repeat with k=1 to n
>         put a[imax,k] into dum
>         put a[j,k] into a[imax,k]
>         put dum into a[j,k]
>       end repeat --k
>       put -d into d
>       put vv[j] into vv[imax]
>     end if
>     put imax into indx[j]
>     if a[j,j] =0 then put tiny into a[j,j]
>     if j<>n then
>       put 1/(a[j,j]) into dum
>       repeat with i=j+1 to n
>         put dum*a[i,j] into a[i,j]
>       end repeat --i
>     end if
>   end repeat --j
>   return a
>end LUDCMP
>
>
>
>--
>Michael J. Lew
>
>Senior Lecturer
>Department of Pharmacology
>The University of Melbourne
>Parkville 3010
>Victoria
>Australia
>
>Phone +613 8344 8304
>
>**
>New email address: michaell at unimelb.edu.au
>**




More information about the use-livecode mailing list