Main Content

funm

説明

F = funm(A,f) は、関数 f (A) を正方行列 A に対して計算します。詳細は、行列関数を参照してください。

行列の 3 乗根

A が 3 行 3 列の単位行列の場合に、B3 = A の行列 B を求めます。

B3 = A を求解するには、関数 funm を使用して行列 A の 3 乗根を計算します。シンボリック関数 f(x) = x^(1/3) を作成し、funm の 2 番目の引数として使用します。単位行列の 3 乗根は単位行列そのものです。

A = sym(eye(3))

syms f(x)
f(x) = x^(1/3);

B = funm(A,f)
A =
[ 1, 0, 0]
[ 0, 1, 0]
[ 0, 0, 1]
 
B =
[ 1, 0, 0]
[ 0, 1, 0]
[ 0, 0, 1]

行列 A0 要素の 1 つを 1 に置き換え、再び行列の 3 乗根を計算します。

A(1,2) = 1
B = funm(A,f)
A =
[ 1, 1, 0]
[ 0, 1, 0]
[ 0, 0, 1]

B =
[ 1, 1/3, 0]
[ 0,   1, 0]
[ 0,   0, 1]

上三角行列の 3 乗根を計算します。

A(1:2,2:3) = 1
B = funm(A,f)
A =
[ 1, 1, 1]
[ 0, 1, 1]
[ 0, 0, 1]

B =
[ 1, 1/3, 2/9]
[ 0,   1, 1/3]
[ 0,   0,   1]

B3 = A であることを検証します。

B^3
ans =
[ 1, 1, 1]
[ 0, 1, 1]
[ 0, 0, 1]

行列のランベルトの W 関数

行列のランベルトの W 関数を求めます。

まず、精度が 5 桁の可変精度の演算を使用して 3 行 3 列の行列 A を作成します。この例では、正確なシンボリック数の代わりに可変精度の演算を使用することにより、計算を高速化しメモリの使用量を減らしています。5 桁のみを使用することで、結果を画面に収まるサイズにできます。

savedefault = digits(5);
A = vpa(magic(3))
A =
[ 8.0, 1.0, 6.0]
[ 3.0, 5.0, 7.0]
[ 4.0, 9.0, 2.0]

シンボリック関数 f(x) = lambertw(x) を作成します。

syms f(x)
f(x) = lambertw(x);

ランベルトの W 関数 (W0 分枝) を行列的に求めるには、f(x) を 2 番目の引数として使用して funm を呼び出します。

W0 = funm(A,f)
W0 =
[  1.5335 + 0.053465i, 0.11432 + 0.47579i, 0.36208 - 0.52925i]
[ 0.21343 + 0.073771i,  1.3849 + 0.65649i, 0.41164 - 0.73026i]
[  0.26298 - 0.12724i,  0.51074 - 1.1323i,   1.2362 + 1.2595i]

この結果が指定された精度における行列方程式 A = W0·eW0 の解であることを検証します。

W0*expm(W0)
ans =
[               8.0, 1.0 - 5.6843e-13i, 6.0 + 1.1369e-13i]
[ 3.0 - 2.2737e-13i, 5.0 - 2.8422e-14i, 7.0 - 4.1211e-13i]
[ 4.0 - 2.2737e-13i, 9.0 - 9.9476e-14i, 2.0 + 1.4779e-12i]

次に、ランベルトの W 関数の分枝 W-1 を表すシンボリック関数 f(x) を作成します。

f(x) = lambertw(-1,x);

行列 AW-1 分枝を求めます。

Wm1 = funm(A,f)
Wm1 =
[   0.40925 - 4.7154i, 0.54204 + 0.5947i, 0.13764 - 0.80906i]
[ 0.38028 + 0.033194i, 0.65189 - 3.8732i, 0.056763 - 1.0898i]
[   0.2994 - 0.24756i, - 0.105 - 1.6513i,  0.89453 - 3.0309i]

この結果が指定された精度における行列方程式 A = Wm1·eWm1 の解であることを検証します。

Wm1*expm(Wm1)
ans =
[ 8.0 - 8.3844e-13i,  1.0 - 3.979e-13i, 6.0 - 9.0949e-13i]
[ 3.0 - 9.6634e-13i,  5.0 + 1.684e-12i, 7.0 + 4.5475e-13i]
[ 4.0 - 1.3642e-12i, 9.0 + 1.6698e-12i, 2.0 + 1.7053e-13i]

行列指数、行列対数および行列の平方根

行列指数、行列対数および行列の平方根は、funm を適切な第 2 引数と共に使用することで求められます。しかし、関数 expmlogm および sqrtm を使用することでこのタスクをより効率的に行うことができます。

次の正方行列を作成し、その指数、対数および平方根を求めます。

syms x
A = [1 -1; 0 x]
expA = expm(A)
logA = logm(A)
sqrtA = sqrtm(A)
A =
[ 1, -1]
[ 0,  x]
 
expA =
[ exp(1), (exp(1) - exp(x))/(x - 1)]
[      0,                    exp(x)]
 
logA =
[ 0, -log(x)/(x - 1)]
[ 0,          log(x)]
 
sqrtA =
[ 1, 1/(x - 1) - x^(1/2)/(x - 1)]
[ 0,                     x^(1/2)]

funm を使用して A の行列指数、行列対数、行列の平方根を求めます。シンボリック式 exp(x)log(x) および sqrt(x)funm の第 2 引数として使用します。結果は同一になります。

expA = funm(A,exp(x))
logA = funm(A,log(x))
sqrtA = funm(A,sqrt(x))
expA =
[ exp(1), exp(1)/(x - 1) - exp(x)/(x - 1)]
[      0,                          exp(x)]
 
logA =
[ 0, -log(x)/(x - 1)]
[ 0,          log(x)]
 
sqrtA =
[ 1, 1/(x - 1) - x^(1/2)/(x - 1)]
[ 0,                     x^(1/2)]

入力引数

すべて折りたたむ

入力行列。シンボリックまたは数値の正方行列として指定します。

関数。シンボリック関数または式として指定します。

出力引数

すべて折りたたむ

結果の関数。シンボリック行列として返されます。

詳細

すべて折りたたむ

行列関数

行列関数は 1 つの行列を別の行列に写像するスカラー関数です。

f(x) がテイラー級数展開であるとします。ここで、x はスカラーです。また、行列関数 f(A) (ここで、A は行列) は、行列的な加算および乗算を伴う f(A) のテイラー級数によって定義されます。

AA = P·D·P-1 として表すことができ、D が対角行列で次のようになる場合、

D=(d100dn)

行列関数 f(A) は次のように計算されます。

f(A)=P(f(d1)00f(dn))P1

対角化できない行列は A = P·J·P-1 として表すことができます。ここで、J は行列 A のジョルダン形式です。行列関数 f(A) は、各ジョルダン ブロックに対して次の定義を使用して計算できます。

f((λ10000100λ))=(f(λ)0!f(λ)1!f(λ)2!f(n1)(λ)(n1)!0f(λ)2!f(λ)1!00f(λ)0!)

ヒント

  • MATLAB® 関数 funm との互換性をもたせるため、funm は次の引数を受け入れます。

    • 第 2 入力引数として、@exp@sin などの関数ハンドル。

    • funm(A,f,options) などの options 入力引数。

    • funm(A,f,options,p1,p2,...) などの関数 f の追加の入力引数。

    • [F,exitflag] = funm(A,f) などの exitflag 出力引数。ここで、funm の関数呼び出しでエラーが発生 (たとえば、ゼロ除算が発生) した場合のみ、exitflag1 になります。それ以外の場合、exitflag0 になります。

    受け入れ可能な関数ハンドルの詳細および一覧は、MATLAB 関数funm を参照してください。

  • 入力行列 A が数値 (シンボリック オブジェクトではない) で、第 2 引数 f が関数ハンドルの場合、funm の呼び出しは MATLAB 関数 funm を起動します。

バージョン履歴

R2014b で導入

参考

| | | |