漸化式と数列——前の項から次の項を作る
漸化式とは
「今日の体重が分かれば、明日の体重が予測できる」——食事制限中の人が毎日 kg ずつ減量している場合、今日の体重から明日の体重を計算するルールが立てられます。このように「前の項から次の項を作るルール」を数式で表したものが漸化式(ぜんかしき)です。
漸化式は数列の「製造ルール」です。初期値 を与えれば、あとは機械的に計算できます——「ルールを決めれば、あとは自動的に無限につながる」:
- (等差数列、)
- (等比数列、)
- (フィボナッチ数列)
- (ロジスティック写像、カオス!)
線形漸化式の解き方
等差型:
「毎回同じだけ増える・減る」——一般解:(等差数列)
等比型:
「毎回同じ比率で増える・減る」——一般解:(等比数列)
一般の線形型:()
「毎回 倍して を足す」——これを直接解くのは少し面倒なので、不動点(繰り返しても変わらない値)を利用して等比数列に帰着させます。
不動点 を から求めると ——「このまま繰り返しても変わらない値が不動点」。
変換 とすると:
これは公比 の等比数列!よって 、つまり——「不動点からのズレが等比的に変化する」:
コブウェブ図(クモの巣図)
「漸化式を繰り返したとき、ある値に落ち着くのか?それとも果てしなく離れていくのか?」——漸化式 の収束・発散を図示する方法としてコブウェブ図があります。
描き方:
- 曲線 と直線 を同じ平面に描く
- から垂直に まで上がる
- 水平に まで動く(これで になる)
- 以降繰り返す
と の交点が不動点(繰り返しが収束する点)です——「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(); 不動点と安定性
「繰り返しを続けると、ある値に近づいて落ち着くのか(安定)、それとも遠ざかっていくのか(不安定)」——不動点 ()の周辺の振る舞いは によって決まります。「不動点の近くでグラフがどれだけ急か」が収束・発散を決める:
| 不動点の性質 | |
|---|---|
| 安定(収束):コブウェブが内側に巻き込む | |
| 中立(どちらとも言えない) | |
| 不安定(発散):コブウェブが外側に広がる |
先ほどのデモでは なので、どの初期値からも不動点 に収束します——「傾きが 1 より小さければ、どこから始めても同じ点に吸い込まれる」。
ロジスティック写像
「人口が増えすぎると食料が足りなくなる」——食料の限りある島に生き物を放したとき、個体数の増加には自然にブレーキがかかります。これを表したのがロジスティック写像です:
()
が大きくなると、収束→周期2→周期4→カオスという複雑な振る舞いを見せます——「たった一つの単純なルールが、複雑怪奇な挙動を生む」。これは気象予測などの複雑系の基本モデルです。
| の範囲 | 振る舞い |
|---|---|
| 不動点に収束 | |
| 周期2・4・8… | |
| カオス |
練習問題
問題1
漸化式 、 の一般項を求めよ。
不動点:。
とすると 、。
よって 、(すべての項が )——「初期値がちょうど不動点に乗っていたので、ずっとそこに留まる」。
問題2
、 の一般項を求めよ。
、、。
よって ——「不動点から少しでもずれると、指数的に離れていく(不安定)」。
まとめ
- 漸化式: のように前の項から次の項を定義する——「ルールが分かれば全部計算できる」
- 線形漸化式 は不動点 を使って等比数列に帰着できる——「不動点からのズレに注目する」
- コブウェブ図: と の間を行き来する図で収束・発散を可視化——「折れ線が不動点に巻き込まれるか外に逃げるかで安定性が見える」
- 不動点の安定性は の大小で判断できる——「傾きが 1 より小さければ安定」
次回は数学的帰納法——漸化式や数列の公式を厳密に証明する強力な方法を学びます。