Main Content

partfrac

説明

partfrac(expr,var) は、var について expr の部分分数分解を求めます。var を指定しない場合、partfracsymvar によって決定される変数を使用します。

partfrac(expr,var,Name,Value) は、1 つ以上のペアの引数 Name,Value によって指定された追加オプションを使用して、部分分数分解を求めます。

シンボリック式の部分分数分解

一変数式および多変数式の部分分数分解を求めます。

最初に、一変数式の部分分数分解を求めます。変数が 1 つしかない式の場合、変数の指定は省略できます。

syms x
partfrac(x^2/(x^3 - 3*x + 2))
ans =
5/(9*(x - 1)) + 1/(3*(x - 1)^2) + 4/(9*(x + 2))

特定の変数について多変数式の部分分数分解を求めます。

syms a b
partfrac(a^2/(a^2 - b^2),a)
ans =
b/(2*(a - b)) - b/(2*(a + b)) + 1
partfrac(a^2/(a^2 - b^2),b)
ans =
a/(2*(a + b)) + a/(2*(a - b))

変数を指定しない場合、partfrac は、symvar によって決定される変数について部分分数分解を計算します。

symvar(a^2/(a^2 - b^2),1)
partfrac(a^2/(a^2 - b^2))
ans =
b
 
ans =
a/(2*(a + b)) + a/(2*(a - b))

因数分解のモード

入力 FactorMode を使用して、特定の因数分解モードを選択します。

因数分解のモードを指定しないで、部分分数分解を求めます。既定では、partfrac は有理数の範囲の因数分解を行います。このモードでは、partfrac は数値を厳密なシンボリック型に保ちます。

syms x
f = 1/(x^3 + 2);
partfrac(f,x)
ans =
1/(x^3 + 2)

実数の範囲の因数分解で分解を繰り返します。このモードでは、partfrac は分母を、実数係数をもつ 1 次と 2 次の既約多項式に因数分解します。 このモードでは、すべての数値は浮動小数点数に変換されます。

partfrac(f,x,'FactorMode','real')
ans =
0.2099868416491455274612017678797/(x + 1.2599210498948731647672106072782) -...
(0.2099868416491455274612017678797*x - 0.52913368398939982491723521309077)/(x^2 -...
1.2599210498948731647672106072782*x + 1.5874010519681994747517056392723)

複素数の範囲の因数分解で分解を繰り返します。このモードでは、partfrac は、分母の 2 次多項式を複素係数をもつ 1 次式へ簡約します。このモードはすべての数値を浮動小数点数に変換します。

partfrac(f,x,'FactorMode','complex')
ans =
0.2099868416491455274612017678797/(x + 1.2599210498948731647672106072782) +...
(- 0.10499342082457276373060088393985 - 0.18185393932862023392667876903163i)/...
(x - 0.62996052494743658238360530363911 - 1.0911236359717214035600726141898i) +...
(- 0.10499342082457276373060088393985 + 0.18185393932862023392667876903163i)/...
(x - 0.62996052494743658238360530363911 + 1.0911236359717214035600726141898i)

制約なしの因数分解を使用して、同じ式の部分分数分解を求めます。このモードでは、partfrac は、 2 次多項式を複素係数をもつ 1 次式に分解して、分母を 1 次式に因数分解します。このモードでは、数値は厳密なシンボリック型に保たれます。

pfFull = partfrac(f,x,'FactorMode','full')
pfFull =
2^(1/3)/(6*(x + 2^(1/3))) +...
(2^(1/3)*((3^(1/2)*1i)/2 - 1/2))/(6*(x + 2^(1/3)*((3^(1/2)*1i)/2 - 1/2))) -...
(2^(1/3)*((3^(1/2)*1i)/2 + 1/2))/(6*(x - 2^(1/3)*((3^(1/2)*1i)/2 + 1/2)))

vpa を使用して、結果を浮動小数点数で近似します。式が変数 x 以外にシンボリック パラメーターを含まないので、結果は複素数の範囲の因数分解と同じになります。

vpa(pfFull)
ans =
0.2099868416491455274612017678797/(x + 1.2599210498948731647672106072782) +...
(- 0.10499342082457276373060088393985 - 0.18185393932862023392667876903163i)/...
(x - 0.62996052494743658238360530363911 - 1.0911236359717214035600726141898i) +...
(- 0.10499342082457276373060088393985 + 0.18185393932862023392667876903163i)/...
(x - 0.62996052494743658238360530363911 + 1.0911236359717214035600726141898i)

複素数の状態では、partfrac は、その係数が浮動小数点数に変換できる分母内の式のみ因数分解します。これを示すため、f2 をシンボリック変数に置き換えて部分分数分解を複素数の状態で求めます。partfrac が返す式は変化していません。

syms a
f = subs(f,2,a);
partfrac(f,x,'FactorMode','complex')
ans =
1/(x^3 + a)

制約なしの因数分解モードを使用する場合、partfrac は、分母の式をシンボリックに因数分解します。したがって、制約なしの因数分解モードの partfrac は、この式を因数分解します。

partfrac(1/(x^3 + a), x, 'FactorMode', 'full')
ans =
1/(3*(-a)^(2/3)*(x - (-a)^(1/3))) -...
((3^(1/2)*1i)/2 + 1/2)/(3*(-a)^(2/3)*(x + (-a)^(1/3)*((3^(1/2)*1i)/2 + 1/2))) +...
((3^(1/2)*1i)/2 - 1/2)/(3*(-a)^(2/3)*(x - (-a)^(1/3)*((3^(1/2)*1i)/2 - 1/2)))

制約なしの因数分解モードが返す root

制約なしの因数分解モードでは、係数を厳密なシンボリック数として求めることが数学的に不可能なとき、partfracroot を使用して係数を表現します。この動作を示します。

syms x
s = partfrac(1/(x^3 + x - 3), x, 'FactorMode','full')
s =
symsum(-((6*root(z^3 + z - 3, z, k)^2)/247 +...
         (27*root(z^3 + z - 3, z, k))/247 +...
          4/247)/(root(z^3 + z - 3, z, k) - x), k, 1, 3)

vpa を使用して、結果を浮動小数点数で近似します。

vpa(s)
ans =
0.1846004942289254798185772017286/(x - 1.2134116627622296341321313773815) +...
(- 0.092300247114462739909288600864302 + 0.11581130283490645120989658654914i)/...
(x + 0.60670583138111481706606568869074 - 1.450612249188441526515442203395i) +...
(- 0.092300247114462739909288600864302 - 0.11581130283490645120989658654914i)/...
(x + 0.60670583138111481706606568869074 + 1.450612249188441526515442203395i)

部分分数分解の分子と分母

部分分数分解の分子のベクトルと分母のベクトルを返します。

まず、次の式の部分分数分解を求めます。

syms x
P = partfrac(x^2/(x^3 - 3*x + 2), x)
P =
5/(9*(x - 1)) + 1/(3*(x - 1)^2) + 4/(9*(x + 2))

部分分数分解は分数の和になります。関数 children を使用して、その和の各項を含むベクトルを返します。次に、numden を使用して、各項の分子と分母を抽出します。

C = children(P);
C = [C{:}];
[N,D] = numden(C)
N =
[ 5, 1, 4]
 
D =
[ 9*x - 9, 3*(x - 1)^2, 9*x + 18]

分子のベクトルと分母のベクトルから部分分数分解を再構成します。

P1 = sum(N./D)
P1 =
1/(3*(x - 1)^2) + 5/(9*x - 9) + 4/(9*x + 18)

再構成された式 P1 が、元の部分分数分解 P と等価であることを検証します。

isAlways(P1 == P)
ans =
  logical
     1

入力引数

すべて折りたたむ

シンボリック式またはシンボリック関数として指定される有理式。

シンボリック変数として指定される、対象の変数。

名前と値の引数

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

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

例: partfrac(1/(x^3 - 2),x,'FactorMode','real')

因数分解のモード。'FactorMode' および次のいずれかの文字ベクトルから成るコンマ区切りペアで指定します。

'rational'有理数の範囲内の因数分解。
'real'実数係数を持つ 1 次と 2 次の多項式への因数分解。入力の係数は実数の浮動小数点数に変換できなければなりません。
'complex'係数が浮動小数点数である線形多項式への因数分解。入力の係数は浮動小数点数に変換できなければなりません。
'full'厳密なシンボリック係数を持つ線形多項式への因数分解。partfrac が係数を厳密なシンボリック数として計算できない場合、partfracroot の範囲にある symsum を使用して係数を表現します。

詳細

すべて折りたたむ

部分分数分解

部分分数分解は有理式の演算です。

f(x)=g(x)+p(x)q(x),

ここで、式の分母は q(x)=q1(x)q2(x) で記述でき、部分分数分解は以下の形の式になります。

f(x)=g(x)+jpj(x)qj(x)

ここで、分母 qj(x) は既約多項式または既約多項式のべき乗です。分子 pj(x) は対応する分母 qj(x) よりも次数の低い多項式です。

部分分数分解を使用すると、個別に返された式の各項を積分することによる積分の単純化が可能です。

バージョン履歴

R2015a で導入