関数 syms
または sym
の選択
Symbolic Math Toolbox™ では、syms
またはsym
のいずれかを使用してシンボリック オブジェクトを作成できます。これらの 2 つの関数は概念的に異なります。
関数
syms
は同じ名前で MATLAB® 変数に自動的に代入されるシンボリック オブジェクトを "作成" します。関数
sym
は同じ名前または異なる名前で MATLAB 変数に代入できるシンボリック オブジェクトを "参照" します。
次の例では、関数 syms
と関数 sym
の違いについて説明します。各関数のユースケースの他の例については、syms
またはsym
を参照してください。
シンボリック変数の MATLAB 変数への代入
関数 syms
は変数を動的に "作成" します。たとえば、コマンド syms x
はシンボリック変数 x
を作成し、それを自動的に同じ名前で MATLAB 変数に代入します。
syms x
x
x =
その後、変数 x
を MATLAB ワークスペースでシンボリック ワークフロー (多項式の根の求解など) に使用できます。
f = x^2 + x - 6
f =
x0 = solve(f)
x0 =
関数 sym
は異なる名前で MATLAB 変数に代入できるシンボリック変数を "参照" します。たとえば、コマンド f1 = sym('x')
はシンボリック変数 x
を参照し、それを MATLAB 変数 f1
に代入します。
clear
f1 = sym('x')
f1 =
その後、変数 f1
を MATLAB ワークスペースでシンボリック ワークフロー (正弦関数のゼロの求解など) に使用できます。
f2 = sin(f1)
f2 =
[solx,parameters,conditions] = solve(f2,f1,'ReturnConditions',true)
solx =
parameters =
conditions =
シンボリック数の作成
関数 syms
を使用してシンボリック変数 x
を "作成" し、それを自動的に MATLAB 変数 x
に代入します。数値を MATLAB 変数 x
に代入すると、その数値は倍精度で表されます。シンボリック変数への前回の代入は、今回の代入で上書きされます。x
のクラスは double
になります。
syms x
x = 1/33
x = 0.0303
class(x)
ans = 'double'
関数 sym
を使用して、浮動小数点を近似せずに正確なシンボリック数を "参照" します。その後、この数値を MATLAB 変数 x
に代入できます。x
のクラスは sym
です。
x = sym('1/33')
x =
class(x)
ans = 'sym'
仮定によるシンボリック変数の作成
仮定を使用してシンボリック変数を作成すると、MATLAB はシンボリック変数とその仮定を別々に格納します。
関数 syms
を使用して MATLAB 変数に同じ名前で代入されるシンボリック変数を "作成" します。仮定なしで新しいシンボリック変数を取得します。syms
を使用して変数を宣言する場合、既存の仮定が消去されます。
syms x positive syms x assumptions
ans = Empty sym: 1-by-0
sym
を使用して既存のシンボリック変数を "参照" します。このシンボリック変数が MATLAB セッションで前に使用された場合、sym
はシンボリック変数とその現在の仮定を参照します。前に使用されなかった場合、sym
は仮定なしでシンボリック変数を作成します。
syms x positive x = sym('x'); assumptions
ans =
多数のシンボリック変数の作成
多数のシンボリック変数を同時に "作成" するには、関数 syms
を使用する方が便利です。1 行のコードで複数の変数を作成できます。
syms a b c
sym
を使用する場合、MATLAB 変数を 1 つずつ宣言し、対応するシンボリック変数をそれらに "参照" させなければなりません。
a = sym('a'); b = sym('b'); c = sym('c');
シンボリック変数の配列の作成
シンボリック変数をその要素として含むシンボリック配列を宣言する場合、syms
または sym
のいずれかを使用できます。
コマンド syms a [1 3]
は、ワークスペースで 1 行 3 列のシンボリック配列 a
と、シンボリック変数 a1
、a2
および a3
を "作成" します。シンボリック変数 a1
、a2
および a3
は自動的にシンボリック配列 a
に代入されます。
clear syms a [1 3] a
a =
whos
Name Size Bytes Class Attributes a 1x3 8 sym a1 1x1 8 sym a2 1x1 8 sym a3 1x1 8 sym
コマンド a = sym('a',[1 3])
は、ワークスペースでシンボリック配列 a
に代入されるシンボリック変数 a1
、a2
および a3
を "参照" します。要素 a1
、a2
、および a3
はワークスペースで作成されません。
clear
a = sym('a',[1 3])
a =
whos
Name Size Bytes Class Attributes a 1x3 8 sym
並列 for ループ内のシンボリック変数の作成
並列計算用に各ワーカー内でシンボリック変数を作成するには、sym
を使用します。たとえば、symsum
を使用し、級数の和を求める parfor
ループ内でシンボリック変数 k
を作成できます。
S = zeros(1,10); parfor i = 1:10 k = sym('k'); S(i) = symsum(1/k^i,k,1,Inf); end
Starting parallel pool (parpool) using the 'Processes' profile ... Connected to the parallel pool (number of workers: 6).
ワークスペースのグローバルな状態が変更されるため、syms
を使用して parfor
ループ内でシンボリック変数を作成することはできません。
関数内でのシンボリック変数の作成
関数内でシンボリック変数を宣言するには、sym
を使用します。たとえば、親関数ワークスペースで MATLAB 変数 x
を明示的に定義し、x
に同じ名前のシンボリック変数を参照させることができます。
function primaryFx x = sym('x') function nestedFx ... end end
関数ではワークスペースが静的になるため、syms
を使用して動的に変数を追加することはできません。