Main Content

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

subexpr

共通の部分式によるシンボリック式の書き換え

説明

[r,sigma] = subexpr(expr) は、共通の部分式をシンボリック変数 sigma に代入することにより、シンボリック式 expr を共通の部分式で書き換えます。入力式 expr は変数 sigma を含むことができません。

[r,var] = subexpr(expr,'var') は、共通の部分式に var を代入します。入力式 expr はシンボリック変数 var を含むことができません。

シンボリック変数 var が MATLAB® ワークスペースに既に存在している必要がある点を除いて、[r,var] = subexpr(expr,var)[r,var] = subexpr(expr,'var') と等価です。

この構文は変数 var の値に expr の中で見つかった共通の部分式を上書きします。var の値への上書きを防ぐには、2 番目の出力引数に別の変数名を使用します。たとえば、[r,var1] = subexpr(expr,var) を使用します。

すべて折りたたむ

次の方程式を解きます。解は非常に長い式になります。解を表示するには、solve コマンドの最後のセミコロンを削除します。

syms a b c d x
solutions = solve(a*x^3 + b*x^2 + c*x + d == 0, x, 'MaxDegree', 3);

これらの長い式には共通の部分式があります。式を短くするには、subexpr を使用して共通の部分式を略記します。省略に使用する変数を subexpr の 2 番目の入力引数として指定しない場合は、subexpr は変数 sigma を使用します。

[r, sigma] = subexpr(solutions)
r = 

(σ-b3a-σ2σσ22σ-b3a-σ2-σ1σ22σ-b3a-σ2+σ1)where  σ1=3σ+σ2σi2  σ2=c3a-b29a2[sigma - b/(3*a) - (c/(3*a) - b^2/(9*a^2))/sigma; (c/(3*a) - b^2/(9*a^2))/(sym(2)*sigma) - b/(3*a) - sigma/2 - (sqrt(sym(3))*(sigma + (c/(3*a) - b^2/(9*a^2))/sigma)*sym(1i))/2; (c/(3*a) - b^2/(9*a^2))/(sym(2)*sigma) - b/(3*a) - sigma/2 + (sqrt(sym(3))*(sigma + (c/(3*a) - b^2/(9*a^2))/sigma)*sym(1i))/2]

sigma = 

d2a+b327a3-bc6a22+c3a-b29a23-b327a3-d2a+bc6a21/3(sqrt((d/(2*a) + b^3/(27*a^3) - (b*c)/(6*a^2))^2 + (c/(3*a) - b^2/(9*a^2))^3) - b^3/(27*a^3) - d/(2*a) + (b*c)/(6*a^2))^sym(1/3)

2 次方程式を解きます。

syms a b c x
solutions = solve(a*x^2 + b*x + c == 0, x)
solutions = 

(-b+b2-4ac2a-b-b2-4ac2a)[-(b + sqrt(b^2 - 4*a*c))/(2*a); -(b - sqrt(b^2 - 4*a*c))/(2*a)]

syms を使用してシンボリック変数 s を作成し、結果の共通の部分式をこの変数に置き換えます。

syms s
[abbrSolutions,s] = subexpr(solutions,s)
abbrSolutions = 

(-b+s2a-b-s2a)[-(b + s)/(2*a); -(b - s)/(2*a)]

s = b2-4acsqrt(b^2 - 4*a*c)

代わりに、's' を使用して略語変数を指定することもできます。

[abbrSolutions,s] = subexpr(solutions,'s')
abbrSolutions = 

(-b+s2a-b-s2a)[-(b + s)/(2*a); -(b - s)/(2*a)]

s = b2-4acsqrt(b^2 - 4*a*c)

2 つの構文は共に、変数 s 値に共通の部分式を上書きします。したがって、たとえば、s をある値と置き換えることはできません。

subs(abbrSolutions,s,0)
ans = 

(-b+s2a-b-s2a)[-(b + s)/(2*a); -(b - s)/(2*a)]

変数 s の値への上書きを防ぐには、2 番目の出力引数に別の変数名を使用します。

syms s
[abbrSolutions,t] = subexpr(solutions,'s')
abbrSolutions = 

(-b+s2a-b-s2a)[-(b + s)/(2*a); -(b - s)/(2*a)]

t = b2-4acsqrt(b^2 - 4*a*c)
subs(abbrSolutions,s,0)
ans = 

(-b2a-b2a)[-b/(2*a); -b/(2*a)]

入力引数

すべて折りたたむ

共通の部分式を含む長い式。シンボリック式またはシンボリック関数として指定します。

共通の部分式の代入で使用する変数。文字ベクトルまたはシンボリック変数として指定します。

入力式 expr が既に var を含んでいる場合は、subexpr はエラーをスローします。

出力引数

すべて折りたたむ

共通の部分式を略語で置き換えた式。シンボリック式またはシンボリック関数として返します。

略語に使用される変数。シンボリック変数として返します。

R2006a より前に導入