Main Content

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

subs

説明

snew = subs(s,old,new) は、現れるすべての oldnew に置き換え、次に s を評価して s のコピーを返します。ここで、s はシンボリック スカラー変数またはシンボリック関数の式であり、old には代入の対象となるシンボリック スカラー変数またはシンボリック関数を指定します。

  • old および new がいずれも同じサイズのベクトルまたは cell 配列の場合、subsold の各要素を new の対応する要素で置き換えます。

  • old がスカラーであり、new がベクトルまたは行列である場合、subs(s,old,new) はすべての演算を要素単位で実行して、s における old のインスタンスをすべて new に置き換えます。s のすべての定数項は、すべて 1 のベクトルまたは行列にその定数をかけた項に置き換えられます。

snew = subs(s,new) は、s に現れる既定のシンボリック スカラー変数をすべて new に置き換え、次に s を評価して s のコピーを返します。既定の変数は symvar(s,1) で定義されます。

snew = subs(s) は、s のコピーを返し、s 内のシンボリック スカラー変数を MATLAB® ワークスペースで割り当てられた値に置き換えてから、s を評価します。値が代入されていない変数は、変数のままになります。

sMnew = subs(sM,oldM,newM) は、現れるすべての oldMnewM に置き換え、次に sM を評価して sM のコピーを返します。ここで、sM はシンボリック行列変数およびシンボリック行列関数を含む式、方程式、または条件であり、oldM には代入の対象となるシンボリック行列変数およびシンボリック行列関数を指定します。置換値 newM は、oldM と同じサイズでなければなりません。("R2021b 以降")

sMnew = subs(sM,newM) は、sM に現れる既定のシンボリック行列変数をすべて newM に置き換え、次に sM を評価して sM のコピーを返します。("R2021b 以降")

すべて折りたたむ

この式で a4 に置き換えます。

syms a b
subs(a + b,a,4)
ans = b+4

この式で a*b5 に置き換えます。

subs(a*b^2,a*b,5)
ans = 5b

次の式の既定のシンボリック スカラー変数を a に置き換えます。置き換えるスカラー変数または式を指定しない場合、subs は、symvar を使用して既定の変数を求めます。x + y では、既定の変数は x です。

syms x y a
symvar(x + y,1)
ans = x

したがって、subsxa に置き換えます。

subs(x + y,a)
ans = a+y

シンボリック スカラー変数に新しい値が代入されても、それらの値を含む式の値は自動的に求められません。代わりに、subs を使用して式の値を求めます。

y = x^2 を定義します。

syms x
y = x^2;

2x に代入します。y 値は 4 ではなく x^2 のままです。

x = 2;
y
y = x2

subs を使用して、x の新しい値で y を評価します。

subs(y)
ans = 4

古い値と新しい値をベクトルとして指定し、複数の置換を行います。

syms a b
subs(cos(a) + sin(b), [a,b], [sym('alpha'),2])
ans = sin(2)+cos(α)

あるいは、複数の代入には cell 配列を使用します。

subs(cos(a) + sin(b), {a,b}, {sym('alpha'),2})
ans = sin(2)+cos(α)

次の式のシンボリック スカラー変数 a を 3 行 3 列の魔方陣行列に置き換えます。定数 1 により、3 行 3 列の行列のすべての要素が 1 に拡張されることに注意してください。

syms a t
subs(exp(a*t) + 1, a, -magic(3))
ans = 

(e-8t+1e-t+1e-6t+1e-3t+1e-5t+1e-7t+1e-4t+1e-9t+1e-2t+1)

ベクトル、行列または非スカラー値の配列の要素を置き換えることもできます。たとえば、これらの 2 行 2 列の行列を作成します。

A = sym('A',[2,2])
A = 

(A1,1A1,2A2,1A2,2)

B = sym('B',[2,2])
B = 

(B1,1B1,2B2,1B2,2)

行列 A の最初の要素を行列 B と置き換えます。この置き換えを行う際に、subs は 2 行 2 列の行列 A を 4 行 4 列の行列に拡張します。

A44 = subs(A, A(1,1), B)
A44 = 

(B1,1B1,2A1,2A1,2B2,1B2,2A1,2A1,2A2,1A2,1A2,2A2,2A2,1A2,1A2,2A2,2)

subs では、非スカラーまたは行列を、行列のサイズを縮小するスカラーに置き換えることはできません。

フィールド値としてシンボリック式を使用して構造体配列を作成します。

syms x y z
S = struct('f1',x*y,'f2',y + z,'f3',y^2)
S = struct with fields:
    f1: x*y
    f2: y + z
    f3: y^2

シンボリック スカラー変数 xy、および z を数値に置き換えます。

Sval = subs(S,[x y z],[0.5 1 1.5])
Sval = struct with fields:
    f1: 1/2
    f2: 5/2
    f3: 1

シンボリック スカラー変数 x および y を 2 行 2 列の行列に置き換えます。ベクトルや行列の関与する複数の置換を行う場合は、cell 配列を使用して古い値と新しい値を指定します。

syms x y
subs(x*y, {x,y}, {[0 1; -1 0], [1 -1; -2 1]})
ans = 

(0-120)

xy はスカラーであるため、これらの代入は要素単位で行われます。

[0 1; -1 0].*[1 -1; -2 1]
ans = 2×2

     0    -1
     2     0

もう 1 つの方程式の変数の値を使用して、方程式からスカラー変数を消去します。2 番目の方程式において、isolate を使用して変数を左辺に分離し、それから右辺を 1 番目の方程式の変数で置き換えます。

はじめに、方程式 eqn1 および eqn2 を宣言します。

syms x y
eqn1 = sin(x)+y == x^2 + y^2;
eqn2 = y*x == cos(x);

isolate を使用して eqn2y を分離します。

eqn2 = isolate(eqn2,y)
eqn2 = 

y=cos(x)x

eqn2 の右辺を eqn1eqn2 の左辺で置き換えることで、eqn1 から y を消去します。

eqn1 = subs(eqn1,lhs(eqn2),rhs(eqn2))
eqn1 = 

sin(x)+cos(x)x=cos(x)2x2+x2

このシンボリック関数の xa に置き換えます。

syms x y a
syms f(x,y)
f(x,y) = x + y;
f = subs(f,x,a)
f(x, y) = a+y

subs はシンボリック関数式の値を置き換えますが、関数の入力引数は置き換えません。

formula(f)
ans = a+y
argnames(f)
ans = (xy)

シンボリック関数の引数は明示的に置き換えます。

syms x y
f(x,y) = x + y;
f(a,y) = subs(f,x,a);
f
f(a, y) = a+y

次の方程式系の解を確認するとします。

syms x y
eqs = [x^2 + y^2 == 1, x == y];
S = solve(eqs,[x y]);
S.x
ans = 

(-2222)

S.y
ans = 

(-2222)

解を元の方程式系に代入して解を検証します。

isAlways(subs(eqs,S))
ans = 2x2 logical array

   1   1
   1   1

R2021b 以降

2 つの 2 行 2 列の行列の積を定義します。行列を symmatrix データ型のシンボリック行列変数として宣言します。

syms X Y [2 2] matrix
sM = X*Y
sM = XY

行列変数 XY を 2 行 2 列のシンボリック行列に置き換えます。ベクトルまたは行列を含む複数の置換を行う場合は、cell 配列を使用して代入の対象となる行列変数とその新しい値を指定します。新しい値は、代入の対象となる行列変数と同じサイズでなければなりません。

S = subs(sM,{X,Y},{[0 sqrt(sym(2)); sqrt(sym(2)) 0], [1 -1; -2 1]})
S = 

Σ1where  Σ1=(-2222-2)

Ssym データ型に変換して、置換された行列の乗算結果を表示します。

Ssym = symmatrix2sym(S)
Ssym = 

(-2222-2)

R2021b 以降

シンボリック数の行列を作成します。

A = sym([1 4 2; 4 1 2; 2 2 3])
A = 

(142412223)

関数 charpoly を使用して、A の特性多項式の係数を計算します。

c = charpoly(A)
c = (1-5-1721)

次に、X を 3 行 3 列のシンボリック行列変数として定義します。係数 c を使用して、多項式 p(X)=c1X3+c2X2+c3X+c4I3 を作成します。ここで X は、3 行 3 列の行列を表す不定元です。

syms X [3 3] matrix
p = c(1)*X^3 + c(2)*X^2 + c(3)*X + c(4)*X^0
p = 21I3-17X-5X2+X3

関数 subs を使用して、多項式 p(X)XA で置換します。ケーリー・ハミルトンの定理によれば、係数 cA の特性多項式であるため、この代入結果は 3 行 3 列のゼロ行列となります。symmatrix2sym を使用して、置換された式をシンボリック数の行列に変換します。

Y = subs(p,A)
Y = 

-17Σ1-5Σ12+Σ13+21I3where  Σ1=(142412223)

Z = symmatrix2sym(Y)
Z = 

(000000000)

R2022a 以降

関数 f(A)=A2-2A+I2 を定義します。ここで、A は 2 行 2 列の行列であり、I2 は 2 行 2 列の単位行列です。変数 A に別の式を代入して、新しい関数を評価します。

2 行 2 列のシンボリック行列変数 A を作成します。A の既存の定義をワークスペースに保持したまま、シンボリック行列関数 f(A) を作成します。f(A) の多項式を割り当てます。

syms A 2 matrix
syms f(A) 2 matrix keepargs
f(A) = A*A - 2*A + eye(2)
f(A) = I2-2A+A2

次に、新しいシンボリック行列変数 BC を作成します。BC の既存の定義をワークスペースに保持したまま、新しいシンボリック行列関数 g(B,C) を作成します。

syms B C 2 matrix
syms g(B,C) 2 matrix keepargs

f(A) 内の変数 AB+C を代入します。代入結果を新しい関数 g(B,C) に割り当てます。

g(B,C) = subs(f,A,B+C)
g(B, C) = B+C2+I2-2B-2C

subs を使用して、行列値 B=[01-10]C=[1-1-21] に対する g(B,C) を評価します。

S = subs(g(B,C),{B,C},{[0 1; -1 0],[1 -1; -2 1]})
S = 

-2Σ1-2Σ2+Σ1+Σ22+I2where  Σ1=(01-10)  Σ2=(1-1-21)

Ssymmatrix データ型から sym データ型に変換して、多項式の代入結果を表示します。

Ssym = symmatrix2sym(S)
Ssym = 

(0000)

R2022b 以降

方程式 XT X f(X,A)=2 A を定義します。ここで、A は 3 行 3 列の行列、X は 3 行 1 列の行列です。f(X,A) に、別のシンボリック式、およびシンボリック値をもつ A を代入します。この方程式がこれらの値について真となるかどうかをチェックします。

2 つのシンボリック行列変数 A および X を作成します。AX の既存の定義をワークスペースに保持したまま、シンボリック行列関数 f(X,A) を作成します。方程式を作成します。

syms A [3 3] matrix
syms X [3 1] matrix
syms f(X,A) [1 1] matrix keepargs
eq = diff(diff(f,X),X.') == 2*A
eq(X, A) = 

XT X f(X,A)=2A

f(X,A)XTAX を代入し、この式の方程式に含まれる 2 次微分関数を評価します。

eq = subs(eq,f,X.'*A*X)
eq(X, A) = AT+A=2A

A に次数 3 のヒルベルト行列を代入します。

eq = subs(eq,A,hilb(3))
eq(X, A) = 

Σ1+Σ1T=2Σ1where  Σ1=(11213121314131415)

isAlways を使用して、この方程式がこれらの値について真となるかどうかをチェックします。isAlwayssymfun 型または sym 型のシンボリック入力のみを受け入れるため、isAlways を使用する前に eqsymfunmatrix 型から symfun 型に変換します。

tf = isAlways(symfunmatrix2symfun(eq))
tf = 3x3 logical array

   1   1   1
   1   1   1
   1   1   1

入力引数

すべて折りたたむ

シンボリック入力。シンボリック スカラー変数、シンボリック式、シンボリック方程式、シンボリック関数、シンボリック配列、シンボリック行列、または構造体として指定します。

データ型: sym | symfun | struct

代入の対象となるスカラー変数。シンボリック スカラー変数、シンボリック関数、シンボリック式、シンボリック配列、または cell 配列として指定します。

データ型: sym | symfun | cell

代入する新しい値。数値、シンボリック数、シンボリック スカラー変数、シンボリック関数、シンボリック式、シンボリック配列、構造体、または cell 配列として指定します。

データ型: sym | symfun | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | struct | cell

シンボリック入力。シンボリック行列変数、シンボリック行列関数、シンボリック式、シンボリック方程式、またはシンボリック条件として指定します。

データ型: symmatrix | symfunmatrix

代入の対象となる行列変数または行列関数。シンボリック行列変数、シンボリック行列関数、シンボリック式、または cell 配列として指定します。

データ型: symmatrix | symfunmatrix | cell

代入する新しい値。数値、シンボリック数、シンボリック行列変数、シンボリック行列関数、シンボリック式、シンボリック配列、または cell 配列として指定します。newM のサイズは、oldM と同じであるか、sM の既定のシンボリック行列変数と同じでなければなりません。

データ型: sym | symmatrix | symfunmatrix | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | struct | cell

ヒント

  • subs(s,__)s を変更しません。s を変更するには、s = subs(s,__) を使用します。

  • s が一変数多項式で、new が数値行列の場合、polyvalm(sym2poly(s),new) を使用して行列として s を評価します。すべての定数項は、単位行列にその定数をかけた項に置き換えられます。

  • R2022b 以降、微分または関数 diff を含むシンボリック代入では、代入されるシンボリック オブジェクトの入力順序に従います。たとえば、次のコードは関数 diff を含むシンボリック代入を実行します。

    syms m k x(t)
    syms x_t x_t_ddot
    eqSHM = m*diff(x(t),t,2) == -k*x(t);
    eqSHMnew = subs(eqSHM,[x(t) diff(x(t),t,2)],[x_t x_t_ddot])
    R2022b より前では、コードは次の出力を返します。
    eqSHMnew = 
    m*x_t_ddot == -k*x_t

    R2022b 以降では、コードは次の出力を返します。

    eqSHMnew =
    0 == -k*x_t
    出力が異なるのは、subs が最初に x(t)x_t を代入するようになったためであり、この結果は diff(x_t,t,2)、つまり 0 に等しくなります。以前のリリースと同じ代入結果を得るには、最初に diff(x(t),t,2) 項を指定して、それが x(t) 項の前に代入されるようにします。
    eqSHMnew = subs(eqSHM,[diff(x(t),t,2) x(t)],[x_t_ddot x_t])
    eqSHMnew = 
    m*x_t_ddot == -k*x_t

バージョン履歴

R2006a より前に導入

すべて展開する