Main Content

関数 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

その後、変数 x を MATLAB ワークスペースでシンボリック ワークフロー (多項式の根の求解など) に使用できます。

f = x^2 + x - 6
f = x2+x-6
x0 = solve(f)
x0 = 

(-32)

関数 sym は異なる名前で MATLAB 変数に代入できるシンボリック変数を "参照" します。たとえば、コマンド f1 = sym('x') はシンボリック変数 x を参照し、それを MATLAB 変数 f1 に代入します。

clear
f1 = sym('x')
f1 = x

その後、変数 f1 を MATLAB ワークスペースでシンボリック ワークフロー (正弦関数のゼロの求解など) に使用できます。

f2 = sin(f1)
f2 = sin(x)
[solx,parameters,conditions] = solve(f2,f1,'ReturnConditions',true)
solx = πk
parameters = k
conditions = kZ

シンボリック数の作成

関数 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 = 

133

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 = 0<x

多数のシンボリック変数の作成

多数のシンボリック変数を同時に "作成" するには、関数 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 と、シンボリック変数 a1a2 および a3 を "作成" します。シンボリック変数 a1a2 および a3 は自動的にシンボリック配列 a に代入されます。

clear
syms a [1 3]
a
a = (a1a2a3)
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 に代入されるシンボリック変数 a1a2 および a3 を "参照" します。要素 a1a2、および a3 はワークスペースで作成されません。

clear
a = sym('a',[1 3])
a = (a1a2a3)
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 を使用して動的に変数を追加することはできません。

関連するトピック