lsqr
에 계수 행렬 A
대신 A*x
와 A'*x
를 계산하는 함수 핸들을 제공하여 선형 시스템을 풉니다.
비대칭 삼중대각 행렬 행렬을 만듭니다. 행렬을 미리 봅니다.
A = 21×21
10 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 9 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 8 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 7 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 6 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 5 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 3 2 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 2 0 0 0 0 0 0 0 0 0 0
⋮
이 삼중대각 행렬은 특수한 구조를 갖고 있으므로 연산 A*x
를 함수 핸들로 나타낼 수 있습니다. A
에 벡터를 곱할 때 결과 벡터의 대부분의 요소는 0입니다. 결과에 있는 0이 아닌 요소는 A
의 0이 아닌 삼중대각선 요소에 해당합니다.
표현식 는 다음과 같이 표현됩니다.
.
결과 벡터는 다음과 같이 세 벡터의 합으로 작성할 수 있습니다.
=.
마찬가지로, 표현식 는 다음과 같이 표현됩니다.
.
.
MATLAB®에서 이러한 벡터를 만들어서 더하여 플래그 입력값에 따라 A*x
또는 A'*x
의 값을 제공하는 함수를 작성합니다.
function y = afun(x,flag)
if strcmp(flag,'notransp') % Compute A*x
y = [0; x(1:20)] ...
+ [(10:-1:0)'; (1:10)'].*x ...
+ 2*[x(2:end); 0];
elseif strcmp(flag,'transp') % Compute A'*x
y = 2*[0; x(1:20)] ...
+ [(10:-1:0)'; (1:10)'].*x ...
+ [x(2:end); 0];
end
end
(이 함수는 예제 끝에 로컬 함수로 저장되어 있습니다.)
이번에는 lsqr
에 A*x
와 A'*x
를 계산하는 함수 핸들을 제공하여 선형 시스템 를 풉니다. 허용오차 1e-6
및 25회 반복을 사용합니다. 의 참(True) 해가 1로 구성된 벡터가 되도록 를 의 행 합으로 지정합니다.
lsqr converged at iteration 21 to a solution with relative residual 5.4e-13.
x1 = 21×1
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
⋮