積分公式なしで面積を計算
デカルト座標に描かれた直線や曲線とx軸との間の面積を求めたい時、どうすればいいでしょう。例えば以下のグラフの":"の部分の面積を知りたいわけです。
| :
| *::
| :::
| :::::
| * :::::
| ::::::::
| *::::::::::
| ::::::::::::
| *::::::::::::::
| ::::::::::::::::
| *::::::::::::::::::
| *::::::::::::::::::::::
| *::::::(この面積を求める):: x
|o *:::*::::::::::::::::::::::::::::::10
*-------------------------------------->
高校数学の知識によれば、曲線の数式を定積分すると答えが出てきますが、公式を覚えるのも大変ですし、積分が原理的に難しい数式も存在します。どんなn次式でも、三角関数でも、数式で表せない図形であっても、簡単に面積を求められる方法はないのでしょうか。
実は面積を求めるだけなら、数値積分という方法があります。積分公式を使わずに、細かく分けた領域を繰り返し計算することで、面積を割り出します。つまり、定積分せずに面積を求めることができるわけです。これで数学的センスの有無や積分公式を覚えるといった努力は必要ありません。
デカルト座標に関しては、実践コーナー(数学アラカルト)にデカルトの夢と奇妙な図形があります。興味のある人は閲覧ください。
面積を求めるには
まずは簡単な例から始めましょう。以下のデータがあるとします。先の数値がx軸の値で次の数値がy軸の値です。
1 10
2 10
3 10
4 10
rpnで「@x 10 @x 1 + #x -r 5」と記述すれば同じ結果を得られます。このデータをグラフ化します。"*"と"*"を繋げてイメージしてみてください。
^y 20
|
|
15
|
|
|
*0 a *・・・・・・・・・* d * *
| ・ ・
| ・ ・
| ・ ・
5 (*とx軸で囲まれる面積を求める)
| ・ ・
| ・ ・ x
|o b ・ ・ c 4
+--------1---------2---------3--------->
単純にxが0から4までのyの値を足すと面積になるような気がします。rpnで計算すると、
50
結果が50と出ましたが、それぞれ5つの数字を合計しただけで、面積ではありませんね。面積を出すのなら上のグラフにあるように、a-b-c-dで囲まれる領域を計算して、4倍しなければいけません。
40
今度は40と答えが出ましたが、正確な面積は四角形なので縦×横、つまり「4x10=40」なので正しい値です。
sigmaはy軸の値を合計するプログラム、integralは台形公式(台形則)を使った数値積分プログラムです。
値積分(台形公式)による面積の求め方(1次式)
次は右斜めの直線で囲まれる面積を計算してみましょう。数式は以下のとおりです。
これをrpnで記述すると次のように書けます。
0 0
1 10
2 20
3 30
4 40
この結果をグラフ化します。"*"と"*"を繋げてイメージしてみてください。
^y 50
|
40
| *
|
30
| *
|
20
| * d
| ・ ・
10 ・ ・ (*とx軸で囲まれる
| a * ・ 面積を求める)
| ・ ・ x
|o b ・ ・ c 4
*--------1---------2---------3--------->
さて、x=0から4までの面積を求めるのですが、一気に計算するのではなく、まずはx=1からx=2までの面積を求めてみましょう。a-b-c-dで囲まれる台形の面積を計算するわけです。
同じ計算方法でx=0と1の間、x=2と3の間、x=3と4の間の面積を計算して、4つ合計すると全体の面積が求められます。なお、肝心の台形の面積を計算する公式は小学校で学びます。
・・・・・・・・
(上底 + 下底) * 高さ ・ ・
台形の面積 = -------------------- 高さ ・ (台形) ・
2 ・ ・
・・・・・・・・・・・・
下底
グラフ中のa,b,c,dの記号で考えると「((a - b) + (d - c)) * (c - b) / 2」となるのですが、bとcはx軸上で0になるので、実際には「(a + d) * (c - b) / 2」が面積を求める数式になります。早速、rpnで計算してみると、
80
実際の面積は三角形なので縦×横÷2、つまり「4x40/2=80」ですから、ピッタリですね。
数値積分(台形公式)による面積の求め方(2次式)
さて、次は積分なしには面積が計算できなさそうな例です。2次式の放物線を描いてみます。数式は以下のとおりです。
y = x ただし、0 <= x <= 4
x=0から4までの値をrpnで計算してみます。
0 0
1 1
2 4
3 9
4 16
2次式なので、x軸の数値の増加に比べて、y軸の数値の増加がとても大きいですね。これをグラフ化すると以下のようになります。*と*を繋げてイメージしてみてください。
^y 20
|
|
15 *
| `
| `
| `
10 `
| *`d
| ・`・
| ・ ` ・ (*とx軸で囲まれる
5 ・ ` ・ 面積を求める)
| a * ` ・
| ` ・ ・ x
|o * ` b ・ ・ c 4
*--------1---------2---------3--------->
ここで凹型の曲線が感じられる、x=2からx=3までの面積を求めてみます。まず、a-b-c-dで囲まれる台形を考えます。そして、x軸0~1、1~2、2~3、3~4の4つに分けて、それぞれの面積を計算して合計するわけです。
22
面積は22と計算されました。しかし、ここで問題があります。a-b-c-dで囲まれる台形の面積("・"で繋がるライン)と実際の曲線("`"で繋がるライン)との間に小さな隙間があります。台形の面積のほうがちょっと大きいですよね。
曲線を直線で近似するのですから、ズレが生じるのは当然と言えば当然です。では、ここでx=2と3の間ではなくx=2.0から2.1の間のように細かくしていけばどうでしょう。曲線と直線の近似は0に近づくような気がしませんか。
そこで、x軸を4つに分割するのではなく、もっと細かく40個に分割して、それぞれの台形の面積を計算後、最後に合計してみます。実際にrpnで計算するのは簡単です。x軸の増分を0.1ずつにして、41回繰り返せばOKです。
21.34
面積が22から21.34に変わりましたが、これでも正確とは限りません。正確な面積を知るには定積分する以外にありません。そこで、y=x^2を積分してみます。
r 2 +- x -+ r 1 3
∫ x dx = | --- | = --- r
0 +- 3 -+ 0 3
ここではx=4、つまり、r=4なのでrpnで計算すると正確な面積が出てきます。
21.3333
21.3333(循環小数)が正しい面積になります。台形公式によるものとの誤差は4つの区分で計算した場合が3%で、40個の区分で計算した場合が0.03%となります。実用上、問題のない精度でしょう。
0.0303045
>rpn 21.34 21.3333 :err
0.000313964
この数値積分の誤差ですが、台形n個の近似から10倍の台形10n個に増やせば、誤差を1/10^2倍にできます。実際、台形4個の近似から台形40個の近似にすることで、数は10倍になったので、誤差は1/100になるはずですが、果たして、上の例では0.0303045から0.000313964ですから、確かに1/100になっています。
このように数値積分は、x軸の値に対応するy軸の値さえあれば、直線であっても曲線であっても面積を求めることができます。応用範囲は広いと言えるでしょう。
乱数を使って面積から円周率πを計算することができます。モンテカルロ法といいます。実践コーナー(数学アラカルト)にモンテカルロでπを求めるがありますので、興味のある人は閲覧ください。
rpnプログラムを実行するには、rpn試用版かrpn標準版が必要です(バージョンの違いはこちら)。
sigmaとintegralはビジネス統計(推定編)に同梱されています。errははビジネス統計(単回帰編)に同梱されています。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。