因数分解、展開

数学の計算では式の変形は基本的な操作といえます。しかしながら、 この計算は場合によっては慣れが必要な場合が多く、また 時間を必要とします。Mathematicaはこのような計算にたいして、 かなりの時間と労力を節約します。
式の基本的な変形についてはMathematica はつぎにあげるように数式の操作を行なうことができます。 Factor は因数分解を行ないますが、Factorterm は完全な因数分解をするわけではありません。

(2+4 x^2)^3 (x-1)^4
t = Expand[%]
Factor[t]
FactorTerms[t]

多項式が1変数でない時も上の命令は有効です。例えば次のようになります。 ここでCollectはある変数について整理します。 またExpandはオプションを指定すればある特別な変数のみについて、展開できます。

Expand[ (1 + 2x + 3 y^2)^3]
Collect[%,x]
Factor[%]
Collect[Expand[ (1 + x + 2y + 3z)^5],{x,y}]
Expand[ (x+2)^2 (y +1)^3,x]
Expand[ (x+2)^2 (y +1)^3 (z+1)^2,x]
Expand[ (x+2)^2 (y +1)^3 (z+1)^2,x]

つぎに特別な場合に因数分解をしてみる。

Factor[x^30 -1]
Factor[x^300 -1]
Factor[x^3000 -1]

Factorは多項式を実の有理数を係数とする多項式の範囲で因数分解する。 しかし、オプションを指定すると、複素有理係数の範囲で因数分解をする。

Factor[x^20 -1]
Factor[x^20 -1, GaussianIntegers ->True]
Factor[x^300 -1]
Factor[x^300 -1, GaussianIntegers ->True]

有理多項式の変形にたいしてはつぎのことが可能です。

ExpandNumerator[expr] 分子部分だけを展開
ExpandDenominator[expr] 分母部分だけを展開
Expand[expr] 分母部分を展開した上で、各項を分母で割る。
ExpandAll[expr] 分子分母を共に完全に展開する
Together[expr] すべての項を共通の分母に整理する。
Apart[expr] 表現が最も簡単な分母を持つ分数に分割、部分分数への分解
Cancel[expr] 約分
Factor[expr] 完全な因数分解


これを用いた例を以下にあげます。

t = (1+x^2)^2 / (1-x) + 3 x^2 / (2 +x)^2 + (1-x)^2
ExpandNumerator[t]
Expand[t]
ExpandDenominator[t]
ExpandAll[t]
ExpandAll[ (x+2)^3 / y^4 + (y+1)^2 /y^2 x,y]
u = (-4x + x^2)/(-x + x^2) + (-4+3 x + x^2)/(-1+x^2)
Together[%]
Factor[%]
Apart[u]
Cancel[u]
Factor[%]
v = (x^2 +y^2)/(x = xy^2)^2
Apart[v,x]
Apart[v,y]
Cancel[v]
Factor[u]
Factor[v]
Cancel[%]
Factor[v]
Apart[%]
Cancel[%]

三角関数を含む場合の数式の変形について述べる。 基本的な規則は以下の通りである。もし、Trig -> Trueを書かないと 三角関数を含む変形はできない。

Expand[expr, Trig -> True] (sin x)^2 を sin(2x) などで書く。
Factor[expr, Trig -> True] sin(2x)を (sin x)^2 で書く。

以下でこれを示す。

Expand[Sin[x]^2 + Sin[2x]^2 + Cos[x]^2]
Expand[%,Trig->True]
Expand[Sin[x]^4 + Sin[2x]^4 + Cos[x]^4,Trig -> True]
Factor[%, Trig -> True]
Expand[Sin[a x] Cos[b x]^2, Trig -> True]
Factor[%,Trig -> True]

戻る
複素変数を含む場合の変形 (高度な話題)

Mathematicaで用いられる変数が実変数なのか複素変数なのかが 重要な時は次のように、ComplexExpand を用いる。この時はオプションで特に指定をしないかぎり、 すべての変数は実変数として取り扱われる。これは結果を著しく変えてしまうので注意する。 いかにそのような例を与える。

ComplexExpand[Sin[x+ I y]]
Expand[Sin[x+ I y]]
ComplexExpand[Cos[x+ I y]]
Expand[Cos[x+ I y]]
ComplexExpand[Tan[x+ I y]]
Expand[Tan[x+ I y]]
ComplexExpand[Sin[x] Exp[y],{x,y}]
ComplexExpand[Sin[x] Exp[y],{x}]
ComplexExpand[Sin[x] Exp[y],{y}]

上の表現で展開する時に通常は実部と虚部, Re x, Im xを用いるが、 これ以外にも、偏角と絶対値をもちいる極形式、それ自身と複素共役を用いる方法がある。 次の例を参照のこと。

ComplexExpand[x^2,{x}]
ComplexExpand[x^2,{x},TargetFunctions->{Abs,Arg}]
ComplexExpand[x^3,{x},TargetFunctions->{Conjugate,Sign}]
ComplexExpand[x^4,{x},TargetFunctions->{Conjugate,Sign}]
ComplexExpand[x^4 y^2,{x,y},TargetFunctions->{Conjugate,Sign}]
ComplexExpand[(x +y)^2,{x,y},TargetFunctions->{Conjugate,Sign}]
ComplexExpand[(x +y)^4,{x,y},TargetFunctions->{Conjugate,Sign}]

以上の機能をもとにして、高校で習った練習問題あるいは入試問題を 解いてみよ。幾つかの問題は簡単に解くことができる。

戻る
べき級数展開

数学Bで行なったように関数を扱う時べき級数を用いると便利である。 ここではべき級数に展開できる関数(それを解析関数という)の展開の求めかた、 および展開が求まったとして、それにたいする演算について述べる。 関数のべき級数展開を行なうには次の命令がある。

Series[f(x), {x, a,n}] f(x)のx=aにおけるn次までのべき級数展開を与える
Series[expr, {x, a,n},{y, b, m}] xについてべき級数展開した後yについて展開する


具体的には次のようにする。これはsin xを第5項まで展開を求めている。

Series[Sin[x],{x,0,5}]

これを応用して、cos x, x sin xなどのテイラー展開を求めてみよ。 つぎにいくつかの関数の例をあげておく。最後の例は展開をする点が 無限遠点の場合である。

Series[ Exp[x],{x,0,5}]
Series[ Exp[x],{x,0,10}]
Series[x^2 Exp[-x],{x,0,10}]
Series[x^(-2) Exp[-x],{x,0,10}]
Series[1/(1-x),{x,0,10}]
Series[Sin[x],{x,0,10}]
Series[Sin[x],{x,0,20}]
Series[Cos[x],{x,0,12}]
Series[Cos[x] Exp[x],{x,0,12}]
Series[x/( Exp[x]- 1),{x,0,12}]
Series[Sec[x],{x,0,12}]
Series[ArcSin[x],{x,0,16}]
Series[Tan[x],{x,0,16}]
Series[Exp[x^2],{x,0,16}]
Series[Exp[x^2]/Cos[x],{x,0,16}]
Series[Exp[x],{x,1,16}]
Series[Exp[x],{x,I,16}]
Series[Exp[1/x],{x,Infinity,5}]

テイラー展開は関数の中に虚数単位Iを含んでいても展開することが できる。また変数はx以外の変数を関数が含んでいてもよい。 この時、展開する変数は指定することができる。変数は複数指定することができる。 次の例を参照のこと。

Series[Exp[I x],{x,0,16}]
Series[Exp[x + y],{x,0,16}]
Series[Exp[x + y],{x,0,16},{y,0,5}]
Series[Cos[x] Sin[y] Exp[z],{x,0,12}]
Series[Cos[x] Sin[y] Exp[z],{x,0,12},{y,0,5}]
Series[Cos[x] Sin[y] Exp[z],{x,0,12},{y,0,5},{z,0,5}]
Series[(x+y)^8 ,{x,0,12},{y,0,12}]
Expand[(x+y)^8]

テイラー展開を何乗かした展開を求めたり、logをとったり、 いろいろな操作をすることができる。
最初の2つは2乗および3乗をしている。2乗では2つのやり方を比較している。三番目はべき級数の対数を計算している。

Series[Sin[x],{x,0,8}]
%^2
Series[Sin[x]^2,{x,0,8}]

t=Series[Sin[x],{x,0,8}]
t^3

Series[Sin[x],{x,0,8}]
Log[%]

つぎにいくつかのべき級数の演算について述べる。 べき級数の積あるいは商の 計算法についてのべる。

t=Series[Exp[x]-1, {x,0,10}]
Series[x/t,{x,0,10}]

t=Series[Sin[x^2],{x,0,20}]
s=Series[Exp[x^2],{x,0,20}]
Series[t s,{x,0,20}]

t=Series[Cos[x],{x,0,20}]
Series[ s/t,{x,0,20}]

s=Series[Cos[x],{x,0,10}]
t=1-4 x^4
Series[ s/t,{x,0,10}]

べき級数は微分あるいは積分をすることができる。 すなわち、べき級数があらわす関数を微分するためには、 級数の各項を微分してやればよい。 Mathematica で実際計算するためには、 微分する変数あるいは積分する変数を指定してやる。
たとえば次の例のようにする。 ここで % は前の結果をあらわす。この記号については このノートの最初を参照のこと。

Series[Cos[x],{x,0,12}]
D[%,x]

Series[Sin[x],{x,0,12}]
D[%,x]
D[%,x]
D[%,x]
Integrate[%,x]
Integrate[%,x]

つぎにあるべき級数を他の級数に代入したり、逆を求めたりする。 これはべき級数展開が表わす関数で合成関数を構成したり、 逆関数を求めることに対応する。

t = Series[Sin[x],{x,0,10}]
t /.x->t
Series[Sin[Sin[x]],{x,0,10}]

InverseSeries[t,x]
% /.x->t

t =Series[1/(1-2 x),{x,0,10}]
s = Series[Exp[x],{x,1,10}]
s /.x -> t

t=Series[Exp[x],{x,0,10}]
s = Series[Exp[x],{x,1,6}]
s /.x->t

s = Series[Cos[x],{x,0,6}]
t=Series[x/(3- x),{x,0,5}]
s/. x->t

つぎに関数が負べきを含む場合のテイラー展開、あるいは 無限遠点∞での展開を求めることができる。 このような、負べきを含む展開はローラン展開といわれる。 ここであらわれる関数については講義を参照のこと。

問題
ここであらわれた関数のグラフを描いて、そのグラフを 確認せよ。(ヒント:Plot 命令を用いよ。)

Series[ArcTan[x],{x,0,12}]
Series[1/(c - b x),{x,a,6}]
Series[ Log[1+x],{x,0,10}]
Series[1/(1 + x)^m,{x,0,8}]
Series[ x^(-5) Sin[x],{x,0,6}]
Series[ x^(-5) Exp[2x],{x,0,6}]
Series[ 1/(x - x^2),{x,0,6}]
Series[ Sinh[Pi x]/x^3,{x,0,6}]
Series[x^2 Exp[1/x],{x,Infinity,5}]
Series[1/(1-x),{x,Infinity,5}]
Series[1/(x^3 - x^4),{x,Infinity,5}]
Series[1/(x^3 - x^4),{x,0,5}]
Series[(-2 x+3)/(x^2-3x+2),{x,0,6}]
Series[Sin[1/x],{x,Infinity,6}]

関数をテイラー展開する点が、いわゆる特異点であるときも 展開を求めることができる。
このような展開はローラン展開といわれる。 ローラン展開は留数の計算では重要である。 また、Normal[t]は展開をいわゆる通常の多項式に変換する。 これによって、因数分解、和、積などの演算ができるようになる。 さらに、テイラー展開をする点は実数である必要はなく、 複素数であってもよい。次の例を参考のこと。

Series[1/(1-x^2),{x,1,6}]
Series[1/(1-x^4),{x,1,6}]
Series[(4x^2+2x-4)/(x^3-4x),{x,2,6}]

Series[(-2 x+3)/(x^2-3x+2),{x,Infinity,6}]
Series[1/(x-1),{x,Infinity,6}]
t=%
s=%%
Normal[t]
Normal[s]
s=Normal[s]
t=Normal[t]
s+t

Series[1/(1+x^2),{x,I,5}]
Series[(x^4-2 I x^2)/(x - I)^2,{x,I,5}]

戻る
極限の近似計算

(x, sin x, sin x/x) をx 0.5 から 0.01まで0.01刻みで計算する。 これから有名な公式

limx → 0 sin x /x =1

が成立することが予想される。

Do[Print[{i, Sin[i], Sin[i]/i}],{i,0.5,0.01,-0.01}]

f(x) = (x^2-1)/(x-1)の値をx=0.5からx=1まで0.01刻みで計算する。 これより、limx → 1 (x^2-1)/(x-1) = 2であることが予想される。

Do[Print[{i,(i^2-1)/(i-1)}],{i,0.5,1,0.01}]

y = (ex -1)/xの値をx=0.3からx=0.01まで0.01刻みで計算したものである。 これより、

limx → 0 (e^x -1)/x = 1

であることが予想される。

Do[Print[{i,(E^i-1)/i}],{i,0.5,0,-0.01}]

戻る
極限の計算

極限の計算を簡単に行なう命令がMathematica には備わっている。 そのような例を次に与える。用いかたは例をみれば ほとんど明らかだとおもう。ここでオプションDirection → 1は xがある値aに近づく方向を指定しており、xが左からaに接近したとき の極限を求める。
xが右からaに接近したときの極限を求めるためにはオプション Direction → -1 を指定する。 授業で述べたように、この2つの極限は一致しないことがある。

問題 この2つの極限は一致しないような例をあげよ。 また、いろいろな関数にたいして、極限を計算してみよ。 また、微分の定義にもどって、いろいろなf(x)にたいして limx → a (f(x)-f(a))/(x-a)を計算してみよ。

Limit[Sin[x]/x, x->0]
Limit[Log[x] Sin[x]/x, x->0]
Limit[Log[x] Sin[x], x->0]
Limit[(1+1/x)^x, x->Infinity]
Limit[(1+2/x)^x, x->Infinity]
Limit[x^x, x->0,Direction->1]
Limit[x^x, x->0]
Limit[x Sin[x], x->0]
Limit[(x^2-1)/( Sin[x]-1), x->0]

戻る