Main Content

simplify

説明

S = simplify(expr) は、expr の代数的な単純化を行います。expr がシンボリック ベクトルまたはシンボリック行列である場合、この関数は expr の各要素を単純化します。

S = simplify(expr,Name,Value) は、1 つ以上の Name,Value のペアの引数で指定された追加オプションを使用して、expr の代数的な単純化を行います。

すべて折りたたむ

次のシンボリック式を単純化します。

syms x a b c
S = simplify(sin(x)^2 + cos(x)^2)
S = 1
S = simplify(exp(c*log(sqrt(a+b))))
S = a+bc/2

このシンボリック行列に対して simplify を呼び出します。入力引数がベクトルまたは行列である場合、simplify は、そのベクトルまたは行列の各要素を単純化した形式を求めます。

syms x
M = [(x^2 + 5*x + 6)/(x + 2), sin(x)*sin(2*x) + cos(x)*cos(2*x);
		(exp(-x*1i)*1i)/2 - (exp(x*1i)*1i)/2, sqrt(16)];
S = simplify(M)
S = 

(x+3cos(x)sin(x)4)

対数とべき乗を含むシンボリック式を単純化します。既定では、simplify でべき数と対数が結合されることはありません。これは、この結合が一般的な複素数値に有効でないためです。

syms x
expr = (log(x^2 + 2*x + 1) - log(x + 1))*sqrt(x^2);
S = simplify(expr)
S = -log(x+1)-log(x+12)x2

単純化ルールを適用して関数 simplify でべき乗と対数を結合できるようにするには、'IgnoreAnalyticConstraints'true に設定します。

S = simplify(expr,'IgnoreAnalyticConstraints',true)
S = xlog(x+1)

次の式を単純化します。

syms x
expr = ((exp(-x*1i)*1i) - (exp(x*1i)*1i))/(exp(-x*1i) + exp(x*1i));
S = simplify(expr)
S = 

-e2xii-ie2xi+1

既定では、simplify は内部単純化ステップを 1 つ使用します。単純化ステップの数を増やすことで、さまざまな単純化の結果をより簡潔な形式で取得できます。

S10 = simplify(expr,'Steps',10)
S10 = 

2ie2xi+1-i

S30 = simplify(expr,'Steps',30)
S30 = 

cos(x)-sin(x)iicos(x)-i

S50 = simplify(expr,'Steps',50)
S50 = tan(x)

目的の結果を返せない場合、代わりの単純化関数を試してください。関数を選択して式を再編するを参照してください。

'All' の値を true に設定することで、シンボリック式の等価な結果を取得します。

syms x
expr = cos(x)^2 - sin(x)^2;
S = simplify(expr,'All',true)
S = 

(cos(2x)cos(x)2-sin(x)2)

単純化ステップ数を 10 まで増やします。同じ式に対するその他の等価な結果を求めます。

S = simplify(expr,'Steps',10,'All',true)
S = 

(cos(2x)1-2sin(x)22cos(x)2-1cos(x)2-sin(x)2cot(2x)sin(2x)e-2xi2+e2xi2)

'Criterion' の値を 'preferReal' に設定することで、式の実数部と虚数部を分離します。

syms x
f = (exp(x + exp(-x*1i)/2 - exp(x*1i)/2)*1i)/2 -...
    (exp(-x - exp(-x*1i)/2 + exp(x*1i)/2)*1i)/2;
S = simplify(f,'Criterion','preferReal','Steps',100)
S = sin(sin(x))cosh(x)+cos(sin(x))sinh(x)i

'Criterion''preferReal' に設定されない場合、simplify は、より短いものの実数部と虚数部が分離されていない結果を返します。

S = simplify(f,'Steps',100)
S = sin(sin(x)+xi)

'Criterion''preferReal' に設定した場合、単純化関数によって、複素数値が部分式内に表示される形式の式の優先度が低くなります。入れ子になっている部分式の場合、複素数値が表示される式の階層が深くなるほど、その形式を取る式の優先度は低くなります。

'Criterion''preferReal' に設定することで、べき指数内の虚数項を回避します。

'Criterion''preferReal' に設定した場合としなかった場合とで複雑なシンボリック式を単純化して、この振る舞いを見ていきます。'Criterion''preferReal' に設定されている場合、simplify は虚数項を指数の外に置きます。

expr = sym(1i)^(1i+1);
withoutPreferReal = simplify(expr,'Steps',100)
withoutPreferReal = 

-112+12i

withPreferReal = simplify(expr,'Criterion','preferReal','Steps',100)
withPreferReal = 

e-π2i

simplify を使用して、等しい次元のシンボリック単位を含む式を単純化します。

u = symunit;
expr = 300*u.cm + 40*u.inch + 2*u.m;
S = simplify(expr)
S = 

752125m"meter - a physical unit of length."

simplify は書き換える単位を自動的に選択します。特定の単位を選ぶには、rewriteを使用します。

多くの場合、Symbolic Math Toolbox™ でシンボリック式を単純化するには、関数 simplify を使用すれば十分です。しかし、大規模で複雑な数式の場合、simplify を適用する前に関数 expand を使用することで、より単純化された結果をより迅速に得ることができます。

たとえば、以下のワークフローでは、カー計量を表す行列の行列式を求める際に、より良い結果を得ることができます[1]。カー計量のパラメーターを宣言します。

syms theta real;
syms r rs a real positive;

カー計量を表す行列を定義します。

rho = sqrt(r^2 + a^2*cos(theta)^2);
delta  = r^2 + a^2 - r*rs;
g(1,1) = - (1 - r*rs/rho^2);
g(1,4) = - (rs*a*r*sin(theta)^2)/rho^2;
g(4,1) = - (rs*a*r*sin(theta)^2)/rho^2;
g(2,2) = rho^2/delta;
g(3,3) = rho^2;
g(4,4) = (r^2 + a^2 + rs*a^2*r*sin(theta)^2/rho^2)*sin(theta)^2;

カー計量の行列式を評価します。

det_g = det(g)
det_g = 

-sin(θ)2a6cos(θ)4+a4r2cos(θ)4+2a4r2cos(θ)2+rsa4rcos(θ)2sin(θ)2-rsa4rcos(θ)2+2a2r4cos(θ)2+a2r4-rsa2r3cos(θ)2+rsa2r3sin(θ)2-rsa2r3+r6-rsr5a2+r2-rsr

関数 simplify を使用して行列式を単純化します。

D = simplify(det_g)
D = -sin(θ)2a2cos(θ)2+r2-a2sin(θ)2+a2+r2

代わりに、関数 expand で式をフラットにしてから、関数 simplify を適用します。この手順を追加することで、結果がより単純化されます。

D = simplify(expand(det_g))
D = -sin(θ)2-a2sin(θ)2+a2+r22

入力引数

すべて折りたたむ

入力式。シンボリック式、関数、ベクトルまたは行列として指定します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は関係ありません。

R2021a より前では、コンマを使用して名前と値の各ペアを区切り、Name を引用符で囲みます。

例: 'Seconds',60 では、単純化プロセスが 60 秒間に制限されます。

等価な結果を返すオプション。'All' と 2 つの logical 値のいずれかで構成されるコンマ区切りのペアとして指定します。このオプションを使用する場合、入力引数 expr はスカラーでなければなりません。

false既定のオプションを使用して、単純化の最終結果のみを返します。
true入力式に対する等価な結果の列ベクトルを返します。このオプションを 'Steps' オプションと共に使用することで、単純化プロセスで代替式を取得できます。

単純化条件。'Criterion' および次のいずれかの文字ベクトルから成るコンマ区切りペアで指定します。

'default'既定の (内部) 単純化条件を使用します。
'preferReal'複素数値を含む形式より、実数値を含む形式の S を優先します。いずれかの形式の S に複素数が含まれている場合、単純化関数によって、複素数値が部分式内に表示される形式の式の優先度が低くなります。入れ子になっている部分式の場合、複素数値が表示される式の階層が深くなるほど、その形式を取る式の優先度は低くなります。

単純化ルール。'IgnoreAnalyticConstraints' および次の値のいずれかで構成されるコンマ区切りペアとして指定します。

false厳格な単純化ルールを使用します。simplify は常に、最初の式と解析的に等価な結果を返します。
true純粋に代数的な単純化を式に適用します。IgnoreAnalyticConstraintstrue に設定することで解を単純化できますが、一般的に有効でない結果となる場合があります。つまり、このオプションは数学的恒等を適用します。便利ですが、変数が取り得るすべての値に対して結果が成り立つとは限りません。場合によっては、最初の式と等価ではない結果となる可能性があります。詳細については、アルゴリズムを参照してください。

単純化プロセスの制限時間。'Seconds' と秒単位で最大時間を表す正の値で構成される、コンマ区切りペアとして指定します。

単純化ステップの数。'Steps' と内部単純化ステップの最大数を表す正の値とで構成される、コンマ区切りペアとして指定します。単純化ステップの数を増やすと計算が遅くなる可能性があることに注意してください。

simplify(expr,'Steps',n)simplify(expr,n) と等価であり、n は単純化ステップの数です。

ヒント

  • 数式の単純化は明確に定義されているわけではありません。どの形式の式が最も単純かに関しては、一般的な考え方はありません。ある問題については最も単純な数式の形式が、別の問題については複雑で不適切となる場合があります。

アルゴリズム

IgnoreAnalyticConstraints を使用する場合、simplify は次のルールのいくつかに従います。

  • 任意の a および b について、log(a) + log(b) = log(a·b) が成り立つ。特に、a、b、c のすべての値に対して、次の等式が有効である。

    (a·b)c = ac·bc.

  • 任意の a および b について、log(ab) = b·log(a) が成り立つ。特に、a、b、c のすべての値に対して、次の等式が有効である。

    (ab)c = ab·c.

  • f および g が標準的な数学関数、かつ任意の微小な正数について f(g(x)) = x である場合、すべての複素数値 x に対してf(g(x)) = x が有効であるものとする。以下に例を示します。

    • log(ex) = x

    • asin(sin(x)) = x, acos(cos(x)) = x, atan(tan(x)) = x

    • asinh(sinh(x)) = x, acosh(cosh(x)) = x, atanh(tanh(x)) = x

    • ランベルトの W 関数のすべての分岐指標 k に対して、Wk(x·ex) = x

参照

[1] Zee, A. Einstein Gravity in a Nutshell. Princeton: Princeton University Press, 2013.

バージョン履歴

R2006a より前に導入