You are on page 1of 16

Mathematica

戴忠淵

chungyuandye@gmail.com

http://chungyuandye.blogspot.com

January 5, 2009
Contents

1 微積分的基本操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 極限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 微分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 全微分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.4 積分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.5 級數 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
第1章

微積分的基本操作

1.1 極限

Mathematica計算極限的指令為Limit[f, x]。該指令的用法有以下幾種

1. Limit[f, x->a]:計算函數f在x → a的極限值

2. Limit[f, x->a, Direction -> 1]:計算函數f在x → a的右極限值

3. Limit[f, x->a, Direction ->-1]:計算函數f在x → a的左極限值

範例 1-1.
sin(x)
計算 lim
x→0 x
In[1]: Limit[Sin[x]/x, x -> 0]

Out[1]: 1

|x + 2|
計算 lim +
x→−2 x+2
In[2]: Limit[Abs[x + 2]/(x + 2), x -> -2, Direction -> 1]

Out[2]: −1

|x + 2|
計算 lim −
x→−2 x+2
In[3]: Limit[Abs[x + 2]/(x + 2), x -> -2, Direction -> -1]

Out[3]: 1
1.2 微分 2

|x + 2|
計算 lim
x→−2 x + 2

In[4]: Limit[Abs[x + 2]/(x + 2), x -> -2]

Out[4]: 1

在上式中很明顯發現Mathematica在計算極限值時,並不會考慮到極限的存在性。所以在函數極限發散或
不存在時,使用Limit指令必須更為小心。

1.2 微分

在Mathematica中計算函數的微分或積分是非常方便的,其指令為D[f,x],表示函數f對x做或偏微分。該
指令的用法有以下幾種:

∂f
1. D[f, x]:函數f對x微分,
∂x
∂n f
2. D[f, x1 , x2 , . . . , xn ]: 函數f對x1 , x2 , . . . 偏微分,
∂x1 ∂x2 · · · ∂xn

∂n f
3. D[f,{x,n}]:函數f對x做n次微分,
∂xn
{ }
∂f ∂f ∂f
4. D[f, {{x1 , x2 , . . . ,xn }]: 函數f分別對x1 , x2 , . . . 偏微分, , ,..., ,即傳回函數f的
∂x1 ∂x2 ∂xn
梯度。必須注意的是此處所傳回的為一陣列

範例 1-2. f(x, y) = xyexy


定義函數f(x, y) = xyexy

In[1]: f[x_,y_]:=x*y*Exp[x*y]

Out[1]: ∂f
函數f(x, y)對x做偏導數,即求
∂x
In[2]: D[f[x,y], x]

Out[2]: exy xy2 + exy y


3 CHAPTER 1. 微積分的基本操作

∂2 f
函數f(x, y)對x做二階偏微分,
∂x2
In[3]: D[f[x, y], x, x]

Out[3]: exy xy3 + 2exy y2

以下指令同樣也是對x做二階偏微分

In[4]: D[f[x, y], {x, 2}]

Out[4]: exy xy3 + 2exy y2

函數f(x, y)分別對x, y偏微分,傳回梯度

In[5]: D[f[x, y], {{x, y}}]


{ }
Out[5]: exy xy2 + exy y, exy yx2 + exy x

以矩陣方式表示梯度

In[6]: %//MatrixForm
 
xy 2 xy
 e xy + e y 
Out[6]:  
xy 2 xy
e yx + e x

上式結果分別再對x, y做偏微分即傳回海賽矩陣(Hessian Matrix)

In[7]: D[%, {{x, y}}] // MatrixForm


 
xy 3 xy 2 xy 2 2 xy xy
 e xy + 2e y e x y + 3e xy + e 
Out[7]:  
exy x2 y2 + 3exy xy + exy exy yx3 + 2exy x2

運用函數D[f,{x1 , n}]和D[f, {{x1 ,x2 ,. . . ,xn }}]的概念,我們可以把程式寫得更簡潔

In[8]: D[f[x, y], {{x, y},2}] // MatrixForm


 
Out[8]: exy
xy3
+ 2exy 2
y exy 2 2
x y + 3exy
xy + exy
 
 
xy 2 2 xy xy xy 3 xy 2
e x y + 3e xy + e e yx + 2e x
1.2 微分 4

產生f(x, y)的多變數泰勒展開式前3階各項元素,式中D[f[x,y],{x,i},{y,n-i}]表示函數f(x, y)先


對x做i次微分,之後再對y做n − i次微分

In[9]: Table[Binomial[n,i]*D[f[x,y],{x,i},{y,n-i}]*x^i*y^(n-i)/n!,

{n,0,3},{i,0,n}]//TableForm

Out[9]: f(x, y)

yf(0,1) (x, y) xf(1,0) (x, y)


1 2 (0,2) 1 2 (2,0)
y f (x, y) xyf(1,1) (x, y) x f (x, y)
2 2
1 3 (0,3) 1 2 (1,2) 1 2 (2,1) 1 3 (3,0)
y f (x, y) xy f (x, y) x yf (x, y) x f (x, y)
6 2 2 6

將上式所有元素相加即為f(x, y)的3階泰勒展開式

In[10]: Plus@@(%//Flatten)
1 1
Out[10]: f[x, y] + yf(0,1) [x, y] + y2 f(0,2) [x, y] + y3 f(0,3) [x, y] + xf(1,0) [x, y] + xyf(1,1) [x, y] +
2 6
1 2 (1,2) 1 1 1
xy f [x, y] + x2 f(2,0) [x, y] + x2 yf(2,1) [x, y] + x3 f(3,0) [x, y]
2 2 2 6

對於單變數函數的微分,Mathematica有個方便的技巧,就是直接以f’[x]表示即可;同理,f”[x]則表示函
數f(x)的二階導數,以此類推。
2
定義函數f(x) = xex

In[11]: f[x_]:=x*Exp[x^2]

傳回一階、二階和三階導數

In[12]: {f’[x],f’’[x],f’’’[x]}
{ 2 2 2 2 2 2 2
}
Out[12]: ex + 2ex x2 , 6ex x + 4ex x3 , 6ex + 24ex x2 + 8ex x4

傳回f(x)在x = 0的5階泰勒展開式

In[13]: Plus@@Table[D[f[x],{x,n}]/n!*x^n,{n,0,5}]
1 1 1 1 5 (5)
Out[13]: f[x] + xf ′ [x] + x2 f ′′ [x] + x3 f(3) [x] + x4 f(4) [x] + x f [x]
2 6 24 120
5 CHAPTER 1. 微積分的基本操作

1.3 全微分

dy
當y無法表示成x的封閉解(close-form)時,要求解
則必須倚賴隱函數微分。Mathematica中要進行
dx
隱含數微分則必須借助Dt這個全微分指令。全微分指令的用法有以下幾種:

1. Dt[f, x]:函數f對x做全微分

2. Dt[f]: 函數f對做全微分

3. Dt[f,{x,n}]:函數f對x做n階全微分

4. Dt[f, {{x1 , x2 , . . . ,xn }]: 函數f分別對x1 , x2 , . . . 做全微分

範例 1-3. 函數f(x, y) = 4x2 + 2xy − xy3


定義函數f(x, y)

In[1]: f[x_, y_] := 4x^2 + 2x*y - x*y^3

Out[1]:
函數f(x, y)對x做全微分

In[2]: Dt[f[x,y],x]

Out[2]: 8x + 2y − y3 + 2xDt[y, x] − 3xy2 Dt[y, x]

dy dy
上式中Dt[y, x]即為 ,接下來我們用指令Solve來求解
dx dx
In[3]: Solve[%==0,Dt[y,x]]
{{ }}
8x + 2y − y3
Out[3]: Dt[y, x] →
x (−2 + 3y2 )

函數f(x, y)做全微分

In[4]: Dt[f[x,y]]

Out[4]: 8xDt[x] + 2yDt[x] − y3 Dt[x] + 2xDt[y] − 3xy2 Dt[y]


1.4 積分 6

上式中Dt[x]和Dt[y]分別表示dx和dy,移項後也可傳回與Dt[y, x]相同之結果

In[5]: Solve[% == 0, Dt[y]]


{{ }}
8xDt[x] + 2yDt[x] − y3 Dt[x]
Out[5]: Dt[y] →
x (−2 + 3y2 )

1.4 積分

在Mathematica中計算函數的積分指令為Integrate,該指令的用法有以下幾種:

1. Integrate[f, x]: 傳回函數f的不定積分,即 f(x)dx

2. Integrate[f, {x, a, b}]: 傳回函數f在區間(a, b)間的定積分值

3. Integrate[f, {x1 , a, b}, {x2 , c, d}, . . . ] 傳回函數f在區間(a, b) × (c, d) × · · · 的定積分值。要注意


的是x1 為最外面的積分變數,x2 為倒數第二個的積分變數,即
∫b ∫d ∫
· · · f(x1 , x2 , . . . , xn )dxn · · · dx2 dx1
a c


1
範例 1-4. 計算 p dx
x
1
計算 p 的不定積分
x
In[1]: Integrate[1/x^p,x]
x1−p
Out[1]:
1−p

由於當p > 1時積分會發散,所以Mathematica會給於提示

In[2]: Integrate[1/x^p, {x,0,1}]


[ ]
1 [ ]
Out[2]: If Re(p) < 1, , Integrate x−p , {x, 0, 1}, Assumptions → Re(p) > 1
1−p

如果要避免發生錯誤,可以在指令後面加上一個假設參數,Assumptions->{0<p<1}

In[3]: Integrate[1/x^p, {x,0,1}, Assumptions->{0<p<1}]


1
Out[3]:
1−p
7 CHAPTER 1. 微積分的基本操作

另外一個方式為設定參數GenerateConditions為False,要求Mathematica不產生條件判斷式

In[5]: Integrate[1/x^p, {x,0,1}, GenerateConditions->True]


1
Out[5]:
1−p

∫∫
範例 1-5. (x2 − y)dydx,其中Ω = {(x, y)| − x2 6 y 6 x2 , −1 6 x 6 1}

繪出Ω的範圍

In[1]: RegionPlot[y <= x^2 && y >= -x^2, {x, -1, 1}, {y, -1, 1}]

Out[1]:
1.0

0.5

0.0

-0.5

-1.0
-1.0 -0.5 0.0 0.5 1.0

∫ 1 ∫ x2
我們可以把積分寫為 x2 − ydydx
−1 −x2

In[2]: Integrate[x^2-y,{x,-1,1},{y,-x^2,x^2}]
4
Out[2]:
5
我們也可以配合布爾函數來計算機分值

In[2]: Integrate[(x^2-y)*Boole[-x^2<=y&&y<=x^2&&-1<=x&&x<=1],{y,-1,1},{x,-1,1}]
4
Out[2]:
5
1.4 積分 8

此處的Boole為一指標函數,若(x, y)在Ω內則傳回1,否則傳為0,即

 1, (x, y) ∈ Ω
Boole[-x^2<=y&&y<=x^2&&-1<=x&&x<=1] =
 0, (x, y) ∈
/Ω

因此,當積分範圍複雜時,搭配布爾函數即可不考慮積分順序。
∫∫
範例 1-6. 24xydydx,其中Ω = {(x, y)|0 6 x 6 1, 0 6 y 6 1, 1 6 x + y 6 1.5}

首先畫出函數f(x, y) = 24xy在Ω的3D立體圖

In[1]: Plot3D[24*x*y,{x,0,1},{y,0,1},Filling->Bottom,

RegionFunction->Function[{x,y},x>=0&&x<=1&&y>=0&&y<=1&&x+y>=1&&x+y<=1.5]]

Out[1]:

10 1.0

0
0.0 0.5

0.5

1.0 0.0

配合布爾函數來計算積分值

In[2]: Integrate[24*x*y*Boole[x>=0&&x<=1&&y>=0&&y<=1&&x+y>=1&&x+y<=1.5],

{x,0,1},{y,0,1}]

Out[2]: 2.9375

若不使用布爾函數,本範例積分範圍必須拆成兩部分計算

In[3]: Integrate[24*x*y,{x,0,0.5},{y,1-x,1}]+Integrate[24*x*y,{x,0.5,1},{y,1-x,1.5-x}]

Out[3]: 2.9375
9 CHAPTER 1. 微積分的基本操作

2 +y2
範例 1-7. 假設f(x, y) = xyex
定義函數f(x, y)

In[1]: f[x_,y_]:=x*y*Exp[x^2+y^2]

Out[1]: ∫
dx
2
+y2
f(x, y)對x做積分,即求 xyex

In[2]: Integrate[f[x,y],x]
1 2 2
Out[2]: ex +y y
2
∫b
f(x, y)對x做積分,其中x ∈ (a, b),即求 xyex +y dx
2 2

In[3]: Integrate[f[x,y],{x,a,b}]
1 2( 2 2
)
Out[3]: ey −ea + eb y
2
∫b ∫d
d yd x
2
+y2
f(x, y)對x做積分,其中x ∈ (a, b)及y ∈ (c, d),即求 xyex
a c

In[4]: Integrate[f[x,y],{x,a,b},{y,c,d}]
1 ( a2 2
)( 2 2
)
Out[4]: e − eb ec − ed
4
當然並不是所有的函數都是可積,例如標準常態分配的機率密度函數,

1 x2
f(z) = √ e− 2 , −∞ < z < ∞

就無法求得其不定積分。此時,Mathematica也就無能為力。所以在求解此類問題時就必須借助數值積分。
數值積分是解決定積分的另一種有效的方法,它可以求出一個近似解。特別是對於用Integrate指令無法求
出的定積分,數值積分更是可以發揮巨大作用。Mathematica中數值積分的指令為NIntegrate,該指令組合
了N以及Integrate的用途,該指令的用法有以下幾種:

1. NIntegrate[f, {x, a, b}]: 傳回函數f的數值積分

2. NIntegrate[f, {x1 , a, b}, {x2 , c, d}, . . . ] 傳回函數f在區間(a, b) × (c, d) × · · · 的定積分值。要注


意的是x1 為最外面的積分變數,x2 為倒數第二個的積分變數
1.4 積分 10

1 z2
範例 1-8. 假設f(z) = √ e− 2 ,求解f(z)在區間−∞ < z < 1.96之積分值,即求

∫ 1.96
1 z2
√ e − 2 dz
−∞ 2π

繪圖

In[1]: p1=Plot[1/(2*Pi)^0.5*Exp[-z^2/2],{z,-5,5},RegionFunction->(#<=1.96&),

Filling->Bottom,PlotStyle->Thickness[0.01]];

p2=Plot[1/(2*Pi)^0.5*Exp[-z^2/2],{z,-5,5},

PlotStyle->Thickness[0.01],Filling->y];

Show[p1,p2]

Out[1]:
0.4

0.3

0.2

0.1

-4 -2 2 4

以Integrate計算不定積分值

In[3]: Integrate[1/(2*Pi)^0.5*Exp[-z^2/2],z]
[ ]
z
Out[3]: 0.5Erf √
2

2 x −t2
其中Erf(x)為誤差函數,Erf(x) = √ e dt。由於函數f(z)不可積,所以Mathematica並
π 0
沒有真正傳回不定積分。若在上式中將x以數值取代,則可傳回其近似值。
11 CHAPTER 1. 微積分的基本操作

以Integrate計算不定積分值 ,在統計學上此數表示為Z0.05

In[4]: Integrate[1/(2*Pi)^0.5*Exp[-z^2/2],{z,-Infinity,1.96}]

Out[4]: 0.975002

我們也可以用NIntegrate來求解相同的問題。要注意的是Nintegrate指令中的積分範圍參數必須為一數
值,否則會無法運算並出現錯誤訊息。

以NIntegrate計算,由於x並沒有指定特定數值,所以無法計算

In[5]: NIntegrate[1/(2*Pi)^0.5*Exp[-z^2/2],{z, -Infinity, x}]

NIntegrate::nintp : Encountered the non-number x at z = z. More. . .


[ z2
]
e− 2
Out[5]: Nintegrate , {z, −∞, x}
(2π)0.5

將x以1.96取代則可求得積分值為0.975002

In[6]: NIntegrate[1/(2*Pi)^0.5*Exp[-z^2/2],{z, -Infinity, 1.96}]

Out[6]: 0.975002

若要在NIntegrate中將積分參數以符號表示,則必須以函數方式表示。我們在這邊定義一個函
數Φ(x),其中?Number表示指定x為數值型態的變數。

In[7]: Φ[x_?NumberQ]:=NIntegrate[1/(2*Pi)^0.5*Exp[-z^2/2],{z, -Infinity, x}]

In[8]: Φ[1.96]

Out[8]: 0.975002

利用Φ(x)產生5個標準常態分配的隨機變數

In[9]: Table[x/.FindRoot[Φ[x]==Random[],{x,1}],{5}]]

In[10]: {0.0374232,-0.245631,1.48278,0.335166,0.674443}

Out[10]: 0.975002

此處所使用的FindRoot為方程式求根的一個指令,使用方式留待後面章節說明。
1.5 級數 12

x2 +y2
範例 1-9. 假設f(x, y) = e− 2 ,求解f(x, y)在區間0 < x < y < 1之雙重積分值,即求
∫1 ∫y
x2 +y2
e − 2 d xd y
0 0

以Integrate計算雙重積分值

In[1]: Integrate[Exp[-(x^2+y^2)/2],{y,0,1},{x,0,y}]
[ ]2
1 1
Out[1]: πErf √
4 2

將上式以數值方式輸出

In[2]: %//N

Out[2]: 0.366047

以NIntegrate計算雙重積分值

In[3]: NIntegrate[Exp[-(x^2+y^2)/2],{y,0,1},{x,0,y}]

Out[3]: 0.366047

搭配布爾函數,就可以不必理會積分順序

In[4]: NIntegrate[Exp[-(x^2+y^2)/2]*Boole[0<=x&&x<=y&&y<=1],{y,0,1},{x,0,1}]

Out[4]: 0.366047

1.5 級數

在Mathematica中計算函數的泰勒級數指令為Series[f,{x, a, n}],表示函數f在x = a的n階的泰勒展開


式。同時,Series也可處理多變數函數的泰勒展開式。當a = 0時,泰勒級數也稱為麥克勞林級數。該指令的
用法有:

1. Series[f,{x, a, n}]:函數f在x = a的n階泰勒展開式,所傳回的運算式中O (xn )稱為第n項餘式。

2. Series[f,{x1 , a1 , n1 }, {x2 , a2 , n2 }]:函數f先對x2 在x2 = a2 做n2 階展開後再對x1 在x1 = a1 展


開n1 階的泰勒展開式。
13 CHAPTER 1. 微積分的基本操作

範例 1-10.

計算f(x)在x = a的5階泰勒展開式

In[1]: Series[f[x], {x, a, 5}]


1 1 1 (4)
Out[1]: f(a) + f ′ (a)(x − a) + f ′′ (a)(x − a)2 + f(3) (a)(x − a)3 + f (a)(x − a)4 +
2 6 24
1 (5) ( )
f (a)(x − a)5 + O (x − a)6
120

計算f(x) = Sin(x)在x = 0的5階泰勒展開式

In[2]: Series[f(x),{x, 0, 10}]


x3 x5 x7 x9 ( )
Out[2]: x − + − + + O x11
6 120 5040 362880

將上式中的第5項餘式省略

In[3]: Normal[%]
x3 x5 x7 x9
Out[3]: x − + − +
6 120 5040 362880

將Sin(x)及上式繪出

In[4]: Plot[{Sin[x],%},{x,0,2Pi}]

Out[4]:
3

1 2 3 4 5 6

-1
1.5 級數 14

將Sin(x)在x = 0的5階泰勒展開式中的第三項係數取出

In[4]: SeriesCoefficient[%3, 3]

1
Out[4]: −
6
分別將Sin(x)在x = 0的5階泰勒展開式中的各項係數取出
In[5]: Table[SeriesCoefficient[%3, k], {k, 1, 10}]
{ }
1 1 1 1
Out[5]: 1, 0, − , 0, , 0, − , 0, ,0
6 120 5040 362880

在泰勒展開式中我們是以線性函數來逼近原式。因此,隨著n的增加,泰勒展開式就可以更逼近原式。 在
以下範例我們將以不同的n來近似Sin(x)做說明。

範例 1-11.
分別產生Sin(x)的2, 4, 6, 8, 10, . . . , 20階泰勒展開式

In[1]: y=Table[Normal[Series[Sin[x],{x,0,i}]],{i,2,20,2}];

Out[1]:
將上式產生的各展開式與Sin(x)共同繪出

In[2]: Plot[Evaluate[{y,Sin[x]}], {x, 0, 2Pi},PlotRange->{-1.5,1.5},

PlotStyle->Table[Hue[k], {k, 0, 1, 0.05}],

Ticks->{Flatten[Table[{i},{i,0,2Pi,Pi/4}]],Automatic}]

Out[2]:
1.5

1.0

0.5

Π Π 3Π 5Π 3Π 7Π
Π 2Π
4 2 4 4 2 4
-0.5

-1.0

-1.5