ドキュメンテーション

このページは前リリースの情報です。該当の英語のページはこのリリースで変更されています。最新情報を確認するには、ページ左下にある国リストで [United States] を選択し、英語ドキュメンテーションに切り替えてください。

単純化

ここに 3 種類の異なるシンボリック式があります。

syms x
f = x^3 - 6*x^2 + 11*x - 6;
g = (x - 1)*(x - 2)*(x - 3);
h = -6 + (11 + (-6 + x)*x)*x;

次のコマンドで生成される、これらのプリティプリント書式は、以下のようになります。

pretty(f)
pretty(g)
pretty(h)
   3      2 
  x  - 6 x  + 11 x - 6
 
  (x - 1) (x - 2) (x - 3)
 
  x (x (x - 6) + 11) - 6

これら 3 式は同じ数学関数 (x の 3 次多項式) の異なる表現です。

各式は状況によって他の式よりも便利です。はじめの書式 f は、最も一般的に使われる多項式表現です。これは x のべき乗の単なる線形結合です。2 番目の書式 g は因数分解表現です。多項式の根が明らかで、根付近での数値計算が最も高精度に行えます。ただし、多項式がこのような単純な根をもたない場合は、因数分解表現はあまり便利ではありません。3 番目の書式 h は Horner 表現または入れ子表現です。数値計算に対して、これは演算数が最も少なく、x の特定の範囲に対しては最も高精度となります。

シンボリックな単純化問題は、これら 3 式が同じ関数を表していることの検証を含みます。これらの表現の中でどれが最もシンプルであるかという問題も含んでいます。

このツールボックスは、ある関数の 1 つの表現からできるだけ単純な別の表現に変換するために、さまざまな代数恒等式や三角恒等式を適用する関数を提供します。それらの関数とは、collectexpandhornerfactor および simplify です。

collect

ステートメント collect(f) は、シンボリック変数 (たとえば x) をもつ多項式として f を考え、同じ x のべき乗をもつすべての係数をまとめます。推定されたシンボリック変数が複数あるときは、2 番目の引数を使ってどの変数についてまとめるかを指定できます。いくつかの例を示します。

f

collect(f)

syms x
f = (x-1)*(x-2)*(x-3);
collect(f)
ans =
x^3 - 6*x^2 + 11*x - 6
syms x
f = x*(x*(x - 6) + 11) - 6;
collect(f)
ans =
x^3 - 6*x^2 + 11*x - 6
syms x t
f = (1+x)*t + x*t;
collect(f)
ans =
(2*t)*x + t

expand

ステートメント expand(f) は、和に対する積の分配法則を実行し、以下の例に示すように指数関数や三角関数の加法定理などを適用します。

f

expand(f)

syms a x y
f = a*(x + y);
expand(f)
ans =
a*x + a*y
syms x
f = (x - 1)*(x - 2)*(x - 3);
expand(f)
ans =
x^3 - 6*x^2 + 11*x - 6
syms x
f = x*(x*(x - 6) + 11) - 6;
expand(f)
ans =
x^3 - 6*x^2 + 11*x - 6
syms a b
f = exp(a + b);
expand(f)
ans =
exp(a)*exp(b)
syms x y
f = cos(x + y);
expand(f)
ans =
cos(x)*cos(y) - sin(x)*sin(y)
syms x
f = cos(3*acos(x));
expand(f)
ans =
4*x^3 - 3*x
syms x
f = 3*x*(x^2 - 1) + x^3;
expand(f)
ans =
4*x^3 - 3*x

horner

ステートメント horner(f) は、シンボリック多項式 f を Horner 表現あるいは入れ子表現に変換します。下表に例を示します。

f

horner(f)

syms x
f = x^3 - 6*x^2 + 11*x - 6;
horner(f)
ans =
x*(x*(x - 6) + 11) - 6
syms x
f = 1.1 + 2.2*x + 3.3*x^2;
horner(f)
ans =
x*((33*x)/10 + 11/5) + 11/10

factor

f が有理係数をもつ多項式であるとき、ステートメント

factor(f)

f を有理係数をもつ低次の因子から成るベクトルとして表現します。f が有理数の範囲内で因数分解できない場合、結果は f それ自体になります。いくつかの例を示します。

f

factor(f)

syms x
f = x^3 - 6*x^2 + 11*x - 6;
factor(f)
ans =
[ x - 3, x - 1, x - 2]
syms x
f = x^3 - 6*x^2 + 11*x - 5;
factor(f)
ans =
x^3 - 6*x^2 + 11*x - 5
syms x
f = x^6 + 1;
factor(f)
ans =
[ x^2 + 1, x^4 - x^2 + 1]

この他、factor を使った、整数を含むシンボリック オブジェクトの素因数分解も可能です。これは、MATLAB® 関数 factor の代替として使うものです。以下に例を示します。

N = sym(902834092);
f = factor(N)
f =
[ 2, 2, 47, 379, 12671]

factor は、MATLAB 関数 factor では不可能な flintmax よりも大きい数の因数分解も行うことができます。たとえば、大きな数の素因数分解を行う場合は、それを正確に表現するため引用符で囲みます。

n = sym('41758540882408627201');
factor(n)
ans =
[ 479001599, 87178291199]

simplifyFraction

ステートメント simplifyFraction(f) によって式 f は、分子と分母がどちらも多項式で、最大公約数が 1 である分数として表現されます。Expand オプションを使用すると、結果の式の分子と分母を展開できます。

simplifyFraction は分数を単純化する場合、一般的な単純化関数 simplify よりもはるかに効率的です。

f

simplifyFraction(f)

syms x
f =(x^3 - 1)/(x - 1);
simplifyFraction(f)
ans =
x^2 + x + 1
syms x
f = (x^3 - x^2*y - x*y^2 + y^3)/(x^3 + y^3);
simplifyFraction(f)
ans =
(x^2 - 2*x*y + y^2)/(x^2 - x*y + y^2)
syms x
f = (1 - exp(x)^4)/(1 + exp(x))^4;
simplifyFraction(f)
ans =
(exp(2*x) - exp(3*x) - exp(x) + 1)/(exp(x) + 1)^3
simplifyFraction(f, 'Expand', true)
ans =
(exp(2*x) - exp(3*x) - exp(x) + 1)/(3*exp(2*x) + exp(3*x) + 3*exp(x) + 1)

simplify

関数 simplify は、三角関数、指数関数や対数関数、ベッセル関数、超幾何関数、ガンマ関数などに関する多くの関数恒等式同様に、総和、積分、平方根、その他の関数に関する多くの代数恒等式を適用する強力で一般的なツールです。ここで、いくつかの例を示します。

f

simplify(f)

syms x
f = (1 - x^2)/(1 - x);
simplify(f)
ans =
x + 1
syms a
f = (1/a^3 + 6/a^2 + 12/a + 8)^(1/3);
simplify(f)
ans =
((2*a + 1)^3/a^3)^(1/3)
syms x y
f = exp(x) * exp(y);
simplify(f)
ans =
exp(x + y)
syms x
f = besselj(2, x) + besselj(0, x);
simplify(f)
ans =
(2*besselj(1, x))/x
syms x
f = gamma(x + 1) - x*gamma(x);
simplify(f)
ans =
0
syms x
f = cos(x)^2 + sin(x)^2;
simplify(f)
ans =
1

構文 simplify(f, 'Steps', n) も使えます。ここで、n は正の整数で、simplify が実行するステップ数を指定します。既定では、n = 1 です。たとえば、以下のようになります。

syms x
z = (cos(x)^2 - sin(x)^2)*sin(2*x)*(exp(2*x) - 2*exp(x) + 1)/(exp(2*x) - 1);
simplify(z)
ans =
(sin(4*x)*(exp(x) - 1))/(2*(exp(x) + 1))
simplify(z, 'Steps', 30)
ans =
(sin(4*x)*tanh(x/2))/2
この情報は役に立ちましたか?