関数を選択して式を再編する
変換の種類 | 関数 |
---|---|
同じ代数構造の項を結合する | combine |
式を展開する | expand |
式を因数分解する | factor |
式の部分式の抽出 | children |
同じべき乗で項をまとめる | collect |
式を別の関数で表す | rewrite |
式の部分分数分解を計算する | partfrac |
有理式の標準形を計算する | simplifyFraction |
ホーナーの入れ子形式で多項式を表現する | horner |
同じ代数構造の項を結合する
Symbolic Math Toolbox™ では、式内の部分式を結合する関数 combine
が提供されています。関数 combine
は指定された関数の数学的恒等を使用します。たとえば、三角関数の式を結合します。
syms x y combine(2*sin(x)*cos(x),'sincos')
ans = sin(2*x)
ターゲット関数が指定されない場合、combine
はべき乗について次の恒等性が有効な場合は必ず、これらの恒等を使用します。
ab ac = ab + c
ac bc = (a b)c
(ab)c = abc
たとえば、既定の設定で、この関数は次の平方根を結合します。
combine(sqrt(2)*sqrt(x))
ans = (2*x)^(1/2)
負の値の変数については恒等が有効とはならないため、この関数は平方根 sqrt(x)*sqrt(y)
を結合しません。
combine(sqrt(x)*sqrt(y))
ans = x^(1/2)*y^(1/2)
これらの平方根を結合するには IgnoreAnalyticConstraints
オプションを使用します。
combine(sqrt(x)*sqrt(y),'IgnoreAnalyticConstraints',true)
ans = (x*y)^(1/2)
IgnoreAnalyticConstraints
は、変数の値について一般的に使用される仮定の下で、式を結合できるショートカットを提供します。代わりに、変数に適切な仮定を明示的に設定することもできます。たとえば、x
と y
は正の値であると仮定します。
assume([x,y],'positive') combine(sqrt(x)*sqrt(y))
ans = (x*y)^(1/2)
計算を続けるため、x
と y
に設定された仮定を syms
を使用して再作成することで消去します。
syms x y
combine
は、ターゲット関数として atan
、exp
、gamma
、int
、log
、sincos
および sinhcosh
を受け入れます。
式を展開する
単純な式に対して、関数 expand
を使用して、積の和を乗算することで元の式を変換します。この関数は、多項式を展開するための簡単な方法を提供します。
expand((x - 1)*(x - 2)*(x - 3))
ans = x^3 - 6*x^2 + 11*x - 6
expand(x*(x*(x - 6) + 11) - 6)
ans = x^3 - 6*x^2 + 11*x - 6
また、指数関数や対数関数の式も展開します。たとえば、指数を含む次の式を展開します。
expand(exp(x + y)*(x + exp(x - y)))
ans = exp(2*x) + x*exp(x)*exp(y)
対数を含む式を展開します。対数の展開は総称としての複素数値には有効ではありませんが、正の値に対しては有効です。
syms a b c positive expand(log(a*b*c))
ans = log(a) + log(b) + log(c)
計算を続行するよう仮定を消去します。
syms a b c
または、対数を展開するときは IgnoreAnalyticConstraints
オプションを使用します。
expand(log(a*b*c),'IgnoreAnalyticConstraints',true)
ans = log(a) + log(b) + log(c)
expand
は、三角関数の式の展開についても有効です。たとえば、次の式を展開します。
expand(cos(x + y))
ans = cos(x)*cos(y) - sin(x)*sin(y)
expand
は、関数間の数学的恒等を使用します。
expand(sin(5*x))
ans = sin(x) - 12*cos(x)^2*sin(x) + 16*cos(x)^4*sin(x)
expand(cos(3*acos(x)))
ans = 4*x^3 - 3*x
expand
は、すべての部分式に対して再帰的に作用します。
expand((sin(3*x) + 1)*(cos(2*x) - 1))
ans = 2*sin(x) + 2*cos(x)^2 - 10*cos(x)^2*sin(x) + 8*cos(x)^4*sin(x) - 2
すべての三角関数、対数関数および指数関数の部分式の展開を防ぐには、オプション ArithmeticOnly
を使用します。
expand(exp(x + y)*(x + exp(x - y)),'ArithmeticOnly',true)
ans = exp(x - y)*exp(x + y) + x*exp(x + y)
expand((sin(3*x) + 1)*(cos(2*x) - 1),'ArithmeticOnly',true)
ans = cos(2*x) - sin(3*x) + cos(2*x)*sin(3*x) - 1
式を因数分解する
式のすべての既約因子を返すには、関数 factor
を使用します。たとえば、次の多項式のすべての既約因子を求めます。結果はこの多項式が 3 つの根 x = 1
、x = 2
および x = 3
をもつことを示します。
syms x factor(x^3 - 6*x^2 + 11*x - 6)
ans = [ x - 3, x - 1, x - 2]
多項式が既約の場合は、factor
は元の式を返します。
factor(x^3 - 6*x^2 + 11*x - 5)
ans = x^3 - 6*x^2 + 11*x - 5
式 x^6 + 1
の多項式の既約因子を求めます。既定では、factor
は、有理数について、厳密なシンボリック型を保持させたまま因数分解を使用します。得られたこの式の因数は、多項式の根を示していません。
factor(x^6 + 1)
ans = [ x^2 + 1, x^4 - x^2 + 1]
別のモードの因数分解を使用することで、この式は更に因数分解されます。たとえば、同じ式を複素数まで因数分解します。
factor(x^6 + 1,'FactorMode','complex')
ans = [ x + 0.86602540378443864676372317075294 + 0.5i,... x + 0.86602540378443864676372317075294 - 0.5i,... x + 1.0i,... x - 1.0i,... x - 0.86602540378443864676372317075294 + 0.5i,... x - 0.86602540378443864676372317075294 - 0.5i]
factor
は、多項式や有理式以外の式についても有効です。たとえば、対数関数、正弦関数および余弦関数を含む次の式を因数分解することができます。内部的には factor
は、これらの式の部分式を変数に置き換えて、多項式と有理式に変換します。既約因子の計算後、関数は元の部分式を戻します。
factor((log(x)^2 - 1)/(cos(x)^2 - sin(x)^2))
ans = [ log(x) - 1, log(x) + 1, 1/(cos(x) - sin(x)), 1/(cos(x) + sin(x))]
factor
を使用して、シンボリック整数とシンボリック有理数を因数分解します。
factor(sym(902834092)) factor(1/sym(210))
ans = [ 2, 2, 47, 379, 12671] ans = [ 1/2, 1/3, 1/5, 1/7]
factor
は、MATLAB® 関数 factor
では不可能な flintmax
よりも大きい数の因数分解も行うことができます。大きな数を正確に表すために、数値は引用符で囲んでください。
factor(sym('41758540882408627201'))
ans = [ 479001599, 87178291199]
式の部分式の抽出
関数 children
は式の部分式を返します。
複数の部分式からなる式 f
を定義します。
syms x y f = exp(3*x)*y^3 + exp(2*x)*y^2 + exp(x)*y;
children
を使用して f
の部分式を抽出します。
expr = children(f)
expr = 1×3 cell array {[y^2*exp(2*x)]} {[y^3*exp(3*x)]} {[y*exp(x)]}
結果に対して children
を繰り返し呼び出すことで、下位レベルの部分式を抽出できます。
次の式で children
を呼び出して、expr{1}
の部分式を抽出します。
expr1 = children(expr{1})
expr1 = 1×2 cell array {[y^2]} {[exp(2*x)]}
中かっこを使用して、cell 配列 expr1
の内容にアクセスします。
expr1{1} expr1{2}
ans = y^2 ans = exp(2*x)
同じべき乗で項をまとめる
数式に、指定された変数や式の同一べき乗項が含まれる場合、関数 collect
はこういった項をグループ化して式を再編成します。collect
を呼び出すときは、関数が未知数と見なす変数を指定します。関数 collect
は、元の式を指定された未知数の多項式と見なし、係数を同じべき乗でグループ化します。式の項を x
の同一べき乗でグループ化します。
syms x y z expr = x*y^4 + x*z + 2*x^3 + x^2*y*z +... 3*x^3*y^4*z^2 + y*z^2 + 5*x*y*z; collect(expr, x)
ans = (3*y^4*z^2 + 2)*x^3 + y*z*x^2 + (y^4 + 5*z*y + z)*x + y*z^2
同じ式の項を y
の同一べき乗でグループ化します。
collect(expr, y)
ans = (3*x^3*z^2 + x)*y^4 + (x^2*z + 5*x*z + z^2)*y + 2*x^3 + z*x
同じ式の項を z
の同一べき乗でグループ化します。
collect(expr, z)
ans = (3*x^3*y^4 + y)*z^2 + (x + 5*x*y + x^2*y)*z + 2*x^3 + x*y^4
collect
により未知数とみなされるべき変数が指定されない場合、関数は symvar
を使用して既定の変数を決定します。
collect(expr)
ans = (3*y^4*z^2 + 2)*x^3 + y*z*x^2 + (y^4 + 5*z*y + z)*x + y*z^2
いくつかの未知数をベクトルとして指定することによって、これらの未知数について式の項をまとめます。
collect(expr, [y,z])
ans = 3*x^3*y^4*z^2 + x*y^4 + y*z^2 + (x^2 + 5*x)*y*z + x*z + 2*x^3
式を別の関数で表す
ある式を特定の関数で表すには、関数 rewrite
を使用します。この関数は関数間の数学的恒等を使用します。たとえば、特定の三角関数で三角関数を含む式を書き換えます。
syms x rewrite(sin(x),'tan')
ans = (2*tan(x/2))/(tan(x/2)^2 + 1)
rewrite(cos(x),'tan')
ans = -(tan(x/2)^2 - 1)/(tan(x/2)^2 + 1)
rewrite(sin(2*x) + cos(3*x)^2,'tan')
ans = (tan((3*x)/2)^2 - 1)^2/(tan((3*x)/2)^2 + 1)^2 +... (2*tan(x))/(tan(x)^2 + 1)
rewrite
を使用して、これらの三角関数を指数関数で表します。
rewrite(sin(x),'exp')
ans = (exp(-x*1i)*1i)/2 - (exp(x*1i)*1i)/2
rewrite(cos(x),'exp')
ans = exp(-x*1i)/2 + exp(x*1i)/2
rewrite
を使用して、これらの双曲線関数を指数関数で表します。
rewrite(sinh(x),'exp')
ans = exp(x)/2 - exp(-x)/2
rewrite(cosh(x),'exp')
ans = exp(-x)/2 + exp(x)/2
また、rewrite
は逆双曲線関数を対数で表します。
rewrite(asinh(x),'log')
ans = log(x + (x^2 + 1)^(1/2))
rewrite(acosh(x),'log')
ans = log(x + (x - 1)^(1/2)*(x + 1)^(1/2))
式の部分分数分解を計算する
関数 partfrac
は、有理式を多項式と有理数の項の和の形式で返します。有理数の項の分子の次数は、分母よりも小さくなっています。式によっては、partfrac
が、明らかにより単純な形式を返す場合もあります。
syms x n = x^6 + 15*x^5 + 94*x^4 + 316*x^3 + 599*x^2 + 602*x + 247; d = x^6 + 14*x^5 + 80*x^4 + 238*x^3 + 387*x^2 + 324*x + 108; partfrac(n/d, x)
ans = 1/(x + 1) + 1/(x + 2)^2 + 1/(x + 3)^3 + 1
有理数の項の分母が、元の式の因子となっている共通分母を表します。
factor(d)
ans = [ x + 1, x + 2, x + 2, x + 3, x + 3, x + 3]
有理式の標準形を計算する
関数 simplifyFraction
は、展開された分子と分母をもつ 1 つの有理数の項で元の有理式を表します。返された式の分子と分母の最大公約数は 1 です。この関数は、関数 simplify
よりも効率的に分数を単純化します。
syms x y simplifyFraction((x^3 + 3*y^2)/(x^2 - y^2) + 3)
ans = (x^3 + 3*x^2)/(x^2 - y^2)
simplifyFraction
は分子と分母に現れる共通因子を相殺します。
simplifyFraction(x^2/(x + y) - y^2/(x + y))
ans = x - y
simplifyFraction
は、多項式や有理関数以外の式も処理します。内部的には、これらの式の部分式を識別子で置き換えて、多項式または有理関数に変換します。一時変数で式を標準化した後、simplifyFraction
は元の部分式を戻します。
simplifyFraction((exp(2*x) - exp(2*y))/(exp(x) - exp(y)))
ans = exp(x) + exp(y)
ホーナーの入れ子形式で多項式を表現する
ホーナーの (入れ子にされた) 多項式の形式は、同じ多項式の数学的に等価な他の形式と比べて算術演算が少ないことが多いため、数値評価に効率的です。通常、この形式の式は数値的に安定しています。入れ子形式で多項式を表すには、関数 horner
を使用します。
syms x horner(x^3 - 6*x^2 + 11*x - 6)
ans = x*(x*(x - 6) + 11) - 6
多項式の係数が浮動小数点数の場合、得られるホーナー形式はこれを有理数として表します。
horner(1.1 + 2.2*x + 3.3*x^2)
ans = x*((33*x)/10 + 11/5) + 11/10
得られた式の係数を浮動小数点数に変換するには、vpa
を使用します。
vpa(ans)
ans = x*(3.3*x + 2.2) + 1.1