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

面積・体積への応用

2 曲線に挟まれた面積

「2 本の曲線の間に挟まれた隙間の広さを求める」——上の曲線から下の曲線を引いた差を積分するだけです。

2 つの関数 f(x)g(x)f(x) \geq g(x)[a,b][a, b] で成立するとき、2 曲線に挟まれた面積は:

S=ab[f(x)g(x)]dxS = \int_a^b [f(x) - g(x)]\,dx

例:y=xy = xy=x2y = x^2 の間の面積

「直線 y=xy=x と放物線 y=x2y=x^2 が囲む部分の面積」——まず 2 曲線がどこで交わるか(交点)を調べます:

まず交点を求めます:x=x2x(x1)=0x=0,1x = x^2 \Rightarrow x(x-1) = 0 \Rightarrow x = 0,\, 1

[0,1][0, 1] では xx2x \geq x^2 なので——「直線が放物線の上側にある」:

S=01(xx2)dx=[x22x33]01=1213=16S = \int_0^1 (x - x^2)\,dx = \left[\frac{x^2}{2} - \frac{x^3}{3}\right]_0^1 = \frac{1}{2} - \frac{1}{3} = \frac{1}{6}

デモ:y=xy = xy=x2y = x^2 の間の面積

2曲線の交点 x=0x = 0x=1x = 1 の間に挟まれた領域を色付けしています。マウスを左右に動かして「積分の上限」を変化させると、部分面積がリアルタイムに表示されます。

y=x(オレンジ)と y=x²(青)の間の面積。マウスで上限を変化。
function loop() {
ctx.clearRect(0, 0, W, H);
var scale=200;
var ox=60, oy=H-40;

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

function drawAxes(){
  ctx.strokeStyle='rgba(255,255,255,0.18)';
  ctx.lineWidth=1;
  ctx.beginPath();ctx.moveTo(ox,0);ctx.lineTo(ox,H);ctx.stroke();
  ctx.beginPath();ctx.moveTo(0,oy);ctx.lineTo(W,oy);ctx.stroke();
  ctx.fillStyle='rgba(255,255,255,0.35)';
  ctx.font='11px monospace';
  ctx.textAlign='center';
  ctx.fillText('0',ox,oy+15);
  ctx.fillText('0.5',toSx(0.5),oy+15);
  ctx.fillText('1',toSx(1),oy+15);
  ctx.textAlign='right';
  ctx.fillText('0.5',ox-5,toSy(0.5)+4);
  ctx.fillText('1',ox-5,toSy(1)+4);
}

var f1=function(x){return x;};       // y = x  (upper)
var f2=function(x){return x*x;};     // y = x² (lower)

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

// Mouse upper limit 0..1
var xUpper=(mx-ox)/scale;
xUpper=Math.max(0,Math.min(1,xUpper));

// Shade filled area between curves from 0 to xUpper
if(xUpper>0){
  ctx.beginPath();
  ctx.moveTo(toSx(0),oy);
  // upper path: f1 from 0 to xUpper
  for(var xi=0;xi<=xUpper*scale;xi+=1){
    var x=xi/scale;
    ctx.lineTo(toSx(x),toSy(f1(x)));
  }
  // come back along f2
  for(var xi2=xUpper*scale;xi2>=0;xi2-=1){
    var x2=xi2/scale;
    ctx.lineTo(toSx(x2),toSy(f2(x2)));
  }
  ctx.closePath();
  ctx.fillStyle='rgba(129,199,132,0.3)';
  ctx.fill();
  ctx.strokeStyle='rgba(129,199,132,0.5)';
  ctx.lineWidth=1;
  ctx.stroke();
}

// Remaining area (xUpper to 1) if xUpper < 1
if(xUpper<1){
  ctx.beginPath();
  ctx.moveTo(toSx(xUpper),toSy(f2(xUpper)));
  for(var xi3=xUpper*scale;xi3<=scale;xi3+=1){
    var x3=xi3/scale;
    ctx.lineTo(toSx(x3),toSy(f2(x3)));
  }
  for(var xi4=scale;xi4>=xUpper*scale;xi4-=1){
    var x4=xi4/scale;
    ctx.lineTo(toSx(x4),toSy(f1(x4)));
  }
  ctx.closePath();
  ctx.fillStyle='rgba(79,195,247,0.08)';
  ctx.fill();
}

// Draw curves
ctx.strokeStyle='#ff8a65';ctx.lineWidth=2.5;
ctx.beginPath();
var first=true;
for(var xi5=0;xi5<=scale;xi5+=1){
  var x5=xi5/scale;
  if(first){ctx.moveTo(toSx(x5),toSy(f1(x5)));first=false;}
  else ctx.lineTo(toSx(x5),toSy(f1(x5)));
}
ctx.stroke();

ctx.strokeStyle='#4fc3f7';ctx.lineWidth=2.5;
ctx.beginPath();first=true;
for(var xi6=0;xi6<=scale;xi6+=1){
  var x6=xi6/scale;
  if(first){ctx.moveTo(toSx(x6),toSy(f2(x6)));first=false;}
  else ctx.lineTo(toSx(x6),toSy(f2(x6)));
}
ctx.stroke();

// Intersection markers
ctx.beginPath();ctx.arc(toSx(0),toSy(0),6,0,Math.PI*2);
ctx.fillStyle='#fff';ctx.fill();
ctx.beginPath();ctx.arc(toSx(1),toSy(1),6,0,Math.PI*2);
ctx.fillStyle='#fff';ctx.fill();

// Vertical marker at xUpper
if(xUpper>0 && xUpper<1){
  ctx.setLineDash([4,4]);
  ctx.strokeStyle='rgba(255,202,40,0.6)';
  ctx.lineWidth=1;
  ctx.beginPath();ctx.moveTo(toSx(xUpper),toSy(f1(xUpper)));ctx.lineTo(toSx(xUpper),toSy(f2(xUpper)));ctx.stroke();
  ctx.setLineDash([]);
}

// Area value
var area=xUpper*xUpper/2-xUpper*xUpper*xUpper/3;
var totalArea=1/6;

// Info panel
ctx.fillStyle='rgba(0,0,0,0.7)';
ctx.fillRect(W-230,8,222,88);
ctx.font='13px monospace';ctx.textAlign='left';
ctx.fillStyle='#ff8a65';
ctx.fillText('y = x',W-224,28);
ctx.fillStyle='#4fc3f7';
ctx.fillText('y = x²',W-224,46);
ctx.fillStyle='#81c784';
ctx.fillText('面積(0→'+xUpper.toFixed(2)+') = '+area.toFixed(4),W-224,64);
ctx.fillStyle='#ffca28';
ctx.fillText('全面積 = 1/6 ≈ '+totalArea.toFixed(4),W-224,82);

ctx.fillStyle='rgba(255,255,255,0.5)';
ctx.font='12px sans-serif';ctx.textAlign='center';
ctx.fillText('S = ∫₀¹(x−x²)dx = 1/6',W/2,H-12);

requestAnimationFrame(loop);
}
loop();

回転体の体積

「フィギュアスケートの選手がスピンするとき体が描く立体形状」——曲線を軸の周りに回転させると立体ができます。その体積を円盤法(Disk Method)で求めます:

曲線 y=f(x)y = f(x)xx 軸の周りに回転させてできる立体の体積:

V=πab[f(x)]2dxV = \pi \int_a^b [f(x)]^2\,dx

各点 xx での断面が半径 f(x)f(x)円盤(disk)になるため、この名前があります——「薄い円盤を積み上げた体積の合計」です。

例:y=xy = \sqrt{x}[0,4][0, 4] で回転

「放物線が生み出す回転体——放物面体」の体積:

V=π04(x)2dx=π04xdx=π[x22]04=8πV = \pi \int_0^4 (\sqrt{x})^2\,dx = \pi \int_0^4 x\,dx = \pi \left[\frac{x^2}{2}\right]_0^4 = 8\pi

ワッシャー法(Washer Method)

「2 本の曲線が作るドーナツ断面を積み上げる」——2 つの曲線 f(x)g(x)0f(x) \geq g(x) \geq 0 の間の回転体:

V=πab([f(x)]2[g(x)]2)dxV = \pi \int_a^b \bigl([f(x)]^2 - [g(x)]^2\bigr)\,dx

シェル法(Shell Method)

「薄い筒を積み上げる」——yy 軸周りの回転に適した方法:

V=2πabxf(x)dxV = 2\pi \int_a^b x f(x)\,dx

xx での「筒(シェル)」の体積 2πxf(x)dx2\pi x \cdot f(x) \cdot dx を積分します——「バウムクーヘンを薄く切り出して全部足す」イメージです。


弧長(Arc Length)

「道の長さをどうやって測るか」——曲がった曲線の長さも積分で求まります。ピタゴラスの定理を連続版に拡張したものです:

曲線 y=f(x)y = f(x)[a,b][a, b] における長さ:

L=ab1+[f(x)]2dxL = \int_a^b \sqrt{1 + [f'(x)]^2}\,dx

f(x)=x3/2f(x) = x^{3/2}[0,4][0, 4] の弧長:

f(x)=32x1/2,L=041+9x4dx=827[(1+9x4)3/2]04=827(103/21)f'(x) = \frac{3}{2}x^{1/2}, \quad L = \int_0^4 \sqrt{1 + \frac{9x}{4}}\,dx = \frac{8}{27}\left[\left(1+\frac{9x}{4}\right)^{3/2}\right]_0^4 = \frac{8}{27}(10^{3/2}-1)

面積と体積の公式まとめ

問題公式
曲線下の面積abf(x)dx\int_a^b f(x)\,dx
2曲線の間の面積ab[f(x)g(x)]dx\int_a^b [f(x)-g(x)]\,dx
xx 軸周り回転体πab[f(x)]2dx\pi\int_a^b [f(x)]^2\,dx
yy 軸周り回転体2πabxf(x)dx2\pi\int_a^b xf(x)\,dx
弧長ab1+[f(x)]2dx\int_a^b\sqrt{1+[f'(x)]^2}\,dx

まとめ

  • 2曲線の面積:交点を求めて上下の差を積分——「まず交点、次に上から下を引く」
  • 回転体:円盤法(πr2\pi r^2)の連続版——「薄い円盤を積み上げたイメージ」
  • シェル法:yy 軸周りは 2πx2\pi x を掛けて積分——「薄い筒を積み上げたイメージ」
  • 弧長:ピタゴラスの定理の連続版 dx2+dy2\sqrt{dx^2+dy^2}——「微小な直角三角形の斜辺を積み上げる」

次回は本シリーズの最終回——微分方程式の入門。解の族が互いに交わらないことをデモで確認します。