funm
일반 행렬 함수 실행
구문
F = funm(A,fun)
F = funm(A,fun,options)
F = funm(A,fun,options,p1,p2,...)
[F,exitflag] = funm(...)
[F,exitflag,output] = funm(...)
설명
F = funm(A,fun)은 사용자 정의 함수 fun을 정사각 행렬 인수 A에서 실행합니다. F = fun(x,k)는 벡터 x와 정수 k를 받아 x와 동일한 크기의 벡터 f를 반환해야 합니다. 여기서 f(i)는 x(i)에서 함수 fun이 실행되어 도출된 k번째 도함수입니다. fun으로 표시되는 함수는 특별한 경우로 취급되는 fun = @log를 제외하고 수렴 반경이 무한대인 테일러 급수를 가져야 합니다.
또한 funm을 사용하여 다음 표에 나와 있는 특수 함수를 행렬 A에서 실행할 수도 있습니다.
함수 | 함수가 행렬 A에서 실행되는 식 구문 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
행렬 제곱근의 경우 sqrtm(A)를 대신 사용합니다. 행렬 지수의 경우 행렬 A에 따라 expm(A) 또는 funm(A, @exp) 중 어느 것이 더 정확한지 결정됩니다.
fun으로 표시되는 함수는 수렴 반경이 무한대인 테일러 급수를 가져야 합니다. @log는 예외적으로 특별한 경우로 취급됩니다. 함수를 파라미터화하기에는 필요한 경우 fun 함수에 추가 파라미터를 제공하는 방법이 설명되어 있습니다.
F = funm(A,fun,options)는 알고리즘의 파라미터를 구조체 options의 값으로 설정합니다.
다음 표에는 options의 필드가 나와 있습니다.
필드 | 설명 | 값 |
|---|---|---|
| 표시 수준 |
|
| 슈어 형식 블록에 대한 허용오차 | 양의 스칼라. 디폴트 값은 |
| 대각선 블록의 테일러 급수를 계산하기 위한 종료 허용오차 | 양의 스칼라. 디폴트 값은 |
| 테일러 급수 항의 최대 수 | 양의 정수. 디폴트 값은 |
| 로그를 계산할 때 역 스케일링과 스퀘어링(Scaling and Squaring) 메서드에 계산될 수 있는 최대 제곱근 수입니다. | 양의 정수. 디폴트 값은 |
| 슈어 형식 | 길이 |
F = funm(A,fun,options,p1,p2,...)는 추가 입력 p1,p2,...를 함수에 전달합니다.
[F,exitflag] = funm(...)은 funm의 종료 상황을 설명하는 스칼라 exitflag를 반환합니다. exitflag는 다음과 같은 값을 가질 수 있습니다.
0— 알고리즘이 성공했습니다.1— 하나 이상의 테일러 급수 계산이 수렴되지 않았거나, 로그의 경우 너무 많은 제곱근이 필요합니다. 그러나 계산된F값은 여전히 정확할 수 있습니다.
[F,exitflag,output] = funm(...)은 다음 필드를 포함하는 구조체 output을 반환합니다.
필드 | 설명 |
|---|---|
|
|
| 다시 정렬된 Schur 인자 |
|
|
| 다시 정렬된 슈어 형식 |
슈어 형식이 대각선인 경우 output = struct('terms',ones(n,1),'ind',{1:n})입니다.
예제
예제 1
다음 명령은 3×3 마방진 행렬의 사인 값을 계산합니다.
F=funm(magic(3), @sin)
F =
-0.3850 1.0191 0.0162
0.6179 0.2168 -0.1844
0.4173 -0.5856 0.8185예제 2
다음 명령문은
S = funm(X,@sin); C = funm(X,@cos);
반올림 오차 내에서 다음과 동일한 결과를 생성합니다.
E = expm(i*X); C = real(E); S = imag(E);
두 경우 모두 결과는 S*S+C*C = I를 충족시킵니다(I = eye(size(X))).
예제 3
funm에 대한 한 호출에서 함수 exp(x) + cos(x)를 A에서 계산하기 위해 다음 식을 사용합니다.
F = funm(A,@fun_expcos)
여기서 fun_expcos는 다음과 같은 함수입니다.
function f = fun_expcos(x, k)
% Return kth derivative of exp + cos at X.
g = mod(ceil(k/2),2);
if mod(k,2)
f = exp(x) + sin(x)*(-1)^g;
else
f = exp(x) + cos(x)*(-1)^g;
end 알고리즘
funm에 사용되는 알고리즘은 [1]에 설명되어 있습니다.
참고 문헌
[1] Davies, P. I. and N. J. Higham, “A Schur-Parlett algorithm for computing matrix functions,” SIAM J. Matrix Anal. Appl., Vol. 25, Number 2, pp. 464-485, 2003.
[2] Golub, G. H. and C. F. Van Loan, Matrix Computation, Third Edition, Johns Hopkins University Press, 1996, p. 384.
[3] Moler, C. B. and C. F. Van Loan, “Nineteen Dubious Ways to Compute the Exponential of a Matrix, Twenty-Five Years Later” SIAM Review 20, Vol. 45, Number 1, pp. 1-47, 2003.
확장 기능
버전 내역
R2006a 이전에 개발됨