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) で定義されます。
パターン マッチングを使用した代入
R2026b 以降
は、exprnew = subs(expr,match,replacement,Wildcards=vars)vars で指定された変数をワイルドカードとして扱い、expr 内でパターン match に一致する部分式を見つけて replacement に置き換えることで、パターンベースの代入を実行します。
例
シンボリック式で a を 4 に置き換えます。
syms a b expr = a*b^2
expr =
exprnew = subs(expr,a,4)
exprnew =
元の式で a*b を 5 に置き換えます。
exprnew = subs(expr,a*b,5)
exprnew =
シンボリック式の既定のシンボリック スカラー変数を a に置き換えます。置き換えるスカラー変数または部分式を指定しない場合、subs は、symvar を使用して既定の変数を求めます。
syms x y a expr = x + y
expr =
var = symvar(expr,1)
var =
x + y では、既定の変数は x です。したがって、subs は x を a に置き換えます。
exprnew = subs(expr,a)
exprnew =
シンボリック スカラー変数に新しい値が代入されても、それらの値を含む式の値は自動的に求められません。代わりに、subs を使用して式の値を求めます。
式 y = x^2 を定義します。
syms x
y = x^2;2 を x に代入します。y 値は 4 ではなく x^2 のままです。
x = 2; y
y =
subs を使用して、x の新しい値で y を評価します。
yeval = subs(y)
yeval =
代入の対象となる変数と新しい値をベクトルとして指定し、複数の置換を行います。
syms a b expr = cos(a) + sin(b)
expr =
exprnew = subs(expr,[a,b],[sym("alpha"),2])exprnew =
あるいは、複数の代入には cell 配列を使用します。
exprnew = subs(expr,{a,b},{sym("alpha"),2})exprnew =
シンボリック式のシンボリック スカラー変数 a を 3 行 3 列の魔方陣行列に置き換えます。定数 1 により、3 行 3 列の行列のすべての要素が 1 に拡張されることに注意してください。
syms a t expr = exp(a*t) + 1
expr =
expr3by3 = subs(expr,a,magic(3))
expr3by3 =
ベクトル、行列または非スカラー値の配列の要素を置き換えることもできます。たとえば、これらの 2 行 2 列の行列を作成します。
A = sym("A",[2,2])A =
B = sym("B",[2,2])B =
行列 A の最初の要素を行列 B と置き換えます。この置き換えを行う際に、subs は 2 行 2 列の行列 A を 4 行 4 列の行列に拡張します。
A4by4 = subs(A, A(1,1), B)
A4by4 =
subs を使用して、行列を表す変数を、行列のサイズを縮小するスカラー値に置き換えることはできません。
式でシンボリック スカラー変数 x および y を 2 行 2 列の行列に置き換えます。ベクトルまたは行列を含む複数の置換を行う場合は、cell 配列を使用して代入の対象となる変数と新しい値を指定します。
syms x y expr = x*y
expr =
exprnew = subs(expr,{x,y},{[0 1; -1 0],[1 -1; -2 1]})exprnew =
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 =
eqn2 の左辺を eqn2 の右辺に置き換えることで、eqn1 から y を消去します。
eqn1 = subs(eqn1,lhs(eqn2),rhs(eqn2))
eqn1 =
シンボリック関数で x を a に置き換えます。
syms x y a syms f(x,y) f(x,y) = x + y; f = subs(f,x,a)
f(x, y) =
subs はシンボリック関数式の値を置き換えますが、関数の入力引数は置き換えません。
formula = formula(f)
formula =
args = argnames(f)
args =
シンボリック関数の引数は明示的に置き換えます。
syms x y f(x,y) = x + y; f(a,y) = subs(f,x,a); f
f(a, y) =
次の連立方程式の解を確認するとします。
syms x y eqns = [x^2 + y^2 == 1, x == y]; sols = solve(eqns,[x y]); sols.x
ans =
sols.y
ans =
解を元の連立方程式に代入して解を検証します。
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) =
1 次導関数に別の変数 を、2 次導関数に別の変数 を代入します。これを行うには、まず、より高次の導関数 (2 次導関数) の代入を行う必要があります。
syms v_0 D2r exprnew = subs(expr,diff(r,t,t),D2r); exprnew = subs(exprnew,diff(r,t),v_0)
exprnew(t) =
また、置き換える変数とその置換値をベクトルとして指定することで、1 回の subs 呼び出しでこれらの代入を行うこともできます。
exprnew = subs(expr,[diff(r,t,t) diff(r,t)],[D2r v_0])
exprnew(t) =
1 次導関数のみを代入し、2 次導関数をそのまま保持する場合は、一時変数 を に戻して前のワークフローを続行します。
exprnew = subs(exprnew,D2r,diff(r,t,t))
exprnew(t) =
比較として、まず元の式の 1 次導関数に を代入すると、結果は になります。ここで、subs は 1 次導関数を に、2 次導関数を に置き換えます。この代入結果は、2 次導関数が含まれていない式となります。
syms v_0
exprnew = subs(expr,diff(r,t),v_0)exprnew(t) =
2 つの 2 行 2 列の行列の積を定義します。行列を symmatrix データ型のシンボリック行列変数として宣言します。
syms X Y [2 2] matrix M = X*Y
M =
行列変数 と を 2 行 2 列のシンボリック行列に置き換えます。ベクトルまたは行列を含む複数の置換を行う場合は、cell 配列を使用して代入の対象となる行列変数とその新しい値を指定します。新しい値は、代入の対象となる行列変数と同じサイズでなければなりません。
Mnew = subs(M,{X,Y},{[0 sqrt(sym(2)); sqrt(sym(2)) 0], [1 -1; -2 1]})Mnew =
式 Mnew を sym データ型に変換して、置換された行列の乗算結果を表示します。
Mnew = symmatrix2sym(Mnew)
Mnew =
R2022a 以降
関数 を定義します。ここで、 は 2 行 2 列の行列であり、 は 2 行 2 列の単位行列です。変数 に別の式を代入して、新しい関数を評価します。
2 行 2 列のシンボリック行列変数 を作成します。 の既存の定義をワークスペースに保持したまま、シンボリック行列関数 を作成します。 の多項式を割り当てます。
syms A 2 matrix syms f(A) 2 matrix keepargs f(A) = A*A - 2*A + eye(2)
f(A) =
次に、新しいシンボリック行列変数 と を作成します。 と の既存の定義をワークスペースに保持したまま、新しいシンボリック行列関数 を作成します。
syms B C 2 matrix syms g(B,C) 2 matrix keepargs
内の変数 に を代入します。代入結果を新しい関数 に割り当てます。
g(B,C) = subs(f,A,B+C)
g(B, C) =
subs を使用して、行列値 と に対する を評価します。
S = subs(g(B,C),{B,C},{[0 1; -1 0],[1 -1; -2 1]})S =
式 S を symmatrix データ型から sym データ型に変換して、多項式の代入結果を表示します。
Ssym = symmatrix2sym(S)
Ssym =
R2022b 以降
方程式 を定義します。ここで、 は 3 行 3 列の行列、 は 3 行 1 列の行列です。 に、別のシンボリック式、およびシンボリック値をもつ を代入します。この方程式がこれらの値について真となるかどうかをチェックします。
2 つのシンボリック行列変数 および を作成します。 と の既存の定義をワークスペースに保持したまま、シンボリック行列関数 を作成します。方程式を作成します。
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) =
に を代入し、この式の方程式に含まれる 2 次微分関数を評価します。
eqn = subs(eqn,f,X.'*A*X)
eqn(X, A) =
に次数 3 のヒルベルト行列を代入します。
eqn = subs(eqn,A,hilb(3))
eqn(X, A) =
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 以降
式 を定義します。ここで、 と は 3 行 3 列の行列です。行列をシンボリック行列変数として作成します。
syms X Y [3 3] matrix C = X*Y^2 - Y*X^2
C =
行列 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 =
結果を 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 =
パターンベースの代入を行うためのワイルドカードとして使用するシンボリック変数を作成します。
syms wsubs を使用して、パターン w に一致する式内のすべての項を 3 に置き換えます。式内の変数 x、y、z が置き換えられ、出力は 12 になります。
exprnew = subs(expr,w,3,Wildcards=w)
exprnew =
R2026b 以降
特定の三角恒等式を適用するシンボリック式を作成します。
syms x y expr = cos(x)^2 + sin(x)^2 + tan(y)^2 + x
expr =
代入を行うためのワイルドカードとして使用するシンボリック変数を作成します。三角恒等式 を適用するには、照合するパターンとその置換値を定義します。
syms w
match = cos(w)^2 + sin(w)^2match =
replacement = 1
replacement = 1
三角恒等式に基づくパターンに一致する項を置き換えます。
exprnew = subs(expr,match,replacement,Wildcards=w)
exprnew =
比較のために、simplify 関数を使用して元の式を単純化します。
res_simp = simplify(expr)
res_simp =
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 =
代入を行うためのワイルドカードとして使用するシンボリック変数を作成します。パターンが integer 型の任意のシンボリック オブジェクトと一致するための条件を定義します。
syms w condition = @(w) isSymType(w,"integer");
行列 M 内のすべての整数を 5 に置き換えます。
Mnew = subs(M,w,5,Wildcards=w,Condition=condition)
Mnew =
ここでは、変数 c は 5 に置き換えられていません。c は任意の整数値をもつと仮定されていますが、このオブジェクトの型は variable であり、condition で定義された条件を満たしていません。
symType(c)
ans = "variable"
c の既存の仮定を確認します。
assumptions
ans =
この仮定に基づいて、inを使用してワイルドカード変数の新しい条件を定義します。
condition = @(w) in(w,"integer");行列 M 内のすべての整数を 5 に置き換えます。これで、変数 c が 5 に置き換えられます。
Mnew = subs(M,w,5,Wildcards=w,Condition=condition)
Mnew =
入力引数
シンボリック入力。シンボリック スカラー変数、シンボリック行列変数、シンボリック関数、シンボリック行列関数、シンボリック式、シンボリック方程式、シンボリック配列、または構造体として指定します。
データ型: 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 > 0 | 0 より大きい任意のワイルドカード値と一致 |
@(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 より前に導入subs 関数は、Wildcards 引数と Condition 引数を使用したパターンベースの代入をサポートするようになりました。パターンベースの代入を使用すると、次のことができます。
パターンに一致する式の特定の部分を置き換える。
一致する項を置き換えるタイミングを制御する条件を定義する。
独自のカスタム恒等式を含む数学的恒等式を適用して、シンボリック式を単純化する。
詳細については、Pattern-Based Substitutionを参照してください。
構文 subs(expr) を使用すると、expr 内のシンボリック行列変数およびシンボリック行列関数に MATLAB ワークスペースで割り当てられた値を代入してから expr を評価できます。値が代入されていない変数は、変数のままになります。例については、シンボリック行列変数を含む式の評価を参照してください。
関数 subs は、最初の入力引数として、symmatrix 型または symfunmatrix 型のシンボリック方程式またはシンボリック条件を受け入れます。例については、シンボリック行列変数およびシンボリック行列関数の方程式への代入を参照してください。
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])
eqSHMnew = m*x_t_ddot == -k*x_t
R2022b 以降では、コードは次の出力を返します。
eqSHMnew = 0 == -k*x_t
subs が最初に x(t) に x_t を代入するようになったためであり、この結果左辺が m*diff(x_t,t,2) となり、つまり 0 に等しくなります。以前のリリースと同じ代入結果を得るには、最初に diff(x(t),t,2) 項を指定して、subs がそれを 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
関数 subs は、最初の入力引数として、symfunmatrix 型のシンボリック行列関数を受け入れます。例については、シンボリック行列関数での変数の代入を参照してください。
関数 subs は、最初の入力引数として、symmatrix 型のシンボリック式を受け入れます。例については、配列によるシンボリック行列変数の置き換えを参照してください。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)