#04 ふれてみよう高校数学 離散数学・数論

漸化式と数列——前の項から次の項を作る

漸化式とは

「今日の体重が分かれば、明日の体重が予測できる」——食事制限中の人が毎日 dd kg ずつ減量している場合、今日の体重から明日の体重を計算するルールが立てられます。このように「前の項から次の項を作るルール」を数式で表したものが漸化式(ぜんかしき)です。

an+1=f(an)a_{n+1} = f(a_n)

漸化式は数列の「製造ルール」です。初期値 a1a_1 を与えれば、あとは機械的に計算できます——「ルールを決めれば、あとは自動的に無限につながる」:

  • an+1=an+3a_{n+1} = a_n + 3(等差数列、d=3d = 3
  • an+1=2ana_{n+1} = 2a_n(等比数列、r=2r = 2
  • an+1=an+an1a_{n+1} = a_n + a_{n-1}(フィボナッチ数列)
  • an+1=ran(1an)a_{n+1} = r \cdot a_n(1 - a_n)(ロジスティック写像、カオス!)

線形漸化式の解き方

等差型:an+1=an+da_{n+1} = a_n + d

「毎回同じだけ増える・減る」——一般解:an=a1+(n1)da_n = a_1 + (n-1)d(等差数列)

等比型:an+1=rana_{n+1} = r \cdot a_n

「毎回同じ比率で増える・減る」——一般解:an=a1rn1a_n = a_1 \cdot r^{n-1}(等比数列)

一般の線形型:an+1=pan+qa_{n+1} = p \cdot a_n + qp1p \neq 1

「毎回 pp 倍して qq を足す」——これを直接解くのは少し面倒なので、不動点(繰り返しても変わらない値)を利用して等比数列に帰着させます。

不動点 α\alphaα=pα+q\alpha = p\alpha + q から求めると α=q/(1p)\alpha = q/(1-p)——「このまま繰り返しても変わらない値が不動点」。

変換 bn=anαb_n = a_n - \alpha とすると:

bn+1=an+1α=pan+qα=p(bn+α)+qα=pbnb_{n+1} = a_{n+1} - \alpha = p a_n + q - \alpha = p(b_n + \alpha) + q - \alpha = p b_n

これは公比 pp の等比数列!よって bn=b1pn1b_n = b_1 p^{n-1}、つまり——「不動点からのズレが等比的に変化する」:

an=α+(a1α)pn1a_n = \alpha + (a_1 - \alpha)p^{n-1}


コブウェブ図(クモの巣図)

「漸化式を繰り返したとき、ある値に落ち着くのか?それとも果てしなく離れていくのか?」——漸化式 an+1=f(an)a_{n+1} = f(a_n) の収束・発散を図示する方法としてコブウェブ図があります。

描き方:

  1. 曲線 y=f(x)y = f(x) と直線 y=xy = x を同じ平面に描く
  2. x=a1x = a_1 から垂直に y=f(a1)=a2y = f(a_1) = a_2 まで上がる
  3. 水平に y=xy = x まで動く(これで x=a2x = a_2 になる)
  4. 以降繰り返す

y=f(x)y = f(x)y=xy = x の交点が不動点(繰り返しが収束する点)です——「2つのグラフが交わる点に、クモの巣が引き寄せられていく」。

マウスを左右に動かして初期値 a1a_1 を変えてみましょう。

コブウェブ図:漸化式 aₙ₊₁ = 0.6aₙ + 2 の収束の様子(マウスで初期値を変更)。赤い折れ線がクモの巣のように不動点(黄点)へ引き寄せられていく。初期値が変わっても必ず同じ点に収束することに注目。
var p, q, alpha, a0, ox, oy, scaleX, scaleY, steps;

function f(x) { return p * x + q; }

function loop() {
ctx.clearRect(0, 0, W, H);

p = 0.6;
q = 2.0;
alpha = q / (1 - p);  // fixed point = 5

a0 = 0.5 + (mx / W) * 9.5;
steps = 20;

ox = 50;
oy = 330;
scaleX = (W - 70) / 11;
scaleY = (oy - 30) / 11;

// axes
ctx.strokeStyle = '#334155';
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(ox, 20);
ctx.lineTo(ox, oy + 10);
ctx.moveTo(ox - 10, oy);
ctx.lineTo(W - 10, oy);
ctx.stroke();

// y = x line
ctx.strokeStyle = '#94a3b8';
ctx.lineWidth = 1;
ctx.setLineDash([4, 4]);
ctx.beginPath();
ctx.moveTo(ox, oy);
ctx.lineTo(ox + 10 * scaleX, oy - 10 * scaleY);
ctx.stroke();
ctx.setLineDash([]);

// y = f(x) = 0.6x + 2
ctx.strokeStyle = '#60a5fa';
ctx.lineWidth = 2;
ctx.beginPath();
for (var xi = 0; xi <= 10; xi += 0.1) {
  var yi = f(xi);
  var px = ox + xi * scaleX;
  var py = oy - yi * scaleY;
  if (xi === 0) ctx.moveTo(px, py); else ctx.lineTo(px, py);
}
ctx.stroke();

// fixed point
ctx.fillStyle = '#fbbf24';
ctx.beginPath();
ctx.arc(ox + alpha * scaleX, oy - alpha * scaleY, 5, 0, Math.PI * 2);
ctx.fill();

// cobweb
var x = a0;
ctx.strokeStyle = '#f87171';
ctx.lineWidth = 1.5;
ctx.beginPath();
ctx.moveTo(ox + x * scaleX, oy);
for (var s = 0; s < steps; s++) {
  var y = f(x);
  // vertical line to curve
  ctx.lineTo(ox + x * scaleX, oy - y * scaleY);
  // horizontal line to y=x
  ctx.lineTo(ox + y * scaleX, oy - y * scaleY);
  x = y;
  if (x < 0 || x > 11) break;
}
ctx.stroke();

// labels
ctx.fillStyle = '#e2e8f0';
ctx.font = '13px monospace';
ctx.textAlign = 'left';
ctx.fillText('f(x) = ' + p + 'x + ' + q, 60, 22);
ctx.fillText('不動点 α = ' + alpha.toFixed(1), 60, 40);
ctx.fillStyle = '#f87171';
ctx.fillText('初期値 a₁ = ' + a0.toFixed(2), 60, 58);
ctx.fillStyle = '#fbbf24';
ctx.fillText('収束先: ' + x.toFixed(3), 60, 76);

// axis ticks
ctx.fillStyle = '#64748b';
ctx.font = '10px monospace';
ctx.textAlign = 'center';
for (var t = 0; t <= 10; t += 2) {
  ctx.fillText(t, ox + t * scaleX, oy + 16);
  if (t > 0) { ctx.fillText(t, ox - 20, oy - t * scaleY + 4); }
}

requestAnimationFrame(loop);
}
loop();

不動点と安定性

「繰り返しを続けると、ある値に近づいて落ち着くのか(安定)、それとも遠ざかっていくのか(不安定)」——不動点 α\alphaf(α)=αf(\alpha) = \alpha)の周辺の振る舞いは f(α)f'(\alpha) によって決まります。「不動点の近くでグラフがどれだけ急か」が収束・発散を決める:

f(α)\lvert f'(\alpha) \rvert不動点の性質
<1< 1安定(収束):コブウェブが内側に巻き込む
=1= 1中立(どちらとも言えない)
>1> 1不安定(発散):コブウェブが外側に広がる

先ほどのデモでは f(x)=p=0.6<1f'(x) = p = 0.6 < 1 なので、どの初期値からも不動点 α=5\alpha = 5 に収束します——「傾きが 1 より小さければ、どこから始めても同じ点に吸い込まれる」。


ロジスティック写像

「人口が増えすぎると食料が足りなくなる」——食料の限りある島に生き物を放したとき、個体数の増加には自然にブレーキがかかります。これを表したのがロジスティック写像です:

an+1=ran(1an)a_{n+1} = r \cdot a_n(1 - a_n)0a010 \le a_0 \le 1

rr が大きくなると、収束→周期2→周期4→カオスという複雑な振る舞いを見せます——「たった一つの単純なルールが、複雑怪奇な挙動を生む」。これは気象予測などの複雑系の基本モデルです。

rr の範囲振る舞い
0<r10 < r \le 1an0a_n \to 0
1<r31 < r \le 3不動点に収束
3<r3.573 < r \le 3.57周期2・4・8…
r>3.57r > 3.57カオス

練習問題

問題1

漸化式 an+1=3an4a_{n+1} = 3a_n - 4a1=2a_1 = 2 の一般項を求めよ。

不動点:α=3α4α=2\alpha = 3\alpha - 4 \Rightarrow \alpha = 2

bn=an2b_n = a_n - 2 とすると bn+1=3bnb_{n+1} = 3b_nb1=0b_1 = 0

よって bn=0b_n = 0an=2a_n = 2(すべての項が 22)——「初期値がちょうど不動点に乗っていたので、ずっとそこに留まる」。

問題2

an+1=3an4a_{n+1} = 3a_n - 4a1=3a_1 = 3 の一般項を求めよ。

bn=an2b_n = a_n - 2b1=1b_1 = 1bn=3n1b_n = 3^{n-1}

よって an=2+3n1a_n = 2 + 3^{n-1}——「不動点から少しでもずれると、指数的に離れていく(不安定)」。


まとめ

  • 漸化式an+1=f(an)a_{n+1} = f(a_n) のように前の項から次の項を定義する——「ルールが分かれば全部計算できる」
  • 線形漸化式 an+1=pan+qa_{n+1} = pa_n + q は不動点 α\alpha を使って等比数列に帰着できる——「不動点からのズレに注目する」
  • コブウェブ図y=f(x)y = f(x)y=xy = x の間を行き来する図で収束・発散を可視化——「折れ線が不動点に巻き込まれるか外に逃げるかで安定性が見える」
  • 不動点の安定性は f(α)\lvert f'(\alpha) \rvert の大小で判断できる——「傾きが 1 より小さければ安定」

次回は数学的帰納法——漸化式や数列の公式を厳密に証明する強力な方法を学びます。