§Algorithm§


☆台形公式☆

 台形公式は名前の通り、面積部分(定積分)を小さい台形に分割して求める方法です。

あくまでこのようにして得られる定積分(数値積分)は、近似値であることに注意して下さい。 実際の f(x) の xmin から xmax までの定積分とは多少の誤差があります。 その誤差は、台形の分割数と xmin,xmax に依存しています。もちろん、分割数を 多くすれば誤差は少なくなりますが、計算処理時間が長くなることにもなります。 この上の求め方を感覚的にそのままコードにすると、次のような感じになります。
−注意−
以下のコードでは円周率を求める計算を行っておりますが、任意の式を挿入することで 他の計算も行えます。(マクロが使えたら・・・。)

'===========================================================
'Daikei   台形公式を用いて定積分をおこなう
'(このコードでは円周率を求めている)
'---------引数----------------------------------------------
'xmax,xmin:積分区間のx値(xmax>xmin)
'count:求める面積を何個の台形に分割するか
'---------戻り値--------------------------------------------
'数値積分を返す
'===========================================================
Public Function Daikei(xmax As Long, xmin As Double, _
                       count As Long) As Double
    Dim y1 As Double, y2 As Double
    Dim x1 As Double, x2 As Double
    Dim i As Long 'カウンタ
    Dim hei As Double, ret As Double '台形の高さと面積
    '小さい台形に分割する(hei=その台形の高さ)
    hei = (xmax - xmin) / count
    ret = 0#
    For i = 0& To count - 1&
        x1 = xmin + CDbl(i) * hei
        x2 = x1 + hei
        '-----この部分に任意の式-----
        y1 = Sqr(4# - x1 ^ 2#) '台形の辺の長さ
        y2 = Sqr(4# - x2 ^ 2#)
        '---------------------------
        ret = ret + (y1 + y2) * hei / 2#
    Next i
    Daikei = ret
End Function

 この上の計算を式で表すと次のようになります。この計算方法では無駄が多いように見えますね。

台形の面積の合計 =
h * (f(xmin) + f(xmin + hei)) / 2 +
h * (f(xmin + hei) + f(xmin + 2 * hei)) / 2 +
h * (f(xmin + 2 * hei) + f(xmin + 3 * hei)) / 2 +
h * (f(xmin + 3 * hei) + f(xmin + 4 * hei)) / 2 + ・・・ +
h * (f(xmin + (count - 2) * hei) + f(xmin + (count - 1) * hei)) / 2 +
h * (f(xmin + (count - 1) * hei) + f(xmax)) / 2

この式を整理すると、

台形の面積の合計 =
h * (f(xmin) + f(xmax)) / 2 +
h * {f(xmin + hei) +
f(xmin + 2 * hei) +
f(xmin + 3 * hei) +
f(xmin + (count - 2) * hei) +
f(xmin + (count - 1) * hei)}

のようにできます。 この整理された式を用いてコードにしたものが 次に示すものです。

'===========================================================
'Daikei2   台形公式を用いて定積分をおこなう
'(こちらの方がシンプルで処理が速い)
'(このコードでは円周率を求めている)
'---------引数----------------------------------------------
'xmax,xmin:積分区間のx値(xmax>xmin)
'count:求める面積を何個の台形に分割するか
'---------戻り値--------------------------------------------
'数値積分を返す
'===========================================================
Public Function Daikei2(xmax As Long, xmin As Double, _
                        count As Long) As Double
    Dim x As Double
    Dim i As Long 'カウンタ
    Dim hei As Double, wid As Double '台形の高さと辺の合計値
    '小さい台形に分割する(hei=その台形の高さ)
    hei = (xmax - xmin) / count
    wid = 0#
    x = xmin
    For i = 1& To count - 1&
    x = x + hei
    '-----この部分に任意の式-----
    wid = wid + Sqr(4# - x ^ 2#) '台形の辺の長さを加算
    '---------------------------
    Next i
    Daikei2 = ((Sqr(4# - xmax ^ 2#) + _
                Sqr(4# - xmin ^ 2#)) / 2# + wid) * hei
End Function


(サンプルプログラムの動作確認)

機種 PC-9821V13S
OS Windows95
開発ツール Visual Basic Ver.4.0
更新日 00/04/16

ダウンロード Daikei.lzh(2.06KB)

Visual Basic Ver.5.0,Ver.6.0でも問題なく動作すると思います。
なお、このコーナーに掲載されているプログラムコード、およびプログラムファ イルが原因で起きた損害などに関して一切の責任を負うことはできません。

★このコーナーに掲載されているプログラムコード、およびプログラムファ イルを無断で配布・転載することは、原則として禁止です。


(参考書)

「C言語によるはじめてのアルゴリズム入門」
著者 :河西 朝雄氏
出版社:技術評論社

大変参考にさせていただきました。ありがとうございました。


Algorithmインデックス トップ


Copyright(C)2000 Tomoya. All rights reserved.