LU Decomposition from Numerical Recipes not working; what am I doing wrong?

后端 未结 4 2156
小鲜肉
小鲜肉 2021-01-13 23:01

I\'ve literally copied and pasted from the supplied source code for Numerical Recipes for C for in-place LU Matrix Decomposition, problem is its not working.

I\'m s

4条回答
  •  独厮守ぢ
    2021-01-13 23:08

    To badly paraphrase Albert Einstein:

    ... a man with a watch always knows the exact time, but a man with two is never sure ....

    Your code is definitely not producing the correct result, but even if it were, the result with pivoting will not directly correspond to the result without pivoting. In the context of a pivoting solution, what Alpha has really given you is probably the equivalent of this:

        1  0  0      1  0  0       1  3 -2
    P=  0  1  0   L= 2  1  0  U =  0 -2  7
        0  0  1      3  2  1       0  0 -2
    

    which will then satisfy the condition A = P.L.U (where . denotes the matrix product). If I compute the (notionally) same decomposition operation another way (using the LAPACK routine dgetrf via numpy in this case):

    In [27]: A
    Out[27]: 
    array([[ 1,  3, -2],
           [ 3,  5,  6],
           [ 2,  4,  3]])
    
    In [28]: import scipy.linalg as la
    
    In [29]: LU,ipivot = la.lu_factor(A)
    
    In [30]: print LU
    [[ 3.          5.          6.        ]
     [ 0.33333333  1.33333333 -4.        ]
     [ 0.66666667  0.5         1.        ]]
    
    In [31]: print ipivot
    [1 1 2]
    

    After a little bit of black magic with ipivot we get

        0  1  0       1        0    0       3  5       6
    P = 0  0  1   L = 0.33333  1    0  U =  0  1.3333 -4
        1  0  0       0.66667  0.5  1       0  0       1
    

    which also satisfies A = P.L.U . Both of these factorizations are correct, but they are different and they won't correspond to a correctly functioning version of the NR code.

    So before you can go deciding whether you have the "right" answer, you really should spend a bit of time understanding the actual algorithm that the code you copied implements.

提交回复
热议问题