#01 ふれてみよう高校数学 解析(微分・積分・極限)

極限の概念——無限に近づくとは

極限とは何か

想像してみてください——「半分に切る」を繰り返すゲームをするとします。1メートルのひもを半分に切り、また半分に切り……。ひもの長さは 12,14,18,\frac{1}{2}, \frac{1}{4}, \frac{1}{8}, \ldots と小さくなっていきます。「永遠に切り続けたらどうなる?」——ひもの長さは 0 に限りなく近づくけれど、永遠にゼロにはなりません。

これが極限の考え方の出発点です。

高校数学の「解析」の出発点は極限(limit)の概念です。

xxaa に限りなく近づくとき、f(x)f(x) はどんな値に近づくか」——これを

limxaf(x)=L\lim_{x \to a} f(x) = L

と書きます。ここで重要なのは、「x=ax = a での値」ではなく、「xxaa近づけていく過程」を見ているということです。「ゴールに着いたときの値」ではなく「ゴールに向かう途中でどこへ向かっているか」を調べるのが極限です。


定義から考える:(x21)/(x1)(x^2 - 1)/(x - 1)

次の関数を考えてみましょう。

f(x)=x21x1f(x) = \frac{x^2 - 1}{x - 1}

x=1x = 1 を代入すると分母が 00 になってしまい、f(1)f(1) は定義されません(00\frac{0}{0} は数学的に無意味です)。

しかし、ちょっと待ってください。分子を因数分解すると:

x21x1=(x+1)(x1)x1=x+1(x1)\frac{x^2 - 1}{x - 1} = \frac{(x+1)(x-1)}{x-1} = x + 1 \quad (x \neq 1)

x=1x = 1 以外なら、この式は x+1x + 1 にすっきりと化けます。だから xx を 1 に近づけていくと:

limx1x21x1=limx1(x+1)=2\lim_{x \to 1} \frac{x^2 - 1}{x - 1} = \lim_{x \to 1}(x + 1) = 2

x=1x = 1 では定義されていないのに、極限値は 22 として存在します。「x=1x = 1 にはなれないが、限りなく近づくと 22 に向かう」——これが極限の醍醐味です。


デモ 1:両側から x=1x = 1 に近づける

下のデモでは y=x21x1y = \dfrac{x^2-1}{x-1} のグラフを描いています。マウスを左右に動かして xx の位置を変えると、左側・右側どちらから近づけても関数値が (1, 2)(1,\ 2) に向かっていく様子が確認できます。x=1x = 1 の点は「穴あき(open circle)」になっています——ここだけ「値がない」のです。

y = (x²−1)/(x−1) のグラフ。マウスで x を動かして極限を確認。
function loop() {
ctx.clearRect(0, 0, W, H);
var scale = 60;
var ox = W/2, oy = H/2;

function toSx(x){ return ox + x*scale; }
function toSy(y){ return oy - y*scale; }

function drawAxes(){
  ctx.strokeStyle='rgba(255,255,255,0.15)';
  ctx.lineWidth=1;
  ctx.beginPath(); ctx.moveTo(0,oy); ctx.lineTo(W,oy); ctx.stroke();
  ctx.beginPath(); ctx.moveTo(ox,0); ctx.lineTo(ox,H); ctx.stroke();
  ctx.fillStyle='rgba(255,255,255,0.3)';
  ctx.font='11px monospace';
  ctx.textAlign='center';
  for(var i=-4;i<=4;i++){
    if(i===0) continue;
    ctx.fillText(i, toSx(i), oy+14);
  }
  ctx.textAlign='right';
  for(var j=-2;j<=4;j++){
    if(j===0) continue;
    ctx.fillText(j, ox-6, toSy(j)+4);
  }
}

function plotCurve(f, color, lw){
  ctx.strokeStyle=color; ctx.lineWidth=lw||2;
  ctx.beginPath();
  var first=true;
  for(var xi=-W/2; xi<=W/2; xi+=1){
    var x=xi/scale;
    var y=f(x);
    if(!isFinite(y)||Math.abs(y)>H/scale){first=true;continue;}
    if(first){ctx.moveTo(toSx(x),toSy(y));first=false;}
    else ctx.lineTo(toSx(x),toSy(y));
  }
  ctx.stroke();
}

ctx.fillStyle='#0d1117';
ctx.fillRect(0,0,W,H);
drawAxes();

// f(x) = (x^2-1)/(x-1) = x+1 for x≠1
// Plot x+1 but skip x=1
plotCurve(function(x){
  if(Math.abs(x-1)<0.05) return NaN;
  return x+1;
}, '#4fc3f7', 2);

// open circle at (1,2)
ctx.beginPath();
ctx.arc(toSx(1),toSy(2),5,0,Math.PI*2);
ctx.strokeStyle='#4fc3f7';
ctx.lineWidth=2;
ctx.stroke();
ctx.fillStyle='#0d1117';
ctx.fill();

// mouse x position
var xm = (mx - ox)/scale;
var xClamped = Math.max(-3.8, Math.min(3.8, xm));
if(Math.abs(xClamped-1)>0.05){
  var ym = xClamped+1;
  // vertical dashed line
  ctx.setLineDash([4,4]);
  ctx.strokeStyle='rgba(255,200,50,0.5)';
  ctx.lineWidth=1;
  ctx.beginPath(); ctx.moveTo(toSx(xClamped),oy); ctx.lineTo(toSx(xClamped),toSy(ym)); ctx.stroke();
  ctx.beginPath(); ctx.moveTo(toSx(xClamped),toSy(ym)); ctx.lineTo(ox,toSy(ym)); ctx.stroke();
  ctx.setLineDash([]);
  // dot on curve
  ctx.beginPath();
  ctx.arc(toSx(xClamped),toSy(ym),5,0,Math.PI*2);
  ctx.fillStyle='#ffca28';
  ctx.fill();
  // labels
  ctx.fillStyle='#ffca28';
  ctx.font='13px monospace';
  ctx.textAlign='left';
  ctx.fillText('x = '+xClamped.toFixed(3), 12, 24);
  ctx.fillText('f(x) = '+(ym).toFixed(3), 12, 42);
  // arrow label
  ctx.fillStyle='rgba(255,255,255,0.6)';
  ctx.font='12px sans-serif';
  ctx.fillText('→ 極限値 2 に近づく', 12, 64);
}

// label
ctx.fillStyle='rgba(255,255,255,0.7)';
ctx.font='13px sans-serif';
ctx.textAlign='center';
ctx.fillText('y = (x²−1)/(x−1)', W/2, H-10);

requestAnimationFrame(loop);
}
loop();

左極限と右極限

極限を厳密に定義するとき、左極限xx を左から近づける)と右極限(右から近づける)の両方が一致する必要があります:

limxaf(x)=limxa+f(x)=L    limxaf(x)=L\lim_{x \to a^-} f(x) = \lim_{x \to a^+} f(x) = L \implies \lim_{x \to a} f(x) = L

どちらか一方でも一致しない場合、極限は存在しません。

たとえば「右から近づけると2に近づくが、左から近づけると別の値に向かう」なら、その点での極限は存在しないということです(次回の連続性で詳しく扱います)。


数列の極限:1n0\frac{1}{n} \to 0

関数の極限と並んで重要なのが数列の極限です。

冒頭のひもの例を思い出してください。長さは 12,14,18,\frac{1}{2}, \frac{1}{4}, \frac{1}{8}, \ldots と続きます。もっと一般的に 1n\frac{1}{n} を考えると:

数列 {an}\{a_n\}nn \to \infty のとき LL に収束するとは:

limnan=L\lim_{n \to \infty} a_n = L

典型例として an=1na_n = \dfrac{1}{n} を考えると、nn が大きくなるにつれて ana_n00 に限りなく近づきます:

limn1n=0\lim_{n \to \infty} \frac{1}{n} = 0

n=100n = 100 のとき 1100=0.01\frac{1}{100} = 0.01」「n=1000n = 1000 のとき 11000=0.001\frac{1}{1000} = 0.001」——どんどん0に近づきますが、永遠に0にはなりません。


デモ 2:1/n1/n の数列が 00 に収束する様子

数列 aₙ = 1/n の収束。n が大きくなるほど 0 に近づく。
function loop() {
ctx.clearRect(0, 0, W, H);
ctx.fillStyle='#0d1117';
ctx.fillRect(0,0,W,H);

var pad=50;
var plotW=W-pad*2;
var plotH=H-pad*2;
var nMax=30;

// axes
ctx.strokeStyle='rgba(255,255,255,0.2)';
ctx.lineWidth=1;
ctx.beginPath(); ctx.moveTo(pad,pad); ctx.lineTo(pad,pad+plotH); ctx.lineTo(pad+plotW,pad+plotH); ctx.stroke();

// y=0 line label
ctx.fillStyle='rgba(100,220,100,0.8)';
ctx.font='12px monospace';
ctx.textAlign='right';
ctx.fillText('0', pad-6, pad+plotH+4);
ctx.fillText('1', pad-6, pad+4);

ctx.textAlign='center';
ctx.fillStyle='rgba(255,255,255,0.4)';
ctx.fillText('n', pad+plotW, pad+plotH+18);

// y=0 dashed line
ctx.setLineDash([5,5]);
ctx.strokeStyle='rgba(100,220,100,0.3)';
ctx.beginPath(); ctx.moveTo(pad,pad+plotH); ctx.lineTo(pad+plotW,pad+plotH); ctx.stroke();
ctx.setLineDash([]);

// hover n from mouse
var hoverN = Math.round(1+(mx/W)*(nMax-1));
hoverN = Math.max(1,Math.min(nMax,hoverN));

for(var n=1;n<=nMax;n++){
  var an = 1/n;
  var sx = pad + (n-1)/(nMax-1)*plotW;
  var sy = pad + plotH - an*plotH;
  var isHover = (n===hoverN);
  ctx.beginPath();
  ctx.arc(sx,sy,isHover?7:4,0,Math.PI*2);
  var t=n/nMax; // 0→1
  var r=Math.round(79+(1-t)*176);
  var g=Math.round(195-(1-t)*80);
  ctx.fillStyle=isHover?'#ffca28':('rgb('+r+','+g+',220)');
  ctx.fill();

  // n labels for some
  if(n<=6||n===10||n===20||n===30||isHover){
    ctx.fillStyle=isHover?'#ffca28':'rgba(255,255,255,0.5)';
    ctx.font=isHover?'bold 12px monospace':'10px monospace';
    ctx.textAlign='center';
    ctx.fillText(n, sx, pad+plotH+16);
  }
}

// show hovered point value
var anH=1/hoverN;
var sxH=pad+(hoverN-1)/(nMax-1)*plotW;
var syH=pad+plotH-anH*plotH;
ctx.setLineDash([3,3]);
ctx.strokeStyle='rgba(255,202,40,0.4)';
ctx.lineWidth=1;
ctx.beginPath(); ctx.moveTo(sxH,syH); ctx.lineTo(sxH,pad+plotH); ctx.stroke();
ctx.setLineDash([]);
ctx.fillStyle='#ffca28';
ctx.font='13px monospace';
ctx.textAlign='left';
var infoX = sxH+10; if(infoX>W-160) infoX=sxH-150;
ctx.fillText('n = '+hoverN, infoX, syH-14);
ctx.fillText('1/n = '+anH.toFixed(4), infoX, syH+4);

ctx.fillStyle='rgba(255,255,255,0.6)';
ctx.font='14px sans-serif';
ctx.textAlign='center';
ctx.fillText('aₙ = 1/n → 0  (n→∞)', W/2, 22);

requestAnimationFrame(loop);
}
loop();

極限の基本性質

極限は「足し算・引き算・掛け算・割り算」の法則が使えます。複雑な関数の極限も、部品ごとに分解して計算できます。

limxa[f(x)±g(x)]=limxaf(x)±limxag(x)\lim_{x \to a}\bigl[f(x) \pm g(x)\bigr] = \lim_{x \to a}f(x) \pm \lim_{x \to a}g(x) limxa[f(x)g(x)]=limxaf(x)limxag(x)\lim_{x \to a}\bigl[f(x) \cdot g(x)\bigr] = \lim_{x \to a}f(x) \cdot \lim_{x \to a}g(x) limxaf(x)g(x)=limxaf(x)limxag(x)(limxag(x)0)\lim_{x \to a}\frac{f(x)}{g(x)} = \frac{\lim_{x \to a}f(x)}{\lim_{x \to a}g(x)} \quad \left(\lim_{x \to a}g(x) \neq 0\right)

はさみうちの原理

g(x)f(x)h(x)g(x) \leq f(x) \leq h(x) かつ limxag(x)=limxah(x)=L\lim_{x\to a}g(x) = \lim_{x\to a}h(x) = L ならば:

limxaf(x)=L\lim_{x \to a} f(x) = L

これをはさみうちの原理(Squeeze Theorem)といいます。直接計算しにくい場合に、「上と下からはさむ」戦略です。

たとえば砂時計の砂をイメージしてください。上の瓶と下の瓶の砂の量が同じになる瞬間、間にある砂も同じ量になる——「挟まれているものは、両側が同じ値に近づけば同じ値になる」という発想です。

limx0x2sin ⁣1x=0(x2x2sin1xx2 より)\lim_{x \to 0} x^2 \sin\!\frac{1}{x} = 0 \quad \left(-x^2 \leq x^2\sin\frac{1}{x} \leq x^2 \text{ より}\right)

まとめ

  • 極限は「xx を近づけていく過程」で関数値が向かう先の値——「ゴールの値」ではなく「向かっている方向」
  • x=ax = a で定義されなくても、極限値は存在しうる(穴あきグラフがその例)
  • 左極限と右極限が一致するとき、極限が存在する
  • 数列 1/n1/n のように nn \to \infty の極限も同様の考え方で扱える
  • 足し算・掛け算の法則が使え、「はさみうち」という強力な武器もある

次回は関数の連続性——極限値と関数値が一致する場合と、しない場合を詳しく見ていきます。