Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

シンボリック行列変数の作成

R2021a 以降

シンボリック行列変数は、行列、ベクトル、およびスカラーをコンパクトな行列表記で表現します。数式が行列およびベクトルを含む場合、シンボリック行列変数を使用してそれらを記述すると、成分ごとに記述するより簡潔で明確になります。これを行う場合、教科書からベクトルに基づく式および方程式を選択して Symbolic Math Toolbox™ に入力し、それらに対して数学演算を実行して別の方程式を派生させることができます。

シンボリック行列変数を含む導出された方程式は、教科書で示されるように、整形されて表示されます。たとえば、syms を使用して 3 つのシンボリック行列変数 Ax、および y を作成します。ベクトル x について、式 yTAx の微分を求めます。

syms A [3 4] matrix
syms x [4 1] matrix
syms y [3 1] matrix
eq = y.'*A*x
eq = yTAxtranspose(symmatrix('y', [3 1]))*symmatrix('A', [3 4])*symmatrix('x', [4 1])
D = diff(eq,x)
D = yTAtranspose(symmatrix('y', [3 1]))*symmatrix('A', [3 4])

シンボリック スカラー変数の行列とシンボリック行列変数の比較

シンボリック行列変数は、シンボリック スカラー変数の代替です。この 2 つのオプションは型が異なり、異なる方法で表示されます。

たとえば、syms を使用し、3 行 4 列のシンボリック スカラー変数の行列を 2 つ作成します。シンボリック スカラー変数の行列は、簡潔に "シンボリック行列" と呼ばれることもあります。これらの行列は、その成分をリストして表示されます。

syms A B [2 3]
A
A = 

(A1,1A1,2A1,3A2,1A2,2A2,3)[A1_1, A1_2, A1_3; A2_1, A2_2, A2_3]

B
B = 

(B1,1B1,2B1,3B2,1B2,2B2,3)[B1_1, B1_2, B1_3; B2_1, B2_2, B2_3]

シンボリック スカラー変数の行列は sym 型です。

class(A)
ans = 
'sym'

シンボリック数学演算をこれらの行列に適用すると、行列成分で表現される複雑な解になりかねません。たとえば、行列 A と行列 B' を乗算します。

C = A*B'
C = 

(A1,1B1,1+A1,2B1,2+A1,3B1,3A1,1B2,1+A1,2B2,2+A1,3B2,3A2,1B1,1+A2,2B1,2+A2,3B1,3A2,1B2,1+A2,2B2,2+A2,3B2,3)[A1_1*conj(B1_1) + A1_2*conj(B1_2) + A1_3*conj(B1_3), A1_1*conj(B2_1) + A1_2*conj(B2_2) + A1_3*conj(B2_3); A2_1*conj(B1_1) + A2_2*conj(B1_2) + A2_3*conj(B1_3), A2_1*conj(B2_1) + A2_2*conj(B2_2) + A2_3*conj(B2_3)]

同じサイズのシンボリック行列変数を作成するには、syms コマンドを使用し、その後に変数名、変数のサイズ、および matrix キーワードを入力します。シンボリック行列変数は、シンボリック スカラー変数と区別するために太字で表示されます。

syms A B [2 3] matrix
A
A = Asymmatrix('A', [2 3])
B
B = Bsymmatrix('B', [2 3])

シンボリック行列変数は symmatrix 型です。

class(A)
ans = 
'symmatrix'

シンボリック数学演算をシンボリック行列変数に適用すると、表示が簡潔になります。たとえば、AB' を乗算します。

C = A*B'
C = ABTsymmatrix('A', [2 3])*transpose(conj(symmatrix('B', [2 3])))

シンボリック行列変数を使った数学演算

シンボリック行列変数は、非可換なオブジェクトとして認識されます。これらは一般的な数学演算をサポートしており、このような演算を使用してシンボリック行列変数の式を作成できます。

syms A B [2 2] matrix
A*B - B*A
ans = AB-BAsymmatrix('A', [2 2])*symmatrix('B', [2 2]) - symmatrix('B', [2 2])*symmatrix('A', [2 2])

たとえば、2 つのシンボリック行列変数の乗算について、交換関係をチェックします。

isequal(A*B,B*A)
ans = logical
   0

加算について、交換関係をチェックします。

isequal(A+B,B+A)
ans = logical
   1

演算に symmatrix 型の引数が含まれる場合、結果は自動的に symmatrix 型に変換されます。たとえば、シンボリック行列変数で表現される行列 A と、シンボリック スカラー変数で表現されるスカラー c を乗算します。結果は symmatrix 型になります。

syms A [2 2] matrix
syms c
class(A)
ans = 
'symmatrix'
class(c)
ans = 
'sym'
M = c*A
M = cAsymmatrix('c', [1 1])*symmatrix('A', [2 2])
class(M)
ans = 
'symmatrix'

シンボリック行列変数で表現される 3 つの行列を乗算します。結果 X は symmatrix オブジェクトになります。

syms V [2 1] matrix
X = V.'*A*V
X = VTAVtranspose(symmatrix('V', [2 1]))*symmatrix('A', [2 2])*symmatrix('V', [2 1])
class(X)
ans = 
'symmatrix'

symmatrix オブジェクトを引数として数学関数に渡すことができます。たとえば、V について X の微分を求めることで、数学演算を X に対して実行します。

diff(X,V)
ans = VTAT+VTAtranspose(symmatrix('V', [2 1]))*transpose(symmatrix('A', [2 2])) + transpose(symmatrix('V', [2 1]))*symmatrix('A', [2 2])

シンボリック スカラー変数の配列からのシンボリック行列変数の作成

関数 symmatrix を使用し、シンボリック スカラー変数の配列を単一のシンボリック行列変数に変換できます。この方法で変換されたシンボリック行列変数は、要素ごとに表示されます。

syms A [3 4]
class(A)
ans = 
'sym'
B = symmatrix(A)
B = 

(A1,1A1,2A1,3A1,4A2,1A2,2A2,3A2,4A3,1A3,2A3,3A3,4)[A1_1, A1_2, A1_3, A1_4; A2_1, A2_2, A2_3, A2_4; A3_1, A3_2, A3_3, A3_4]

class(B)
ans = 
'symmatrix'

シンボリック行列変数のシンボリック スカラー変数の配列への変換

シンボリック行列変数を作成し、方程式を派生させてから、関数 symmatrix2sym を使用して、その結果をシンボリック スカラー変数の配列に変換できます。

たとえば、2 つのシンボリック行列変数 A および B の行列積を求めます。結果 Xsymmatrix 型になります。

syms A B [2 2] matrix
X = A*B
X = ABsymmatrix('A', [2 2])*symmatrix('B', [2 2])
class(X)
ans = 
'symmatrix'

シンボリック行列変数 X をシンボリック スカラー変数の配列に変換します。変換された行列 Ysym 型になります。

Y = symmatrix2sym(X)
Y = 

(A1,1B1,1+A1,2B2,1A1,1B1,2+A1,2B2,2A2,1B1,1+A2,2B2,1A2,1B1,2+A2,2B2,2)[A1_1*B1_1 + A1_2*B2_1, A1_1*B1_2 + A1_2*B2_2; A2_1*B1_1 + A2_2*B2_1, A2_1*B1_2 + A2_2*B2_2]

class(Y)
ans = 
'sym'

シンボリック行列変数を変換することで得られた積が、シンボリック スカラー変数の 2 つの配列の積と等しいことをチェックします。

syms A B [2 2]
isequal(Y,A*B)
ans = logical
   1

シンボリック行列変数へのインデックス付け

シンボリック行列変数にインデックスを付けると、対応する行列要素が別のシンボリック行列変数の形式で返されます。

syms A [2 3] matrix
a = A(2,3)
a = A2,3symmatrix('A2_3', [1 1])
class(a)
ans = 
'symmatrix'

または、シンボリック行列変数 A をシンボリック スカラー変数の行列に変換します。次に、その行列にインデックスを付けます。

Asym = symmatrix2sym(A)
Asym = 

(A1,1A1,2A1,3A2,1A2,2A2,3)[A1_1, A1_2, A1_3; A2_1, A2_2, A2_3]

asym = Asym(2,3)
asym = A2,3A2_3
class(asym)
ans = 
'sym'

両方の結果が等しいことに注意してください。

isequal(a,symmatrix(asym))
ans = logical
   1

シンボリック行列変数を含む演算の表示

eyezeros、および ones によって返されるような行列は、多くの場合、シンボリック ワークフローにおいて特定の表記がなされ、特別な意味をもちます。これらの行列をシンボリック行列変数として宣言すると、その行列は行列の次元と共に太字で表示されます。

symmatrix(eye(3))
ans = I3symmatrix(eye(3))
symmatrix(zeros(2,3))
ans = 02,3symmatrix(zero(2, 3))
symmatrix(ones(3,5))
ans = 13,5symmatrix(ones(3, 5))

MATLAB® における成分ごとの演算への入力がシンボリック行列変数である場合、出力もそうなります。これらの演算は、教科書の規則に従う特別な表記で表示されます。

syms A B [3 3] matrix
A.*B
ans = ABsymmatrix('A', [3 3]) .* symmatrix('B', [3 3])
A./B
ans = ABsymmatrix('A', [3 3]) ./ symmatrix('B', [3 3])
A.\B
ans = BAsymmatrix('B', [3 3]) ./ symmatrix('A', [3 3])
A.*hilb(3)
ans = 

A(11213121314131415)symmatrix('A', [3 3]) .* [sym(1), sym(1/2), sym(1/3); sym(1/2), sym(1/3), sym(1/4); sym(1/3), sym(1/4), sym(1/5)]

A.^(2*ones(3))
ans = A213,3symmatrix('A', [3 3]) .^ 2*symmatrix(ones(3, 3))
A.^B
ans = ABsymmatrix('A', [3 3]) .^ symmatrix('B', [3 3])
kron(A,B)
ans = ABkron(symmatrix('A', [3 3]), symmatrix('B', [3 3]))
adjoint(A)
ans = adj(A)adj(symmatrix('A', [3 3]))
trace(A)
ans = Tr(A)Tr(symmatrix('A', [3 3]))

参考

| |

関連するトピック