Main Content

lsqminnorm

선형 방정식에 대한 최소 노름 최소제곱해

설명

예제

X = lsqminnorm(A,B)는 선형 방정식 AX = B를 풀고 norm(A*X-B)의 값을 최소화하는 배열 X를 반환합니다. 이 문제에 대해 여러 개의 해가 존재하면, lsqminnormnorm(X)를 최소화하는 해를 반환합니다. B에 여러 개의 열이 있으면 앞의 문은 각각 XB의 각 열에 대해 참입니다.

예제

X = lsqminnorm(A,B,tol)lsqminnormA의 랭크를 파악하는 데 사용하는 허용오차를 추가로 지정합니다.

예제

X = lsqminnorm(___,rankWarn)에서는 A의 랭크가 낮을 경우 경고를 표시하는 선택적 플래그를 지정합니다. 위에 열거된 구문에 나와 있는 입력 인수를 원하는 대로 조합하여 사용할 수 있습니다. rankWarn'nowarn'(디폴트)이거나 'warn'일 수 있습니다.

예제

모두 축소

백슬래시(\)와 lsqminnorm을 사용하여 무수히 많은 해를 가지는 선형 시스템을 풉니다. 해의 2-노름을 사용하여 결과를 비교합니다.

Ax=b에 대해 무한한 해가 존재할 때, 각 해는 Ax-b를 최소화합니다. 백슬래시 명령(\)은 이러한 해를 하나 계산하지만, 보통 이렇게 계산된 해는 x를 최소화하지 않습니다. lsqminnorm으로 계산된 해는 norm(A*x-b)뿐만 아니라, norm(x)도 최소화합니다.

방정식 하나와 2개의 미지수를 사용하는 단순 선형 시스템, 2x1+3x2=8을 보겠습니다. 방정식 수가 미지수 수보다 적으므로, 이는 부족 결정 시스템입니다. 백슬래시와 lsqminnorm을 모두 사용하여 방정식을 풉니다.

A = [2 3];
b = 8;
x_a = A\b
x_a = 2×1

         0
    2.6667

x_b = lsqminnorm(A,b)
x_b = 2×1

    1.2308
    1.8462

백슬래시는 norm(A*x-b)를 최소화하는 데만 목표를 두는 반면, lsqminnormnorm(x)를 최소화하는 데도 목표를 두기 때문에 두 방법은 서로 다른 해를 얻습니다. 이러한 노름을 계산하고 결과를 테이블에 넣어 비교하기 쉽게 합니다.

s1 = {'Backslash'; 'lsqminnorm'};
s2 = {'norm_Ax_minus_b','norm_x'};
T = table([norm(A*x_a-b); norm(A*x_b-b)],[norm(x_a); norm(x_b)],'RowNames',s1,'VariableNames',s2)
T=2×2 table
                  norm_Ax_minus_b    norm_x
                  _______________    ______

    Backslash                0       2.6667
    lsqminnorm      1.7764e-15       2.2188

아래 그림에서 이런 상황을 설명하고 각 방법이 어떤 해를 반환하는지 보여줍니다. 파란색 선은 방정식 x2=-23x1+83에 대한 무한한 개수의 해를 나타냅니다. 주황색 원은 원점에서 해로 구성된 선까지 최소 거리를 나타내고 lsqminnorm에서 반환된 해는 선과 원 사이의 접점에 정확히 놓여, 이것이 원점과 가장 가까운 해임을 나타냅니다.

랜덤 잡음으로 인해 잘못된 해가 구해지지 않도록 lsqminnorm에서 랭크 계산 시 허용오차를 지정하는 것이 문제의 규모를 정의하는 데 도움을 준다는 것을 확인해 봅시다.

랭크 5의 낮은 랭크 행렬과 우변의 벡터 b를 만듭니다.

rng default % for reproducibility
U = randn(200,5);
V = randn(100,5);
A = U*V';
b = U*randn(5,1) + 1e-4*randn(200,1);

lsqminnorm을 사용하여 선형 시스템 Ax=b를 풉니다. A*x-bx의 노름을 계산하여 해의 품질을 확인합니다.

x = lsqminnorm(A,b);
norm(A*x-b)
ans = 0.0014
norm(x)
ans = 0.1741

이제 소량의 잡음을 행렬 A에 추가하고 선형 시스템을 다시 풉니다. 잡음은 선형 시스템의 해 벡터 x에 불균형적으로 영향을 미칩니다.

Anoise = A + 1e-12*randn(200,100);
xnoise = lsqminnorm(Anoise,b);
norm(Anoise*xnoise - b)
ans = 0.0010
norm(xnoise)
ans = 1.1214e+08

해에서 큰 차이가 나는 이유는 잡음이 A의 낮은 랭크 근삿값에 영향을 주기 때문입니다. 즉, lsqminnormA의 QR 분해에서 R 행렬의 대각선에 있는 작은 값들을 실제보다 더 중요한 것으로 취급합니다. 이상적으로는 R의 대각선에 있는 이러한 작은 값들이 0으로 취급되어야 합니다.

Anoise의 QR 분해에서 R 행렬의 대각선 요소를 플로팅하십시오. 많은 수의 대각선 요소가 1e-10의 차수에 있습니다.

[Q,R,p] = qr(Anoise,0);
semilogy(abs(diag(R)),'o')

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

이러한 문제에 대한 해결 방법은 lsqminnorm에서 사용된 허용오차를 늘려 1e-8보다 오차가 적은 Anoise의 낮은 랭크 근삿값이 계산에 사용되도록 하는 것입니다. 이렇게 하면 결과는 잡음에 훨씬 덜 영향을 받게 됩니다. 허용오차를 사용한 경우의 해는 원래 해인 x에 매우 가깝습니다.

xnoise = lsqminnorm(Anoise, b, 1e-8);
norm(Anoise*xnoise - b)
ans = 0.0014
norm(xnoise)
ans = 0.1741
norm(x - xnoise)
ans = 1.0778e-14

경고를 설정한 상태로 낮은 랭크 계수 행렬을 포함하는 선형 시스템의 해를 구합니다.

랭크 2의 3×3 행렬을 만듭니다. 이 행렬에서는 처음 두 개 열을 서로 더한 값이 세 번째 열이 됩니다.

A = [1 2 3; 4 5 9; 6 7 13]
A = 3×3

     1     2     3
     4     5     9
     6     7    13

문제 Ax=b에 대한 최소 노름 최소제곱해를 찾습니다. 여기서 bA의 두 번째 열과 같습니다. 낮은 랭크의 A가 감지될 경우 경고를 표시하려면 lsqminnorm에 대한 'warn' 플래그를 지정하십시오.

b = A(:,2);
x = lsqminnorm(A,b,'warn')
Warning: Rank deficient, rank = 2, tol =  1.072041e-14.
x = 3×1

   -0.3333
    0.6667
    0.3333

입력 인수

모두 축소

계수 행렬입니다. 계수 행렬은 선형 연립방정식 Ax = B의 좌변에 나타납니다. 계수 행렬은 비희소 또는 희소 행렬일 수 있습니다.

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

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

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

랭크 허용오차로, 음이 아닌 스칼라로 지정됩니다. 허용오차를 지정하면 계수 행렬에서 해의 랜덤 잡음이 발생하지 않게 하는 데 도움이 될 수 있습니다. 기본적으로, lsqminnormA의 QR 분해를 기반으로 tol을 계산합니다.

lsqminnormA의 랭크를 tol보다 큰 절댓값을 사용하는 QR 분해 [Q,R,p] = qr(A,0)R 행렬에 있는 대각선 요소의 개수로 계산합니다. A의 랭크가 k인 경우, 이 함수는 Q의 처음 k개 열과 R의 처음 k개 행을 곱하여 A의 낮은 랭크 근삿값을 만듭니다. 허용오차를 변경하면 A의 낮은 랭크 근삿값이 달라집니다.

예: X = lsqminnorm(A,B,1e-2)

데이터형: double

낮은 랭크 행렬에 대한 경고 설정 여부로, 'nowarn' 또는 'warn'으로 지정됩니다. 계수 행렬 A가 랭크 부족 행렬인 경우 lsqminnorm에서 경고를 생성해야 함을 나타내려면 'warn'을 지정하십시오.

예: X = lsqminnorm(A,B,'warn')

  • lsqminnorm에서 계산한 최소 노름 해는 여러 개의 해가 존재할 때 특히 유용합니다. A가 부족 결정(열보다 행이 적음)이거나 랭크가 낮은 경우라면 선형 방정식 Ax = b에는 많은 해가 있습니다.

  • 선형 연립방정식에 대한 최소 노름 최소제곱해를 계산할 경우 일반적으로 lsqminnorm(A,B,tol)pinv(A,tol)*B보다 더 효율적입니다. lsqminnorm은 COD(Complete Orthogonal Decomposition)를 사용하여 A의 낮은 랭크 근삿값을 구하는 반면, pinv는 SVD(Singular Value Decomposition)를 사용합니다. 따라서, pinvlsqminnorm의 결과가 정확히 일치하지 않습니다.

  • 희소 행렬의 경우, lsqminnorm은 밀도 행렬의 경우와는 다른 알고리즘을 사용하므로 다른 결과를 생성할 수 있습니다.

확장 기능

버전 내역

R2017b에 개발됨

참고 항목

| |

도움말 항목