ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

単純化

ここに 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 についてもう 1 つの例を示します。これは x^n + 1 という形式の多項式に因数分解されます。次のコード

syms x
n = (1:9)';    
p = x.^n + 1;
f = factor(p);
[p, f]

は、1 列目に多項式、2 列目にそれらを因数分解した式をもつ行列を返します。

ans =
[   x + 1,                                         x + 1]
[ x^2 + 1,                                       x^2 + 1]
[ x^3 + 1,                         (x + 1)*(x^2 - x + 1)]
[ x^4 + 1,                                       x^4 + 1]
[ x^5 + 1,             (x + 1)*(x^4 - x^3 + x^2 - x + 1)]
[ x^6 + 1,                     (x^2 + 1)*(x^4 - x^2 + 1)]
[ x^7 + 1, (x + 1)*(x^6 - x^5 + x^4 - x^3 + x^2 - x + 1)]
[ x^8 + 1,                                       x^8 + 1]
[ x^9 + 1,         (x + 1)*(x^2 - x + 1)*(x^6 - x^3 + 1)]

この他、factor を使って、整数を含むシンボリック オブジェクトの素因数分解も行えます。これは、MATLAB® specfun フォルダーの関数 factor の代替として使うものです。たとえば、次のコード セグメントにより

N = sym(1);
for k = 2:11
   N(k) = 10*N(k-1)+1;
end
[N' factor(N')]

1 を連ねたシンボリック整数の素因数が表示されます。

ans =
[           1,              1]
[          11,             11]
[         111,           3*37]
[        1111,         11*101]
[       11111,         41*271]
[      111111,   3*7*11*13*37]
[     1111111,       239*4649]
[    11111111,  11*73*101*137]
[   111111111,  3^2*37*333667]
[  1111111111, 11*41*271*9091]
[ 11111111111,   21649*513239]

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
この情報は役に立ちましたか?