メインコンテンツ

subs

R2026b

説明

変数、関数、または部分式の代入

exprnew = subs(expr,match,replacement) は、expr 内に現れるすべての match を replacement に置き換え、式を評価して、結果をシンボリック式として返します。

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

  • match がスカラーであり、replacement がベクトルまたは行列である場合、subs はすべての演算を要素単位で実行して、match のインスタンスをすべて replacement に置き換えます。この関数は、expr のすべての定数項を、すべて 1 のベクトルまたは行列にその定数をかけた項に置き換えます。

  • expr にシンボリック行列変数またはシンボリック行列関数が含まれる場合、replacement と match は同じサイズでなければなりません。

例

exprnew = subs(expr,replacement) は、expr 内に現れるすべての既定のシンボリック変数を replacement に置き換え、式を評価して、結果をシンボリック式として返します。既定の変数は symvar(expr,1) で定義されます。

例

exprnew = subs(expr) は、expr 内のシンボリック変数とシンボリック関数を MATLAB® ワークスペースで割り当てられた値に置き換え、式を評価して、結果をシンボリック式として返します。値が代入されていない変数は、変数のままになります。

例

パターン マッチングを使用した代入

R2026b 以降

exprnew = subs(expr,match,replacement,Wildcards=vars) は、vars で指定された変数をワイルドカードとして扱い、expr 内でパターン match に一致する部分式を見つけて replacement に置き換えることで、パターンベースの代入を実行します。

例

exprnew = subs(expr,match,replacement,Wildcards=vars,Condition=condition) は、condition で指定された制約または条件を使用して、パターンベースの代入を実行します。この関数は、一致したワイルドカード値について condition が true と評価される場合にのみ、一致する部分式を置き換えます。

例

例

すべて折りたたむ

シンボリック式で a を 4 に置き換えます。

syms a b
expr = a*b^2
expr = a b2
exprnew = subs(expr,a,4)
exprnew = 4 b2

元の式で a*b を 5 に置き換えます。

exprnew = subs(expr,a*b,5)
exprnew = 5 b

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

syms x y a
expr = x + y
expr = x+y
var = symvar(expr,1)
var = x

x + y では、既定の変数は x です。したがって、subs は x を a に置き換えます。

exprnew = subs(expr,a)
exprnew = a+y

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

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

syms x
y = x^2;

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

x = 2;
y
y = x2

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

yeval = subs(y)
yeval = 4

代入の対象となる変数と新しい値をベクトルとして指定し、複数の置換を行います。

syms a b
expr = cos(a) + sin(b)
expr = cos(a)+sin(b)
exprnew = subs(expr,[a,b],[sym("alpha"),2])
exprnew = sin(2)+cos(α)

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

exprnew = subs(expr,{a,b},{sym("alpha"),2})
exprnew = sin(2)+cos(α)

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

syms a t
expr = exp(a*t) + 1
expr = ea t+1
expr3by3 = subs(expr,a,magic(3))
expr3by3 = 

(e8 t+1et+1e6 t+1e3 t+1e5 t+1e7 t+1e4 t+1e9 t+1e2 t+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 列の行列に拡張します。

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

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

subs を使用して、行列を表す変数を、行列のサイズを縮小するスカラー値に置き換えることはできません。

式でシンボリック スカラー変数 x および y を 2 行 2 列の行列に置き換えます。ベクトルまたは行列を含む複数の置換を行う場合は、cell 配列を使用して代入の対象となる変数と新しい値を指定します。

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

(0-120)

x と y はスカラーであるため、これらの代入は要素単位で行われます。この結果を、2 行 2 列の 2 つの行列を要素単位で乗算したものと比較します。

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

     0    -1
     2     0

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

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

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

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

もう 1 つの方程式の変数の値を使用して、方程式からスカラー変数を消去します。2 番目の方程式において、isolate を使用して変数を左辺に分離します。次に、最初の方程式の変数に 2 番目の方程式の右辺を代入します。

まず、方程式 eqn1 および eqn2 を定義します。

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

isolate を使用して eqn2 の y を分離します。

eqn2 = isolate(eqn2,y)
eqn2 = 

y=cos(x)x

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

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

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

シンボリック関数で x を a に置き換えます。

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 = formula(f)
formula = a+y
args = argnames(f)
args = (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
eqns = [x^2 + y^2 == 1, x == y];
sols = solve(eqns,[x y]);
sols.x
ans = 

(-2222)

sols.y
ans = 

(-2222)

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

tf = isAlways(subs(eqns,sols))
tf = 2×2 logical array

   1   1
   1   1

1 次導関数と 2 次導関数を含むシンボリック式を作成します。

syms r(t)
expr = diff(r,t,t) + diff(r,t)
expr(t) = 

∂2∂t2 r(t)+∂∂t r(t)

1 次導関数に別の変数 v0 を、2 次導関数に別の変数 D2r を代入します。これを行うには、まず、より高次の導関数 (2 次導関数) の代入を行う必要があります。

syms v_0 D2r
exprnew = subs(expr,diff(r,t,t),D2r);
exprnew = subs(exprnew,diff(r,t),v_0)
exprnew(t) = D2r+v0

また、置き換える変数とその置換値をベクトルとして指定することで、1 回の subs 呼び出しでこれらの代入を行うこともできます。

exprnew = subs(expr,[diff(r,t,t) diff(r,t)],[D2r v_0])
exprnew(t) = D2r+v0

1 次導関数のみを代入し、2 次導関数をそのまま保持する場合は、一時変数 D2r を ∂2∂t2r(t) に戻して前のワークフローを続行します。

exprnew = subs(exprnew,D2r,diff(r,t,t))
exprnew(t) = 

∂2∂t2 r(t)+v0

比較として、まず元の式の 1 次導関数に v0 を代入すると、結果は v0 になります。ここで、subs は 1 次導関数を v0 に、2 次導関数を ∂∂t∂r(t)∂t=∂∂tv0=0 に置き換えます。この代入結果は、2 次導関数が含まれていない式となります。

syms v_0
exprnew = subs(expr,diff(r,t),v_0)
exprnew(t) = v0

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

syms X Y [2 2] matrix
M = X*Y
M = X Y

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

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

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

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

Mnew = symmatrix2sym(Mnew)
Mnew = 

(-2 222-2)

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-2 A+A2

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

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

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

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

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)

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

Ssym = symmatrix2sym(S)
Ssym = 

(0000)

R2022b 以降

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

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

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

∂∂XT ∂∂X f(X,A)=2 A

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

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

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

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

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

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

tf = isAlways(symfunmatrix2symfun(eqn))
tf = 3×3 logical array

   1   1   1
   1   1   1
   1   1   1

R2023b 以降

式 XY2-YX2 を定義します。ここで、X と Y は 3 行 3 列の行列です。行列をシンボリック行列変数として作成します。

syms X Y [3 3] matrix
C = X*Y^2 - Y*X^2
C = X Y2-Y X2

行列 X と Y に値を代入します。

X = [-1 2 pi; 0 1/2 2; 2 1 0];
Y = [3 2 2; -1 2 1; 1 2 -1];

subs を使用して、X と Y の値が代入された式 C を評価します。

Cnew = subs(C)
Cnew = 

-Σ1 Σ22+Σ2 Σ12where  Σ1=(322-12112-1)  Σ2=(-12π0122210)

結果を symmatrix データ型から double データ型に変換します。

Cnum = double(Cnew)
Cnum = 3×3

  -42.8496  -13.3584  -13.4336
   -0.7168    3.1416    0.0752
   -3.2832   29.8584   16.4248

R2026b 以降

シンボリック式を作成します。

syms x y z
expr = x + y*z
expr = x+y z

パターンベースの代入を行うためのワイルドカードとして使用するシンボリック変数を作成します。

syms w

subs を使用して、パターン w に一致する式内のすべての項を 3 に置き換えます。式内の変数 x、y、z が置き換えられ、出力は 12 になります。

exprnew = subs(expr,w,3,Wildcards=w)
exprnew = 12

R2026b 以降

特定の三角恒等式を適用するシンボリック式を作成します。

syms x y
expr = cos(x)^2 + sin(x)^2 + tan(y)^2 + x
expr = cos(x)2+sin(x)2+tan(y)2+x

代入を行うためのワイルドカードとして使用するシンボリック変数を作成します。三角恒等式 cos2(θ)+sin2(θ)=1 を適用するには、照合するパターンとその置換値を定義します。

syms w
match = cos(w)^2 + sin(w)^2
match = cos(w)2+sin(w)2
replacement = 1
replacement = 
1

三角恒等式に基づくパターンに一致する項を置き換えます。

exprnew = subs(expr,match,replacement,Wildcards=w)
exprnew = tan(y)2+x+1

比較のために、simplify 関数を使用して元の式を単純化します。

res_simp = simplify(expr)
res_simp = 

--x sin(y)2+x+1sin(y)2-1

simplify によって代数と三角法の広範な一連の規則が適用されますが、目的の形式が生成されない可能性があります。ここでは、simplify は expr の元の式を単純化する前に、tan 関数と cos 関数を sin で書き換えます。

R2026b 以降

整数とシンボリック変数を含むシンボリック行列を作成します。ここでは、変数 c は整数であると仮定されます。

syms a b
syms c integer
M = [a 2 3; 3 4 b; 3 3 c]
M = 

(a2334b33c)

代入を行うためのワイルドカードとして使用するシンボリック変数を作成します。パターンが integer 型の任意のシンボリック オブジェクトと一致するための条件を定義します。

syms w
condition = @(w) isSymType(w,"integer");

行列 M 内のすべての整数を 5 に置き換えます。

Mnew = subs(M,w,5,Wildcards=w,Condition=condition)
Mnew = 

(a5555b55c)

ここでは、変数 c は 5 に置き換えられていません。c は任意の整数値をもつと仮定されていますが、このオブジェクトの型は variable であり、condition で定義された条件を満たしていません。

symType(c)
ans = 
"variable"

c の既存の仮定を確認します。

assumptions
ans = c∈Z

この仮定に基づいて、inを使用してワイルドカード変数の新しい条件を定義します。

condition = @(w) in(w,"integer");

行列 M 内のすべての整数を 5 に置き換えます。これで、変数 c が 5 に置き換えられます。

Mnew = subs(M,w,5,Wildcards=w,Condition=condition)
Mnew = 

(a5555b555)

入力引数

すべて折りたたむ

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

データ型: sym | symmatrix | symfun | symfunmatrix (R2022a 以降) | struct

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

Wildcards オプションを使用すると、match は、指定された変数がワイルドカードとして機能するシンボリック パターンを定義します。この場合、match の型は sym または symfun である必要があり、subs 関数は、シンボリック パターンに一致する expr 内の各スカラー部分式を置き換えます。 (R2026b 以降)

データ型: sym | symmatrix | symfun | symfunmatrix | cell

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

シンボリック行列変数またはシンボリック行列関数を代入する場合、replacement のサイズは、match と同じであるか、expr の既定のシンボリック変数と同じでなければなりません。

Wildcards オプションを使用すると、replacement は、ワイルドカードを含むパターンに一致する項の置換値を定義します。この場合、subs 関数は、一致する部分式に対してスカラー代入を実行します。置換値の型は sym、symfun、single、double、int8、int16、int32、int64、uint8、uint16、uint32、または uint64 でなければなりません。 (R2026b 以降)

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

R2026b 以降

パターン マッチングのためのワイルドカード変数。シンボリック スカラー変数、またはシンボリック スカラー変数のベクトルとして指定します。ワイルドカードとして使用するシンボリック変数は、入力式 expr で使用する変数とは異なる必要があります。

データ型: sym

R2026b 以降

パターン マッチングを制約する条件。ワイルドカード値について true または false と評価される関数ハンドルとして指定します。subs 関数は、一致したワイルドカード値について condition が true と評価される場合にのみ代入を実行します。次の表では、関数ハンドルとそれに対応する一致条件の例を説明します。

関数ハンドル一致条件
@(w) true複素数である任意のワイルドカード値と一致
@(w) w > 00 より大きい任意のワイルドカード値と一致
@(w) (0 < w) & (w < 5)0 より大きく 5 未満である任意のワイルドカード値と一致
@(w) ~has(w,sym("t"))変数 t を含まない任意のワイルドカード値と一致
@(w) isSymType(w,"symfun")シンボリック関数である任意のワイルドカード値と一致
@(w) isSymType(w,"integer")明示的に整数である任意のワイルドカード値と一致
@(w) in(w,"integer")仮定を含めて整数である任意のワイルドカード値と一致

既定ではシンボリック変数は複素数であるため、パターンベースの代入では、条件 @(w) true を満たす複素数である任意のワイルドカード値に一致するものが検出されます。subs 関数は、一致する最も小さい部分式から始めて、独立した置換をできるだけ多く実行します。

パターンベースの代入を実行する際、subs は isAlways を内部で使用して、expr 内の変数に関するすべての仮定を考慮に入れます。したがって、パターン マッチングを制約する条件を指定するときに、isAlways を明示的に呼び出す必要はありません。たとえば、パターン マッチングを制約する条件を @(w) isAlways(w > 0) ではなく @(w) w > 0 として定義できます。

データ型: function_handle

出力引数

すべて折りたたむ

代入後のシンボリック式。シンボリック数、シンボリック スカラー変数、シンボリック行列変数、シンボリック関数、シンボリック行列関数、シンボリック式、シンボリック方程式、シンボリック配列、または構造体として返されます。

データ型: sym | symmatrix | symfun | symfunmatrix

ヒント

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

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

バージョン履歴

R2006a より前に導入

すべて展開する