2015-02-02 7 views
1

처음에는 영어로 사과하고 싶습니다. 자, 내 문제로 가자.피벗하지 않고 LU 분해를 사용하여 방정식을 풀기 (Lapack 라이브러리)

는 I 선형 방정식 시스템의 해법을 찾을 수있는 간단한 코드를 작성하려고하면

도끼 = B, A는 정방 행렬 NXN이다

. 이 프로그램에서는 Lapack 라이브러리를 사용합니다 (피벗을 사용하지 않고 LU 분해를 사용해야합니다).

몇 가지 예를 발견했다. g .: Understanding LAPACK calls in C++ with a simple example 여기서 함수를 사용하는 방법을 볼 수 있습니다 : dgetrf_ 및 dgetrs_. 그러나 최상의 프로그램에서이 코드를 내 프로그램에 복사하더라도 올바른 결과 (예 : A와 B는 최상의 대답과 동일)를 반환하고 때로는 잘못된 결과 (예 : A = {1, -3, 1, -1}, b = {3, 5}, 정답은 {6, 1}이고 함수 반환 {-4, 7})입니다. 더 큰 행렬의 경우 잘못된 결과를 반환합니다. 아무도 왜 그런 말을 할 수 있습니까? 이 사이트에서

: https://software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mkl_lapack_examples/lapackro1.htm이 기록됩니다

LAPACK 루틴은 입력 행렬은 INF 또는 NaN이 같은 IEEE 754 특수 값을 포함하지 않는 가정합니다. 이러한 특수 값을 사용하면 LAPACK이 예기치 않은 결과를 반환하거나 불안정해질 수 있습니다.

INF는 "무한"을 의미하고 NaN은 "숫자가 아님"을 의미합니다. 맞습니까?

두 번째 문제점은 위의 예조차 제대로 작동하면 부분 인수가있는 LU 인수 분해를 사용한다는 것입니다. Lapack 라이브러리에서 함수가 필요합니다. Lapack 라이브러리는 pivoting없이 LU 인수 분해를 수행합니다. 나는이 기능을 연구했지만 아무것도 찾지 못했습니다. 이 (이들) 기능 (기능)이 무엇인지 아는 사람이 있습니까? 나는이 문제에 대한 해결책을 찾기를 희망하지 않는다.

답변

2

LAPACK 루틴은 FORTRAN으로 쓰여지고 데이터는 column major로 저장됩니다. 전치 된 A 행렬 시스템 A^T x = b을 풀고 있습니다. A = {1, 1, -3, -1}을 사용해보세요.

정확합니다. INF는 "무한"을 의미하고 NaN은 "숫자가 아닙니다"를 의미합니다.

LU 알고리즘은 항상 피벗을 사용합니다. 콜레 스키 분해는 피벗 (dpotrf, dpotrs)을 사용하지 않습니다. 그러나 당신의 행렬은 "대칭 포지티브"이어야합니다.

+0

답변 해 주셔서 감사합니다. 위쪽 화살표를 클릭하고 싶지만 평판 점수가 너무 낮아서 선택할 수 없습니다. 여러분이 맞습니다. 행렬 A를 바꿀 때 함수는 올바른 값을 반환합니다. LU 알고리즘이 항상 피벗을 사용하고 있습니까? 예인 경우 부분 회전으로 LU 인수 분해를 사용해야합니다. – Michal

+0

비대칭 행렬이있는 경우 피벗과 함께 LU를 사용해야합니다. 평판이 낮을 때 대답을 upvote 할 수 없습니다. 당신은 오직 맞는 것으로 받아 들일 수 있습니다. – ztik

+1

A = ((0, 1), (1, 0))을 고려해보십시오. 좀 더 세부 사항을 제공하기 만하면 비 특유의 행렬 A에 대해 LU 인수 분해가 있음을 보증하기 위해 피벗이 필요합니다. A = LU와 같은 비 특이 삼각형 L과 U가 존재하지 않습니다. 우선 행간 교환 ("피벗")을 적용하여 PA = LU 형식의 인수 분해를 얻은 다음 L = U = ID를 얻습니다. –

관련 문제