Main Content

linsolve

선형 연립방정식 풀기

설명

예제

X = linsolve(A,B)는 다음 방법 중 하나를 사용하여 선형 시스템 AX = B를 풉니다.

  • A정사각 행렬인 경우 linsolve는 부분 피벗 연산을 통한 LU 분해를 사용합니다.

  • 다른 모든 경우 linsolve는 열 피벗 연산을 통한 QR 분해를 사용합니다.

linsolveA의 조건이 나쁘거나(정사각 행렬인 경우) 랭크가 부족하면(직사각 행렬인 경우) 경고를 표시합니다.

예제

X = linsolve(A,B,opts)는 options 구조체 opts에 의해 결정되는 적절한 솔버를 사용합니다. opts의 필드는 행렬 A의 속성을 기술하는 논리값입니다. 예를 들어, A가 상부 삼각 행렬인 경우 opts.UT = true를 설정하여 linsolve가 상부 삼각 행렬용으로 설계된 솔버를 사용하도록 할 수 있습니다. linsolveAopts에 지정된 속성을 실제로 갖는지 여부를 확인하는 테스트를 수행하지 않습니다.

예제

[X,r] = linsolve(___)r도 반환합니다. r은 A의 조건수의 역수이거나(정사각 행렬인 경우) A의 랭크입니다(직사각 행렬인 경우). 위에 열거된 구문에 나와 있는 입력 인수를 원하는 대로 조합하여 사용할 수 있습니다. 이 구문을 사용하면 linsolveA의 조건이 나쁘거나 랭크가 부족한 경우 경고를 표시하지 않습니다.

예제

모두 축소

mldividelinsolve를 둘 다 사용하여 선형 시스템을 풀고 성능을 비교합니다.

mldivide는 MATLAB®에서 대부분의 선형 연립방정식을 풀 때 권장되는 방식입니다. 그러나 이 함수는 입력 행렬에 특별한 속성이 있는지 확인하기 위해 여러 검사를 수행합니다. 사전에 계수 행렬의 속성을 알고 있는 경우 linsolve를 사용하여 큰 행렬에 대해 시간이 오래 걸리는 검사를 방지할 수 있습니다.

10000×10000 마방진 행렬을 만들고 하부 삼각 부분을 추출합니다. opts 구조체의 LTtrue로 설정하여 A가 하부 삼각 행렬임을 나타냅니다.

A = tril(magic(1e4));
opts.LT = true;

선형 방정식 Ax=b의 우변에 해당하는 1로 구성된 벡터를 만듭니다. Ab의 행 개수는 같아야 합니다.

b = ones(size(A,2),1);

mldivide를 사용하여 선형 시스템 Ax=b를 풀고 계산에 걸린 시간을 측정합니다.

tic
x1 = A\b; 
t1 = toc
t1 = 0.0562

이번에는 linsolve를 사용하여 시스템을 다시 풉니다. linsolve가 하부 삼각 행렬에 대한 적절한 솔버를 선택할 수 있도록 options 구조체를 지정합니다.

tic
x2 = linsolve(A,b,opts);
t2 = toc
t2 = 0.0217

실행 시간을 비교하여 linsolve가 얼마나 더 빠른지 확인합니다. 여타 시간 비교와 마찬가지로, 결과는 컴퓨터와 MATLAB 릴리스에 따라 달라질 수 있습니다.

speedup = t1/t2
speedup = 2.5948

행렬 조건 경고를 표시하지 않도록 두 개의 출력값을 갖는 linsolve를 사용하여 선형 시스템을 풉니다.

20×20 힐베르트 테스트 행렬을 만듭니다. 이 행렬은 가장 큰 특이값이 가장 작은 특이값보다 약 2e18만큼 큰 유사 특이 행렬입니다.

A = hilb(20);

linsolve를 사용하여 A와 관련한 선형 시스템을 풉니다. A는 유사 특이 행렬이므로 linsolve는 경고를 반환합니다.

b = ones(20,1);
x = linsolve(A,b);
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =  5.628781e-20.

이번에는 linsolve에 두 개의 출력값을 지정하여 동일한 선형 시스템을 풉니다. MATLAB®은 경고를 표시하지 않고, 두 번째 출력값 rA의 조건수의 역수를 포함합니다. 이 구문을 사용해, 코드가 경고를 반환하지 않도록 하면서 특별한 경우에 해당하는 조건 나쁜 행렬을 코드에서 처리할 수 있습니다.

[x,r] = linsolve(A,b)
x = 20×1
109 ×

   -0.0000
    0.0000
   -0.0004
    0.0071
   -0.0592
    0.2819
   -0.7821
    1.1830
   -0.7030
   -0.1061
      ⋮

r = 5.6288e-20

입력 인수

모두 축소

계수 행렬입니다. A는 선형 연립방정식 AX = B의 좌변에 나타납니다. A의 행 개수는 B의 행 개수와 같아야 합니다.

A는 희소 행렬일 수 없습니다. 희소 행렬을 포함하는 선형 시스템을 풀려면 mldivide 또는 decomposition을 대신 사용하십시오.

데이터형: single | double
복소수 지원 여부:

입력 배열로, 벡터나 행렬로 지정됩니다. B는 선형 연립방정식 AX = B의 우변에 나타납니다. B가 행렬이면 이 행렬의 각 열은 우변의 서로 다른 벡터를 나타냅니다.

A의 행 개수는 B의 행 개수와 같아야 합니다.

데이터형: single | double
복소수 지원 여부:

계수 행렬 속성으로, 구조체로 지정됩니다. 이 구조체를 사용하여 linsolve가 선형 시스템에 대한 적절한 솔버를 선택하기 위해 사용하는 A의 속성을 지정합니다. 구조체의 필드는 A가 각 속성을 갖는지 여부를 나타내는 true/false 값을 포함합니다. 기본적으로, 구조체의 모든 필드는 false인 것으로 간주됩니다. 다음 표에는 opts의 가능한 필드와 그에 대응하는 행렬 속성이 나열되어 있습니다.

필드행렬 속성

LT

하부 삼각(0이 아닌 값이 주대각선 또는 그 아래에만 나타남)

UT

상부 삼각(0이 아닌 값이 주대각선 또는 그 위에만 나타남)

UHESS

상부 헤센베르크(첫 번째 하부대각선 밑의 값이 모두 0)

SYM

실수 대칭 또는 복소수 에르미트(자신의 전치와 동일한 행렬)

POSDEF

양의 정부호(모두 양의 고유값)

RECT

직사각 행렬(행 개수와 열 개수가 다름)

TRANSA

켤레 전치 — 함수가 A*X = B를 풀지(opts.TRANSA = false인 경우) 아니면 전치된 문제 A'*X = B를 풀지(opts.TRANSA = true인 경우) 지정

예: opts.UT = trueA가 상부 삼각 행렬임을 지정합니다.

예: opts.SYM = true, opts.POSDEF = true는 두 필드를 설정하여 A가 양의 정부호 대칭 행렬임을 지정합니다.

유효한 조합

다음 표의 행에는 linsolve에 유효한, opts의 필드 값의 모든 조합이 나열되어 있습니다. 빈 셀은 디폴트 값이 false이고, true/false 항목은 linsolve가 두 값을 모두 받음을 나타냅니다.

 

LT

UT

UHESS

SYM

POSDEF

RECT

TRANSA

A가 하부 삼각 행렬

true

    

true/false

true/false

A가 상부 삼각 행렬

 

true

   

true/false

true/false

A가 상부 헤센베르크 행렬

  

true

   

true/false

A가 대칭 행렬

   

true

true/false

 

true/false

A가 직사각 행렬

     

true/false

true/false

사용법에 대한 참고 사항

  • Aopts의 속성이 있는 경우 linsolve의 처리 속도는 mldivide보다 더 빠릅니다. 그 이유는 linsolveA에 지정된 속성이 있는지 여부를 확인하는 테스트를 수행하지 않고 즉시 적절한 솔버를 호출하기 때문입니다.

  • opts에 지정한 속성이 A없는 경우 linsolve는 잘못된 결과를 반환하지만 항상 오류 메시지를 반환하지는 않습니다. 따라서 A에 지정된 속성이 있는지 확실하지 않을 경우에는 mldivide 또는 decomposition을 대신 사용하십시오.

데이터형: struct

출력 인수

모두 축소

선형 시스템 해로, AX = B를 충족하는(또는 opts.TRANSA = true인 경우 ATX = B를 충족하는) 벡터 또는 행렬로 반환됩니다. X의 크기는 opts.TRANSA = true인지 여부에 따라 달라집니다.

  • Am×n이고 Bm×k이면 Xn×k이고 AX = B에 대한 해가 됩니다.

  • opts.TRANSA = true이면 Am×n이고 Bn×k입니다. 이 경우 Xm×k이고 ATX = B에 대한 해가 됩니다.

조건수의 역수 또는 랭크로, 스칼라로 반환됩니다.

  • A가 정사각 행렬이면 rA의 조건수의 역수입니다.

  • A가 직사각 행렬이면 rA의 랭크입니다.

  • opts가 지정된 경우 rA의 조건수의 역수입니다. 단, RECTtrue이고 LTUT가 모두 false인 경우 rA의 랭크입니다.

  • linsolve의 속도상 이점은 행렬 구조와 기본 알고리즘의 상대적 최적화에 따라 달라질 수 있습니다. 경우에 따라서는(예: 작은 행렬을 사용할 경우) mldivide에 비해 속도 향상 효과가 없을 수도 있습니다. linsolve를 사용함으로써 얻는 속도상의 이점은 큰 행렬의 속성에 대해 값비싼 검사를 수행하지 않거나 mldivide에서 선택되는 알고리즘보다 입력값에 더 적합한 알고리즘을 선택하는 데에서 비롯합니다.

확장 기능

버전 내역

R2006a 이전에 개발됨