シンボリック式の単純化
数式の単純化は明確に定義されているわけではありません。どの形式の式が最も単純かに関しては、一般的な考え方はありません。ある問題については最も単純な数式の形式が、別の問題については複雑で不適切な場合もあります。たとえば、次の 2 つの数式は、同じ多項式の異なる形式による表現です。
(x + 1)(x - 2)(x + 3)(x - 4)
,
x4 - 2x3 - 13x2 + 14x + 24
.
1 番目の形式は、この多項式の根を明確に示しています。根を扱う場合、この形式はより簡単です。2 番目の形式は、多項式の係数の確認に最も適しています。たとえば、この形式は多項式の微積分に便利です。
解を求める問題に特定形式の式が必要な場合、最も望ましい方法は適切な単純化関数を選択することです。関数を選択して式を再編するを参照してください。
特定の単純化関数の他に、Symbolic Math Toolbox™ では、一般的な単純化関数 simplify
を提供します。
式に特定の形式 (展開、因数分解、または特定項による表現) が必要とされない場合、simplify
を使用して数式を短くします。たとえば、この単純化関数を使用して、計算の最終結果についてより短い形式を求めます。
simplify
は、多項式や、三角関数、対数関数および特殊関数を含む式など、さまざまなシンボリック式についても有効です。たとえば、以下の多項式を単純化します。
syms x y simplify((1 - x^2)/(1 - x)) simplify((x - 1)*(x + 1)*(x^2 + x + 1)*(x^2 + 1)*(x^2 - x + 1)*(x^4 - x^2 + 1))
ans = x + 1 ans = x^12 - 1
三角関数を含む式を単純化します。
simplify(cos(x)^(-2) - tan(x)^2) simplify(cos(x)^2 - sin(x)^2)
ans = 1 ans = cos(2*x)
指数や対数を含む式を単純化します。3 番目の式では、log(3)
の代わりに log(sym(3))
を使用します。log(3)
を使用する場合、MATLAB® は倍精度で log(3)
を計算してから結果をシンボリック数に変換します。
simplify(exp(x)*exp(y)) simplify(exp(x) - exp(x/2)^2) simplify(log(x) + log(sym(3)) - log(3*x) + (exp(x) - 1)/(exp(x/2) + 1))
ans = exp(x + y) ans = 0 ans = exp(x/2) - 1
特殊関数を含む式を単純化します。
simplify(gamma(x + 1) - x*gamma(x)) simplify(besselj(2, x) + besselj(0, x))
ans = 0 ans = (2*besselj(1, x))/x
simplify
を使用してシンボリック関数を単純化することもできます。
syms f(x,y) f(x,y) = exp(x)*exp(y) f = simplify(f)
f(x, y) = exp(x)*exp(y) f(x, y) = exp(x + y)
オプションを使用した単純化
既定では、simplify
は厳格な単純化ルールを使用して、単純化した式が最初の式と常に数学的に等価になるようにします。たとえば、一般的に複素数値の対数は結合しません。
syms x simplify(log(x^2) + log(x))
ans = log(x^2) + log(x)
すべてのパラメーター値およびすべてのケースについては適正ではないものの、それを使用して simplify
がより短い結果を返すことができるような、追加の単純化ルールを適用できます。この方法では IgnoreAnalyticConstraints
を使用します。たとえば、同じ式を IgnoreAnalyticConstraints
で単純化すると、得られる結果では対数が結合されます。
simplify(log(x^2) + log(x),'IgnoreAnalyticConstraints',true)
ans = 3*log(x)
IgnoreAnalyticConstraints
は、変数の値について一般的に使用される仮定の下で式を単純化できるショートカットを提供します。代わりに、変数に適切な仮定を明示的に設定することもできます。たとえば、対数の結合は一般的に複素数値には有効ではありません。x
が実数値であると仮定すると、simplify
は IgnoreAnalyticConstraints
がなくても対数を結合します。
assume(x,'real') simplify(log(x^2) + log(x))
ans = log(x^3)
計算を続けるため、x
に設定された仮定を syms
を使用して再作成することで消去します。
syms x
式や関数の単純化性能を向上させる他の方法として、構文 simplify(f,'Steps',n)
があります。ここで n
は正の整数で、simplify
が実行するステップ数を指定します。単純化のステップ数を増やすと式をより単純化できますが、より時間がかかります。既定では n = 1
です。たとえば、次の式を作成して単純化します。結果は元の式より短くなりますが、更に単純化できます。
syms x y = (cos(x)^2 - sin(x)^2)*sin(2*x)*(exp(2*x) - 2*exp(x) + 1)/... ((cos(2*x)^2 - sin(2*x)^2)*(exp(2*x) - 1)); simplify(y)
ans = (sin(4*x)*(exp(x) - 1))/(2*cos(4*x)*(exp(x) + 1))
同じ式について単純化ステップ数を指定します。まず 25 ステップを使用します。
simplify(y,'Steps',25)
ans = (tan(4*x)*(exp(x) - 1))/(2*(exp(x) + 1))
50 ステップを使用して、式を更に単純化します。
simplify(y,'Steps',50)
ans = (tan(4*x)*tanh(x/2))/2
既に式や関数を単純化しているが、同じ式の他の形式が必要であるとします。これを行うために、'All'
オプションを true
に設定できます。構文 simplify(f,'Steps',n,'All',true)
は、同じ式のその他の等価な結果を単純化ステップで示しています。
syms x y = cos(x) + sin(x) simplify(y,'Steps',10,'All',true)
ans = 2^(1/2)*sin(x + pi/4) 2^(1/2)*cos(x - pi/4) cos(x) + sin(x) 2^(1/2)*((exp(- x*1i - (pi*1i)/4)*1i)/2 - (exp(x*1i + (pi*1i)/4)*1i)/2)
等価な結果をさらに多く返すには、単純化ステップ数を 25 まで増やします。
simplify(y,'Steps',25,'All',true)
ans = 2^(1/2)*sin(x + pi/4) 2^(1/2)*cos(x - pi/4) cos(x) + sin(x) -2^(1/2)*(2*sin(x/2 - pi/8)^2 - 1) 2^(1/2)*(exp(- x*1i + (pi*1i)/4)/2 + exp(x*1i - (pi*1i)/4)/2) 2^(1/2)*((exp(- x*1i - (pi*1i)/4)*1i)/2 - (exp(x*1i + (pi*1i)/4)*1i)/2)
仮定を使用した単純化
普通には単純化できない式のいくつかには、特別な仮定の下ではるかに短くなるものがあります。たとえば、追加の仮定なしで次の三角関数の式を単純化すると、元の式を返します。
syms n simplify(sin(2*n*pi))
ans = sin(2*pi*n)
しかし、変数 n
がある整数を表す場合には、同じ三角関数の式が 0 に単純化します。
assume(n,'integer') simplify(sin(2*n*pi))
ans = 0
計算を続行するよう仮定を消去します。
syms n
分数の単純化
一般的な単純化関数 simplify
を使用して分数を単純化することができます。しかし、Symbolic Math Toolbox では特にこのタスク用に、より効率的な関数 simplifyFraction
が提供されています。ステートメント simplifyFraction(f)
は、分子と分母がどちらも多項式で、最大公約数が 1 の分数として式 f
を表します。たとえば、次の式を単純化します。
syms x y simplifyFraction((x^3 - 1)/(x - 1))
ans = x^2 + x + 1
simplifyFraction((x^3 - x^2*y - x*y^2 + y^3)/(x^3 + y^3))
ans = (x^2 - 2*x*y + y^2)/(x^2 - x*y + y^2)
既定では、simplifyFraction
は返される結果の分子および分母の式を展開しません。結果の式の分子と分母を展開するには Expand
オプションを使用します。比較のために、最初に Expand
なしでこの分数を単純化します。
simplifyFraction((1 - exp(x)^4)/(1 + exp(x))^4)
ans = (exp(2*x) - exp(3*x) - exp(x) + 1)/(exp(x) + 1)^3
今度は Expand
を設定して同じ式を単純化します。
simplifyFraction((1 - exp(x)^4)/(1 + exp(x))^4,'Expand',true)
ans = (exp(2*x) - exp(3*x) - exp(x) + 1)/(3*exp(2*x) + exp(3*x) + 3*exp(x) + 1)