第2章 複素数
2.1 はじめに
マクロ経済学の導入的なトピックとして1セクターの最適成長理論を学び,その後,多セクターモデルを学ばないというケースもあるかもしれない。1セクターモデルの典型的な成長経路は単調であり,補遺で詳しく説明するように,このようなケースで複素数を考える必要はない。しかし,応用上用いられるモデルの多くは複数のセクターと多数の内生変数によって構成されるため,1セクターモデルのように単純な成長経路を描かない可能性がある。例えば,ある1点の周りを回転しながらその点に接近するような経路を描くような動学経路を表現するには,実数を考えるだけでは難しい。経済モデルの動学を理解するには複素数の取扱いが必須なのである6。
この節は,経済学の学習の中で複素数に出会ったことのない人を対象とした入門的なトピックを扱っている。上記のような話を具体的なモデルの中で説明できる読者は読み飛ばしても構わない。あるいは,マクロ経済学が未修であって行列の標準化の理論に明るい読者は補遺まで読み飛ばしてもよい。
2.2 複素数
実数 (real number) の集合を \(\mathbb R\) と書く。\(\mathbb R\) に含まれない「数」を1つ追加し,四則演算を自由にできるようにしたものが複素数 (complex number) の集合 \(\mathbb C\) になる。
追加する数は虚数単位 (imaginary unit)と呼ばれる。これは \[ i^2 + 1 = 0 \] を成り立たせる \(i\) のことである。実際にはそのような \(i\) は複数ある (かもしれない) ので,そのうちの1つに \(i\) という名前をつける。実数の範囲にはこのような数は存在しないから,\(i\) の追加によって \(\mathbb R\) より大きい集合を考えることになる.7
いつも \(a + bi\) のように書くと読みにくいので,\(z \in \mathbb C\) に対して, \[ \mathrm{Re}~z = a,\qquad \mathrm{Im}~z = b \] のような書き方をする.
複素数同士の四則演算を次のように定義する.
定義 2.2 任意の \(a_1,a_2,b_1,b_2 \in \mathbb R\) に対して, \[ \begin{aligned} (a_1 + b_1 i) + (a_2 + b_2 i) &= (a_1 + a_2) + (b_1 + b_2) i \\ (a_1 + b_1 i) - (a_2 + b_2 i) &= (a_1 - a_2) + (b_1 - b_2) i \\ (a_1 + b_1 i) (a_2 + b_2 i) &= (a_1 a_2 - b_1 b_2) + (a_1 b_2 + a_2 b_1 ) i. \end{aligned} \]
\(a_2 \neq 0\) または \(b_2 \neq 0\) であれば,
\[ \begin{aligned} \frac{a_1 + b_1 i}{a_2 + b_2 i} = \left( \frac{a_1 a_2 + b_1 b_2}{a_2^2 + b_2^2} \right) + \left( \frac{- a_1 b_2 + a_2 b_1}{a_2^2 + b_2^2} \right) i. \end{aligned} \]
2.3 複素平面(imaginary plane)
1つの複素数は \((a, b)\) という実数のペアと同一視できるので,平面上の1点として複素数を表現できる。 図2.1 参照。
複素平面は動学の分析に重要な役割を果たすので自ら図を描いて手になじませておくとよい。
2.4 R コード
R では複素数を簡単に使うことができる。例えば次のように書くと,z
という名前の変数に \(5 + i\) という複素数を代入するという意味になる。コンソールで実行してみてほしい.
z = 5 + 1i
z
## [1] 5+1i
上のコードを次のように書き換えると正しく動くだろうか?何が起こるかを予想する。その後,Rコンソールで実行して予想した結果と比べる.
1
とi
の間にはスペースを入れる.1
を省略して5 + i
と書く.
実部
複素数を代入した変数をもっていれば,関数 Re()
によってその実部を取得できる。
Re(z)
## [1] 5
虚部
Im()
によって虚部を取得できる.
Im(z)
## [1] 1
四則演算
四則演算も通常の数と同じようにできる。
加算
w = 4 - 3i
z + w
## [1] 9-2i
減算
z - w
## [1] 1+4i
乗算
z * w
## [1] 23-11i
除算
z / w
## [1] 0.68+0.76i
実数との演算
実数と複素数の演算も自然に行うことができる。結果は常に複素数になる。
10 + z
## [1] 15+1i
注意
R はゼロで割ってもエラーにならない。
z / 0
## [1] Inf+Infi
z / (0 + 0i)
## [1] Inf+Infi
次の結果は複素数になるが
z * 0
## [1] 0+0i
次の結果は真値を返す。
z * 0 == 0
## [1] TRUE
複素平面上の図示
ggplot2 による作図の基本
base R の plot()
関数は複素数に対応しているが,残念ながら ggplot2
はそのようにはできていない。とは言え ggplot2
の方が強力なので,ggplot2
のイディオムを習得してほしい。
まず実部と虚部を分けてデータフレームに保存しておく。base R の data.frame()
ではなく tidyverse
パッケージ (tibble
パッケージ) の tibble()
を用いる。本書では tibble データフレーム(tbl_df)もデータフレームと呼ぶ。
points =
tibble(z = c(z, w, z / w)) %>%
mutate(Re = Re(z), Im = Im(z))
points
## # A tibble: 3 × 3
## z Re Im
## <cplx> <dbl> <dbl>
## 1 5.00+1.00i 5.00 1.00
## 2 4.00-3.00i 4.00 -3.00
## 3 0.68+0.76i 0.68 0.76
今作ったデータフレームの re
列を横軸に,im
列を縦軸にプロットすればよい。
ggplot(points) +
geom_point(aes(x = Re, y = Im, color = factor(z))) +
coord_fixed() + labs(color = "z") +
xlim(-5, 5) + ylim(-5, 5) # この行は装飾
べき乗
上の方法をもう少し進めてみよう。同じ複素数を繰り返し掛けるとどうなるだろうか。 \[ z_p = 0.5 + 0.5i \] として,\(z_p^n\) を計算する。ただし,\(z_p^n\) は \(z_p\) のべき乗で,実数と同様 \(z_p^0 = 1\),\(z_p^n = z_p z_p^{n-1}\),\(n > 1\) と定義する8。
zp = 0.5 + 0.5i
zn = tibble(Re = Re(1), Im = Im(1), n = 0)
for (i in 1:10) {
zn = zn %>% add_row(Re = Re(zp ^ i), Im = Im(zp ^ i), n = i)
}
ggplot(zn) + geom_point(aes(x = Re, y = Im, color = factor(n))) +
labs(color = "Power") + coord_fixed() +
xlim(-1.02, 1.02) + ylim(-1.02, 1.02)
\(1\) に \(0.5 + 0.5i\) を繰り返し掛けると次第に原点に近づいていくことが分かる。これは,実部・虚部ともに \(0.5\) という比較的小さな数字だから成り立ちそうな気がする。実数の場合,\(\lim_{n\to \infty} a^n = 0\) となるのは,\(-1 < a < 1\) の場合ということを思いだしてほしい。複素数の場合には,実部・虚部のそれぞれが\(1\) より小さい絶対値を持てば原点に収束するだろうか?
例えば次の例を考えてみよう。 \[ z_q = 0.9 + 0.9i \] はたして \(z_q^n\) は原点に収束するだろうか?
zq = 0.9 + 0.9i
zm = tibble(re = Re(1), im = Im(1), n = 0)
for (i in 1:10) {
zm = zm %>% add_row(re = Re(zq ^ i), im = Im(zq ^ i), n = i)
}
ggplot(zm) + geom_point(aes(x=re, y=im, color=factor(n))) +
coord_fixed() + xlim(-12, 12) + ylim(-12, 12)
上の図を見る限り,回転しながらどんどん原点から離れていっているようだ。原点への収束,原点からの乖離はどのような条件で特徴付けられるだろうか。
2.5 極形式
複素数のべき乗を計算するということは \(1\) に同じ複素数を繰り返し掛けることに外ならない。その結果として,上で描いた2つの図のように回転と拡大・縮小という現象を確認することができた。
複素数 \(z = a + bi\) を平面上の点 \((a, b)\) とみなせるというのが,複素平面を描いた際に念頭に置いていた事実であった。さらに平面上の点 \((a, b)\) は原点からの距離と 矢線ベクトル \((1, 0)\) を基準とした回転角で表せるということを思い出してほしい。つまり,ある \(0 \le \theta < 360^\circ\) が存在して次の等式が成立する. \[ \begin{aligned} a = \sqrt{a^2 + b^2} \cos \theta\\ b = \sqrt{a^2 + b^2} \sin \theta\\ \end{aligned} \]
\(r = \sqrt{a^2 + b^2}\ge 0\) を \(z = a + bi\) の絶対値 (absolute value)という。\(z\) の絶対値を \(|z|\) で表す。\(\theta\) を偏角 (argument) という (\(\mathrm{arg}(z)\) で表すこともある)。すべての複素数が \[ z = r(\cos\theta + i\sin\theta) \] という表現を持つ。この表現を複素数の極形式 (polar form)という。図2.2 参照。
を得る.9 絶対値が\(1\)でない場合にも,\(r_1, r_2 > 0\) として, \[ \begin{aligned} r_1(\cos\theta_1 + i\sin\theta_1)\cdot r_2(\cos\theta_2 + i\sin\theta_2) = r_1 r_2 \left[ \cos(\theta_1 + \theta_2) + i\sin(\theta_1 + \theta_2) \right] \end{aligned} \] つまり,複素数 \(r_2(\cos\theta_2 + i\sin\theta_2)\) を掛けるという操作は,絶対値を \(r_2\) 倍に伸縮し,偏角を \(+\theta_2\) だけ回転させる作用がある。
オイラーの公式
式(2.1) は複素数の積が偏角の和に相当することを述べている。この等式を眺めて指数関数との関連性に気がつく人もいるかもしれない。実際, \[\begin{align} e^{i\theta} = \cos\theta + i\sin\theta \tag{2.2} \end{align}\]と定義すれば,指数法則 \[ e^{i\theta_1} e^{i\theta_2} = e^{i(\theta_1 + \theta_2)} \]
によって,式(2.1) を「導出」できる。本来は,\(e^{i\theta}\) が意味するところをきちんと定義して,等式 (2.2) を証明する必要があるだろうが,ここでは記号として「オイラーの公式」を紹介した。関心のある読者は適当な複素関数論の教科書を読めばよい。
すべての複素数が \[\begin{equation} z = re^{i\theta}, \quad r \ge 0,\ 0^\circ \le \theta < 360^\circ \end{equation}\] という表現を持つということを知っていればよい。なお, この表現は次のようにして, \(\theta < 0^\circ\), \(\theta \ge 360^\circ\) に拡張することができる: 任意の \(\theta\) に対して, \(\theta = \theta_0 + n \times 360^\circ\) なる整数 \(n = 0, \pm 1, \pm 2, \dots\) がたった1つだけ存在する。\(e^{i360^\circ} = 1\) に注意すれば, \[\begin{equation} e^{i\theta} = e^{i\theta_0}\left(e^{i360^\circ}\right)^n = e^{i\theta_0} \end{equation}\]を得る。
べき乗
以上の準備の下で, \[ \begin{aligned} \lim_{n\to\infty} z_p^n = (0.5 + 0.5i)^n \to 0, \quad \text{and}\quad \lim_{n\to\infty} z_q^n = (0.9 + 0.9i)^n \not\to 0 \end{aligned} \] について説明することができる。
極形式による表現 \[ \begin{aligned} z_p = r_p e^{i\theta_p}\\ z_q = r_q e^{i\theta_q} \end{aligned} \] によれば, \[ \begin{aligned} r_p = \sqrt{0.5^2 + 0.5^2} \simeq 0.7071068 < 1\\ r_q = \sqrt{0.9^2 + 0.9^2} \simeq 1.2727922 > 1. \end{aligned} \] したがって, \[ \begin{aligned} |z_p^n| &= |r_p^n e^{i n\theta_p}| = r_p^n \to 0\\ |z_q^n| &= |r_q^n e^{i n\theta_q}| = r_q^n \to \infty \end{aligned} \] を得る。この観察をまとめておこう。
- \(|z| < 1\) ならば \(\lim_{n\to\infty} |z^n| = 0\),
- \(|z| > 1\) ならば \(\lim_{n\to\infty} |z^n| = \infty\),
- \(|z| = 1\) ならば 任意の \(n\) について \(|z^n| = 1\).
べき乗の収束性(安定性)は考えている複素数が複素平面上で原点を中心とする単位円(unit circle)の内側(単位円盤 unit disk の上)にあるかどうかで決まる。図2.3において,\(z_1\)のべきは発散し,\(z_2\)のべきは原点に収束する。
2.6 共役複素数
複素数 \(z = a + bi\) に対して, \(\bar z = a - bi\) を共役複素数 (complex conjugate)あるいは複素共役という。\(z\) は \(\bar z\) の共役複素数であるから, \[\begin{equation*} \bar{\bar z} = z \end{equation*}\]が成り立つ。(2.4)
R では, Conj()
で複素共役を, abs()
で複素数の絶対値を計算できる.
z
## [1] 5+1i
Conj(z)
## [1] 5-1i
abs(z)
## [1] 5.09902
先程の練習問題の性質は z * Conj(z)
と abs(z) ^ 2
の差が十分ゼロに近いことで確認できる。
z * Conj(z) - abs(z) ^ 2
## [1] 3.552714e-15+0i
e-15
というのは,10^{-15}
を意味しているので,大変小さい数字であることが分かるだろう。あるいは,次の様にすればよい.
all.equal(z * Conj(z), abs(z)^ 2 + 0i)
## [1] TRUE
計算機上の小数 (浮動小数点数) は実数を有限近似したものに過ぎないので等号で評価することはできない。有限の長さを持つように見えるありきたりな有理数でさえ,等号による評価はあてにならない。例えば次のような例がある.
sum = 0
for (i in 1:10) {
sum = sum + 0.1
}
sum == 1
## [1] FALSE
0.1 を 10回足しても 1 にはならない。小数の比較に ==
を用いてはいけない。
多項式方程式の解
後ほど明らかになるように,線形システムは固有多項式と呼ばれる実係数多項式を「因数分解」する問題を通じて分析される。あるいは, 本質的には同じことだが,実係数多項式方程式の解(根 root)を調べる10。いずれにせよ実係数多項式方程式が重要な役割を果たす。
多項式方程式は次のような性質を持つ。適当な代数学・複素関数論の本を参照のこと。複素係数の多項式方程式の解は必ず複素数に含まれる。 この性質をもって \(\mathbb C\) は代数的閉体であると言われる11。
実数係数多項式方程式が複素根をもつ時,その共役複素数もまた根である。
2.7 補遺:ラムゼーモデル
章の冒頭に1セクターモデルの話を書いたので,マクロ経済学を未修の読者のために補足をしておこう。 大学院初級のマクロ経済学を履修したことがあって,「複素数は出てこなかったし,これからも出会うことはない」と考えていた読者にもぜひ読んでほしい。
多くのマクロ経済モデルは最適成長モデル(optimal growth model)あるいはラムゼーモデル(Ramsey model)と呼ばれる基本モデルをベースに組み立てられている。 最適成長モデルは次のような無限ホライズンの最大化問題として記述される。
\[ \begin{aligned} & \max_k \sum_{t = 0}^\infty \beta^t u(k_t, k_{t + 1}) \\ & \begin{array}{ll} \text{subject to} & k_{t + 1} \in \Gamma(k_t), \ t = 0, 1, \dots \\ & k_0 > 0: \text{given} \end{array} \end{aligned} \]
登場する記号について少しずつ説明していこう。
標準的な成長理論の文脈では \(k_t\) は \(t\)-期の期初の資本(capital at the beginning of period \(t\)), \(k_{t + 1}\) は\(t\)-期の期末の 資本(capital at the end of period \(t + 1\)),これはすなわち\((t+1)\)-期の期初資本,と解釈される。 次期に残すことのできる資本 \(k_{t+1}\) は経済で利用可能な生産技術 \(\Gamma\) と今期利用可能な資本 \(k_t\) によって定まる。これが制約式\(k_{t + 1} \in \Gamma(k_t)\) の意味するところである。
標準的なマクロモデルでは,\(\Gamma\) は生産技術を表す関数 (生産関数, production function) \(f\) を使って \[ \Gamma(x) = [0, f(x)] \] と表される対応(correspondence)と考えることが多い12。 すなわち,\(0 \le k_{t + 1} \le f(k_t)\) が成り立たなければならないというのが制約条件の要請である。 生産関数 \(f\) は \(f(0) = 0\),\(f'(x) > 0\),\(f''(x) < 0\) などの性質を持つものと仮定される。1つ目の性質は, 生産には要素投入(factor input)が必須であることを表している。2つ目は,投入量が多ければ産出も多いことを意味している。 最後の性質は,限界生産性逓減(diminishing marginal productivity)と呼ばれる性質で, 要素投入1単位当たりの成果物が徐々に小さくなっていくことを意味している。 1日100枚皿を作れる職人を100人雇っても1日に10000枚の皿を作れるようにはならない。 コミュニケーションや利用できる土地などの制約によってどうしてもボトルネックが生じる。
1セクターモデルというのは,数学的には,\(k_t\),\(t = 0, 1, \dots\), が(非負の)実数であるようなモデルのことである。経済学の言葉を使うと,財は1種類のみ 存在している。資本を \(k_t\) だけ持っている経済において,\(f(k_t)\) の産出が得られる。 次期に残す資本として \(k_{t + 1}\) を確保しようとする。 簡単ではあるが,これで投資(investment)とか貯蓄(saving) と呼ばれる経済活動の一番簡単な定式化になっている。
さて,残った \(f(k_t) - k_{t+1}\) はどこに行っただろう。実は,1セクターモデルでは 経済主体がこれを食べてしまうと考える。機械や建物(生産要素)としても, さらには食事(最終財)にも使える財を1種類だけ生産し,最適な貯蓄と消費のバランスを 見つけるのが 1 セクターモデルの目標である。いかにも奇妙ではあるが, 長期的な経済成長に関する比較的良好な見通しを得ることができる。
\(t\)-期の消費(consumptions)を \(c_t = f(k_t) - k_{t + 1}\) と表そう。さらに,経済主体は消費のみから効用を 得ると仮定する。すなわち,資本が沢山あったとしてもそれ自体は効用を生まない。 もちろん,これも単純化のための仮定である。各期の消費から得られる効用の水準を効用関数(utility function),\(U(c_t\), で表せるとして, \[ U(c_t) = U(f(k_t) - k_{t + 1}) = u(k_t, k_{t + 1}) \] とできる。右辺のように書き直したものが \(u\) の正体である。\(u\) を既約型効用関数(reduced-form utility function)という13。
消費量は多ければ多いほうが幸せなので,\(U\) は単調増加である。ただし,1単位の 追加的な消費量に対して \(U(c)\) が増える程度,\(U'(c)\),は \(c\) の大きさに依存して変化するする。 典型的には \(c\) が大きければ大きいほど \(U(c)\) は増えにくくなるだろうから,\(U''(c) < 0\) と仮定するのが標準的である。これを限界効用逓減(diminishing marginal utility)という。
さて,我々が最大化したい対象は \(U(c_t)\) ではない。これを重み付き平均を取ったものである。 \(0< \beta < 1\) を割引因子(discount factor)という14。 重み \(\beta^t\) は \(t\) が大きくなるに連れてゼロに近づいていく。すなわち,将来の消費は 現在の消費と比べるとウェイトが低く重要ではないということを表現している。\(\beta\) が1に近いほど, 減少のスピードがゆっくりになるので,将来を比較的大切に考える経済主体のモデルとなる。
最適化のための必要条件は \[ u_2(k_{t-1}, k_t) + \beta u_1 (k_t, k_{t+1}) = 0 \] で与えられる。ただし,\(u_1 = \partial u/\partial k_t\), \(u_2 = \partial u/\partial k_{t+1}\)。 この動学方程式を不動点(steady state)\(k^*\) のまわりで線形化(linearize)すると,線形化方程式 \[ u_{21}^* \cdot (k_{t-1} - k^*) + (u_{22}^* + \beta u_{11}^*) \cdot (k_t - k^*) + \beta u_{12}^* \cdot (k_{t+1} - k^*) = 0 \] が得られる。ここでは\(u_{12}^* = \frac{\partial^2 u}{\partial k_t \partial k_{t+1}}(k^*, k^*)\) などと置いた。 この線形化方程式は \((k_t, k_{t+1}) = (k^*, k^*)\) の近傍の動学を近似する動学方程式である。 \(\hat k_t := k_t - k^*\) と置き,\(u_{12}^* \neq 0\) を仮定すると15,
\[ \hat k_{t+1} + \left(\frac{u_{22}^* + \beta u_{11}^*}{\beta u_{12}^*} \right) \hat k_t + \beta^{-1} \hat k_{t-1} = 0 \] このような漸化式(recurrence relation)あるいは差分方程式(difference equation)を解くには, 特性方程式(characteristic equation) \[\begin{equation} \lambda^2 + \left(\frac{u_{22}^* + \beta u_{11}^*}{\beta u_{12}^*} \right) \lambda + \beta^{-1} = 0 \tag{2.3} \end{equation}\]を解けばよいのであった。
次の定理は Levhari and Liviatan (1972) と Santos (1991) による結果の1セクター版である。
以上が 1セクターのラムゼーモデルで複素数に出会わない理由である。
参考文献
Levhari, David, and Nissan Liviatan. 1972. “On Stability in the Saddle-Point Sense.” Journal of Economic Theory 4: 88–93.
Santos, Manuel S. 1991. “Smoothness of the Policy Function in Discrete Time Economic Models.” Econometrica 59: 1365–82.
もちろんこれは経済変数が複素数値を取るということを意味しているのではない。実数パラメータのみで記述されるモデルに同等な変形を施して複素数値が現れる場合には,必ずその共役複素数が同時に現れ,虚数部分を打ち消すように作用する↩
2次関数 \(x \mapsto x^2\) のグラフを考えてみればよい.↩
(正の)実数と同様に非整数べきも定義できるが,この講義では使わない。↩
加法定理を使った.↩
解 (solution) という言葉は方程式 \(f(x)=0\) を成り立たせるすべての \(x\) の集合を指し,根(root)は \(f(x_0) = 0\) となる数 \(x_0\) のことを指して,区別することが多い。↩
その集合の元を係数とする多項式方程式の解がその集合に含まれる。 実係数方程式 \(x^2 + 1 =0\) は実数根を持たないので,実数は代数的閉体ではない。↩
対応というのは,集合を値に取る関数である。↩
\(U\) が単調増加であるということを暗黙裡に仮定している。↩
厳密な意味では重み付き「平均」ではないが適当な定数を掛ければそのように解釈できる。↩
\(u\) の2回連続微分可能性も仮定した。↩