Có một số vấn đề trong câu hỏi của bạn.
Không sử dụng Loại bỏ Gaussian (hệ số LU) để tính thứ hạng số của ma trận. Hệ số LU không đáng tin cậy cho mục đích này trong số học dấu phẩy động. Thay vào đó, hãy sử dụng phân tách QR tiết lộ thứ hạng (chẳng hạn như xGEQPX
hoặc xGEPQY
trong LAPACK, trong đó x là C, D, S hoặc Z, mặc dù những thói quen đó rất khó theo dõi; xem câu trả lời của JedBrown về câu hỏi liên quan ) hoặc sử dụng SVD (phân tách giá trị số ít, chẳng hạn như xGESDD
hoặc xGESVD
, trong đó x lại là C, D, S hoặc Z). SVD là một thuật toán chính xác, đáng tin cậy hơn để xác định thứ hạng số, nhưng nó đòi hỏi nhiều thao tác dấu phẩy động hơn.
Tuy nhiên, để giải quyết một hệ thống tuyến tính, hệ số LU (với trục xoay một phần, là triển khai tiêu chuẩn trong LAPACK) là cực kỳ đáng tin cậy trong thực tế. Có một số trường hợp bệnh lý mà hệ số LU với trục xoay một phần không ổn định (xem Bài giảng 22 trong Đại số tuyến tính sốbởi Trefethen và Bau để biết chi tiết). Yếu tố QR là một thuật toán số ổn định hơn để giải quyết các hệ thống tuyến tính, đó có thể là lý do tại sao nó mang lại cho bạn kết quả chính xác như vậy. Tuy nhiên, nó đòi hỏi nhiều phép toán dấu phẩy động hơn hệ số LU theo hệ số 2 cho ma trận vuông (tôi tin rằng; JackPoulson có thể sửa cho tôi về điều đó). Đối với các hệ thống hình chữ nhật, hệ số QR là một lựa chọn tốt hơn bởi vì nó sẽ mang lại các giải pháp bình phương nhỏ nhất cho các hệ thống tuyến tính quá hạn. SVD cũng có thể được sử dụng để giải quyết các hệ thống tuyến tính, nhưng nó sẽ đắt hơn so với hệ số QR.
janneb là chính xác rằng numpy.linalg.svd là một trình bao bọc xGESDD
trong LAPACK. Phân rã giá trị số ít tiến hành trong hai giai đoạn. Đầu tiên, ma trận cần phân tách được giảm xuống dạng hai chiều. Thuật toán được sử dụng để giảm xuống dạng hai chiều trong LAPACK có lẽ là thuật toán Lawson-Hanson-Chan và nó sử dụng hệ số QR tại một điểm. Bài giảng 31 trong Đại số tuyến tính số của Trefethen và Bau đưa ra một cái nhìn tổng quan về quá trình này. Sau đó, xGESDD
sử dụng thuật toán chia và chinh phục để tính các giá trị số ít và các vectơ số đơn bên trái và bên phải từ ma trận hai chiều. Để có được nền tảng về bước này, bạn sẽ cần tham khảo Tính toán ma trận của Golub và Van Loan hoặc Đại số tuyến tính số ứng dụng của Jim Demmel.
Cuối cùng, bạn không nên nhầm lẫn các giá trị số ít với giá trị riêng . Hai bộ số lượng này không giống nhau. SVD tính toán các giá trị số ít của ma trận. Tính toán số của Cleve Moler với MATLAB cung cấp một cái nhìn tổng quan tốt đẹp về sự khác biệt giữa các giá trị số ít và giá trị riêng . Nói chung, không có mối quan hệ rõ ràng giữa các giá trị số ít của một ma trận nhất định và các giá trị riêng của nó, ngoại trừ trong các ma trận thông thường , trong đó các giá trị số ít là giá trị tuyệt đối của các giá trị riêng.
dgesdd
cho các SVD có giá trị thực. Vì vậy, câu hỏi thực sự của bạn có lẽ là "Lapack dgesdd hoạt động như thế nào?", Và đó là chủ đề khá hay cho stackoverflow.