Matlab 자습서(6) - 선형 방정식의 솔루션

        과학 컴퓨팅에서 가장 중요한 문제 중 하나는 연립 선형 방정식의 솔루션입니다. 행렬 표기법에서 일반적인 질문은 다음과 같은 형식을 취합니다. 두 개의 행렬 A와 b가 주어지면 Ax = b 또는 xA = b와 같은 고유한 행렬 x가 있습니까?
        1차원적 예를 고려하는 것이 유익합니다. 예를 들어, 방정식
        7x = 21
        고유한 솔루션이 있습니까?
        대답은 물론 '예'입니다. 방정식에는 고유한 솔루션 x = 3이 있습니다. 솔루션은 부서별로 쉽게 찾을 수 있습니다.
        x = 21/7 = 3。
        해결책은 일반적으로 7의 역수를 계산하여 찾을 수 없습니다. 즉, 7 –1 = 0.142857...을 계산한 다음 7 –1에 21을 곱합니다. 이렇게 하려면 더 많은 작업이 필요하며 7-1이 제한된 자릿수로 표시되는 경우 정확도가 떨어집니다. 미지수가 여러 개인 선형 방정식 시스템에도 유사한 고려 사항이 적용되며, MATLAB은 이러한 방정식을 풀 때 역행렬을 계산하지 않습니다.
        이것이 표준 수학 표기법은 아니지만 MATLAB은 스칼라 예제에서 일반적인 나눗셈 용어를 사용하여 일반 연립방정식의 해를 설명합니다. 두 개의 나누기 기호인 슬래시 / 및 백슬래시 \는 각각 MATLAB 함수 mrdivide mldivide 에 해당합니다 . 알려지지 않은 행렬이 계수 행렬의 왼쪽 또는 오른쪽에 각각 나타날 때 두 개의 연산자가 사용됩니다.
x = b/A
mrdivide 를         사용하여 얻은 행렬 방정식 xA = b의 해를 나타냅니다.
x = 에이\b
mldivide 를 사용하여 얻은 행렬 방정식 Ax = b 의 해를         나타냅니다 .
        방정식 Ax = b 또는 xA = b의 양변을 A로 "나누는" 것을 고려하십시오. 계수 행렬 A는 항상 "분모"에 있습니다.
        x = A\b 의 차원 호환성 조건에서는 두 행렬 A b 의 행 수가 동일해야 합니다. 따라서 솔루션 x는 b 와 동일한 수의 열을 가지며 해당 행 차원은 A 의 열 차원 과 같습니다. x = b/A 의 경우 행과 열의 역할이 반대입니다.
        사실, Ax=b 형식의 선형 방정식 시스템은 xA=b 형식의 선형 방정식 시스템보다 더 일반적입니다. 따라서 백슬래시는 슬래시보다 훨씬 자주 사용됩니다. 이 섹션의 나머지 부분에서는 백슬래시 연산자에 중점을 둡니다. 슬래시 연산자의 해당 속성은 다음 ID에서 유추할 수 있습니다.
(b/A)' = (A'\b').
        계수 행렬 A는 정사각 행렬일 필요는 없습니다. A 의 크기가 m×n 이면 세 가지 경우가 있습니다.
        엠 = 엔
        정사각 행렬 방정식. 정확한 해결책을 찾으십시오.
        m > n
        과결정 연립방정식이란 방정식의 수가 미지수의 수보다 많다는 것을 의미합니다. 최소제곱해를 구합니다.
        m < n
        미달 연립방정식, 즉 방정식의 수가 미지수의 수보다 적습니다. 최대 m개의 0이 아닌 성분을 사용하여 기본 솔루션을 찾습니다.

1ml나누기 알고리즘

        mldivide 연산자는 다양한 유형의 계수 행렬에 대해 서로 다른 솔버를 사용합니다. 계수 행렬을 검토하여 다양한 조건을 자동으로 진단합니다.
        선형 방정식 시스템 Ax = b에 대한 일반 솔루션은 가능한 모든 솔루션을 설명합니다. 일반적인 솔루션은 다음에서 찾을 수 있습니다.
        1 해당 동차 방정식 시스템 Ax = 0의 해를 찾습니다. null (A) 를 입력하여 null 명령을 사용하십시오 . 이는 솔루션 공간의 기저 벡터를 Ax=0으로 복원합니다. 모든 솔루션은 기본 벡터의 선형 조합입니다.
        2 방정식 Ax = b의 비균질 시스템에 대한 특정 솔루션을 찾습니다. Ax = b에 대한 모든 솔루션은 2단계의 Ax = b에 대한 특정 솔루션과 1단계의 기본 벡터의 선형 조합의 합으로 작성할 수 있습니다. 이 섹션의 나머지 부분에서는 2단계에서 설명한 대로 MATLAB을 사용하여 Ax = b에 대한 특정 솔루션을 찾는 방법을 설명합니다.

2 정사각 행렬 방정식

        가장 일반적인 경우는 정사각형 계수 행렬 A 와 오른쪽 단일 열 벡터 b 입니다 .

2.1 비특이 계수 행렬

        행렬 A가 특이 행렬이 아닌 경우 해 x = A\b의 크기는 b 와 같습니다 . 예를 들어:
A = pascal(3);
u = [3; 1; 4];
x = A\u
엑스 =
10
-12
5
A*x 가 정확히 u 와 같음을         확인할 수 있습니다 . Ab 가 정사각 행렬 이고 크기가 같으면 x = A\b 도 크기가 같습니다.
b = magic(3);
X = A\b
X =
19 -3 -1
-17 4 13
6 0 -6
A*x 가 b 와 정확히 같다는         것을 확인할 수 있습니다 . 위의 두 가지 예에는 정확한 정수 솔루션이 있습니다. 이는 계수 행렬이 풀 랭크(non-singular)인 pascal(3) 로 선택되었기 때문입니다.

2.2 특이 계수 행렬

        정사각 행렬 A는 선형 독립 열을 포함하지 않는 경우 특이 행렬입니다. A가 특이이면 솔루션 Ax = b는 존재하지 않거나 고유합니다. 백슬래시 연산자 A\b 는 A 가 특이점에 가깝 거나 전체 특이점이 감지되면 경고합니다 . A가 특이이고 Ax = b에 해가 있는 경우 다음을 입력하여 고유하지 않은 특정 해를 찾을 수 있습니다.
P = pinv(A)*b
        pinv(A)는 A의 유사 역함수입니다. Ax = b에 대한 정확한 솔루션이 없으면 pinv(A)는 최소 제곱 솔루션을 반환합니다. 예를 들어:
A = [ 1 3 7 ; -1 4 4 ; 1 10 18 ]은 다음을 입력하여 확인할 수 있는 특이 행렬입니다.
rank(A)
답변 =
2
        A는 풀 랭크가 아니므로 0과 같은 일부 특이값을 가집니다. b =[5;2;12] 의 경우 방정식 Ax = b의 정확한 해는 다음과 같습니다.
pinv(A)*b
답변 =
0.3850
-0.1103
0.7066
        다음을 입력하여 pinv(A)*b가 정확한 해인 지 확인하십시오.
A*pinv(A)*b
답변 =
5.0000
2.0000
12.0000
        그러나 b = [3;6;0] 이면 Ax = b에는 정확한 해가 없습니다. 이 경우 pinv(A)*b는 최소 제곱을 반환합니다.
곱셈 솔루션. 유형
A*pinv(A)*b
답변 =
-1.0000
4.0000
2.0000
        원래 벡터 b는 반환되지 않습니다 . Ax = b가 정확한 해를 갖는지 여부는 증가 행렬 [A b] 의 기약 행 사다리꼴을 구함으로써 결정할 수 있습니다 . 이렇게 하려면 이 예에서 다음을 입력하십시오.
rref([A b])
답변 =
1.0000 0 2.2857 0
0 1.0000 1.5714 0
0 0 0 1.0000
        맨 아래 행이 모두 0(마지막 항 제외)이므로 방정식에는 해가 없습니다. 이 경우 pinv(A)는 최소 제곱해를 반환합니다.

3 과결정 방정식

        이 예는 과도하게 결정된 방정식 시스템이 실험 데이터에 대한 다양한 곡선 맞춤에서 일반적으로 발생하는 방식을 보여줍니다. 수량 y는 다음 관찰을 생성하기 위해 시간 t 의 여러 다른 값에서 측정됩니다 . 다음 문을 사용하여 데이터를 테이블에 입력하고 볼 수 있습니다.
t = [0 .3 .8 1.1 1.6 2.3]';
y = [.82 .72 .63 .60 .55 .50]';
B = table(t,y)
B=6×2 테이블
타이
___ ____
0 0.82
0.3 0.72
0.8 0.63
1.1 0.6
1.6 0.55
2.3 0.5
        지수 감쇠 함수로 데이터 모델링 시도
 
        앞의 방정식은 벡터 y가 두 개의 다른 벡터의 선형 조합으로 근사되어야 함을 나타냅니다. 하나는 모두 1인 상수 벡터이고 다른 하나는 성분 exp(-t) 가 있는 벡터 입니다. 알 수 없는 계수 c 1 c 2는 모델에서 데이터 편차의 제곱합을 최소화하는 최소 제곱법을 수행하여 계산할 수 있습니다. 두 개의 알려지지 않은 계수의 경우 6×2 행렬로 표현되는 6개의 방정식이 있습니다.
E = [ones(size(t)) exp(-t)]
E = 6×2
1.0000 1.0000
1.0000 0.7408
1.0000 0.4493
1.0000 0.3329
1.0000 0.2019
1.0000 0.1003
        백슬래시 연산자를 사용하여 최소 제곱 솔루션을 얻습니다.
c = E\y
c = 2×1
0.4760
0.3413
        즉, 데이터에 맞는 최소 제곱은 다음과 같습니다.
 
다음 명령문은 t 증분         의 일정한 간격으로 모델을 평가한 다음 원래 데이터와 함께 결과를 플로팅합니다.
T = (0:0.1:2.5)';
Y = [ones(size(T)) exp(-T)]*c;
plot(T,Y,'-',t,y,'o')

        E*c 는 y 와 정확히 같지는 않지만 그 차이는 원시 데이터의 측정 오류보다 훨씬 작을 수 있습니다. 직사각형 행렬 A 는 선형 독립 열이 없는 경우 순위 부족입니다. A가 순위가 부족한 경우 AX = B 의 최소 제곱 솔루션은 고유하지 않습니다. A가 순위가 부족한 경우 A\B는 경고를 발행하고 최소 제곱 솔루션을 생성합니다. lsqminnorm을 사용하여 모든 해 중에서 노름이 가장 작은 해 X를 찾을 수 있습니다 .

4 미달 방정식

        이 예는 미달 방정식 시스템에 대한 솔루션이 고유하지 않음을 보여줍니다. 미달 선형 방정식 시스템은 방정식보다 더 많은 미지수를 포함합니다. MATLAB 왼쪽 나누기 행렬 연산은 기본 최소 제곱해를 구합니다. m × n 계수 행렬의 경우 최대 m 개의 0이 아닌 성분이 있습니다.
다음은 간단한 임의의 예입니다.
R = [6 8 7 3; 3 5 4 1]
rng(0);
b = randi(8,2,1)
R =
6 8 7 3
3 5 4 1
b =
7
8
선형 방정식 시스템 Rp = b 에는 2개의 방정식과 4개의 미지수가 있습니다. 계수 행렬에는 작은 정수가 포함되어 있으므로 format 명령을 사용하여 해를 유리수 형식으로 표시하는 것이 적절합니다 . 다음 명령으로 특정 솔루션을 얻을 수 있습니다.
format rat
p = R\b
p =
0
17/7
0
-29/7
        0이 아닌 성분 중 하나는 p(2) 입니다. R(:,2)가 가장 큰 노름을 갖는 R 의 열이기 때문 입니다 . 0이 아닌 다른 구성 요소는 R(:,4) 가 R(:,2) 를 제거한 후 제어하기 때문에 p(4) 입니다. 과소 결정된 연립방정식의 완전한 일반 해는 p 와 null 함수 를 사용하여 계산할 수 있는 모든 null 공간 벡터의 선형 조합으로 나타낼 수 있습니다 (합리적 기저를 요청하는 옵션 포함).
Z = null(R,'r')
지 =
-1/2 -7/6
-1/2 1/2
1 0
0 1
R*Z 가 0이고 잔차 R*x - b가 임의의 벡터 x 보다 훨씬 작다는 것을         확인할 수 있습니다 (여기서 x = p + Z*q)  . Z 의 열이 0 공간 벡터이므로 Z *q 다음 벡터 선형 조합입니다.
        이를 설명하기 위해 임의의 q를 선택하고 x를 구성 하고 잔차의 노름을 계산합니다.
q = [-2; 1];
x = p + Z*q;
format short
norm(R*x - b)
답변 =
2.6645e-15
        해가 무한히 많은 경우 최소 노름 해는 특별한 의미가 있습니다. lsqminnorm을 사용하여 최소 노름 최소 제곱해를 계산할 수 있습니다 . 이 해는 가능한 가장 작은 norm(p) 값을 가집니다.
p = lsqminnorm(R,b)
p =
-207/137
365/137
79/137
-424/137

5 우변이 여러 개인 선형 방정식의 해

특정 문제는 계수 행렬 A         는 같지만 우변 b 가 다른 선형 방정식 시스템을 푸는 것과 관련됩니다. b 의 다른 값을 동시에 사용할 수 있는 경우 b를 다중 열 행렬로 구성하고 단일 백슬래시 명령으로 모든 방정식 시스템을 풀 수 있습니다 . X = A\[b1 b2 b3 …] . 그러나 때때로 b 의 다른 값 을 모두 동시에 사용할 수 없는 경우가 있습니다. 즉, 여러 방정식 시스템을 연속적으로 풀어야 합니다. 방정식 시스템 중 하나가 슬래시(/) 또는 백슬래시(\)를 사용하여 해결되면 연산자는 계수 행렬 A 를 분해 하고 이 행렬 분해를 사용하여 해결합니다. 그러나 이후에 유사한 연립방정식이 다른 b 로 풀릴 때 마다 연산자는 중복 계산인 A 의 동일한 분해를 수행합니다 . 이 문제에 대한 해결책은 A 의 분해를 미리 계산한 다음 요인을 재사용하여 b 의 다른 값을 해결하는 것 입니다. 그러나 실제로는 계산할 분해(LU, LDL, Cholesky 등)와 문제를 해결하기 위해 분해 방법을 알아야 하기 때문에 이러한 방식으로 분해를 미리 계산하는 것은 어려울 수 있습니다. 예를 들어, LU 분해를 사용하면 원래 방정식 Ax = b 시스템을 풀기 위해 두 개의 선형 방정식 시스템을 풀어야 합니다.
[L,U] = lu(A);
x = U \ (L \ b);
여러 개의 연속된 우변이 있는 선형 방정식 시스템의 경우 분해 개체         를 사용하여 해결하는 것이 좋습니다 . 이러한 개체를 사용하면 행렬 요소를 사용하는 방법을 이해하지 않고도 미리 계산된 행렬 분해의 성능 이점을 활용할 수 있습니다. 이전 LU 분해를 다음으로 대체할 수 있습니다.
dA = decomposition(A,'lu');
x = dA\b;
        어떤 분해를 사용할지 확실하지 않은 경우 decomposition(A) 는 백슬래시가 수행하는 것과 유사하게 A 의 속성을 기반으로 올바른 유형을 선택합니다 .
        다음의 간단한 테스트는 이 접근 방식의 가능한 성능 이점을 보여줍니다. 이 테스트는 백슬래시(\)와 분해를 각각 사용하여 선형 방정식의 동일한 희소 시스템을 100번 풉니다 .
n = 1e3;
A = sprand(n,n,0.2) + speye(n);
b = ones(n,1);
% Backslash solution
tic
for k = 1:100
x = A\b;
end
toc
경과 시간은 9.006156초입니다.
% decomposition solution
tic
dA = decomposition(A);
for k = 1:100
x = dA\b;
end
toc
경과 시간은 0.374347초입니다.
        이 문제의 경우 구문은 여전히 ​​단순하지만 분해는 백슬래시만 사용하는 것보다 훨씬 빠르게 해결됩니다 .

6 반복 방법

        계수 행렬 A가 크고 희소한 경우 일반적으로 분해 방법이 효율적이지 않습니다. 반복적인 접근 방식은 일련의 근사 솔루션을 생성합니다. MATLAB은 크고 희소한 입력 행렬을 처리하기 위한 몇 가지 반복 방법을 제공합니다.

7 멀티스레드 컴퓨팅

        MATLAB 소프트웨어는 많은 선형 대수 함수 및 요소별 수치 함수에 대한 다중 스레드 계산을 지원합니다. 이러한 함수는 여러 스레드에서 자동으로 실행됩니다. 함수 또는 표현식이 여러 CPU에서 더 빨리 실행되려면 여러 조건이 충족되어야 합니다.
1 함수가 수행하는 작업은 동시에 실행되는 여러 부분으로 쉽게 나눌 수 있습니다. 이러한 부분은 프로세스 간 통신이 거의 또는 전혀 없이 실행될 수 있어야 합니다. 시퀀스 작업이 거의 필요하지 않습니다.
2 데이터 크기는 데이터를 분할하고 개별 실행 스레드를 관리하는 데 필요한 시간보다 동시 실행의 이점을 충분히 활용할 수 있습니다. 예를 들어 대부분의 함수는 배열에 수천 개 이상의 요소가 포함된 경우에만 속도가 빨라집니다.
3 작업은 메모리에 구속되지 않으며 처리 시간은 메모리 액세스 시간에 의해 제어되지 않습니다. 일반적으로 복합 함수는 단순 함수보다 빠릅니다. inv , lscov , linsolve mldivide 는 멀티스레딩이 활성화된 경우 대규모 배정밀도 배열(약 10,000개 이상의 요소)에 대해 상당한 속도 향상을 경험할 것입니다 .

 

추천

출처blog.csdn.net/weixin_44209907/article/details/132023229