プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

定積分を求めるシンプソンの1/3則とは?公式・アルゴリズム・C++実装例を解説

シンプソンの1/3則とは

シンプソンの1/3則(Simpson's 1/3 Rule)は、台形則と同様に、区間 [a, b] における定積分の値を数値的に近似する手法です。台形則との主な違いは、台形則では区間全体を複数の台形に分割するのに対し、シンプソンの1/3則ではさらに各部分を2つに細分化し、放物線で関数を近似する点にあります。このため、台形則よりも高い精度で積分値を求められるのが特徴です。

シンプソンの1/3則の公式

この手法では、次の公式を使用します。

定積分を求めるシンプソンの1/3則とは?公式・アルゴリズム・C++実装例を解説

ここで、h は各区間の幅、n は区間の分割数を表します。h は以下の式から求めることができます。

定積分を求めるシンプソンの1/3則とは?公式・アルゴリズム・C++実装例を解説

入力と出力

入力:
関数 f(x):(x + 1/x)、下限と上限:1, 2、区間の分割数:20
出力:
答えは:2.19315

アルゴリズム

integrateSimpson(a, b, n)

入力 − 積分の下限・上限、および区間の分割数 n。

出力 − 積分計算の結果。

Begin
    h := (b - a)/n
    res := f(a) + f(b)
    lim := n/2

    for i := 1 to lim, do
        oddSum := oddSum + f(a + (2i - 1)h)
    done

    oddSum := oddSum * 4
    for i := 1 to lim-1, do
        evenSum := evenSum + f(a + 2ih)
    done

    evenSum := evenSum * 2
    res := res + oddSum + evenSum
    res := res * (h/3)
    return res
End

C++による実装例

#include<iostream>
#include<cmath>
using namespace std;

float mathFunc(float x) {
    return (x+(1/x));      //関数 x + 1/x
}

float integrate(float a, float b, int n) {
    float h, res = 0.0, oddSum = 0.0, evenSum = 0.0, lim;
    int i;
    h = (b-a)/n;           //区間間の距離を計算
    res = (mathFunc(a)+mathFunc(b));   //f(a)とf(b)による初期和
    lim = n/2;

    for(i = 1; i<=lim; i++)
        oddSum += mathFunc(a+(2*i-1)*h);   //奇数位置の項の合計
    oddSum *= 4;           //奇数項の合計に4を掛ける

    for(i = 1; i<lim; i++)
        evenSum += mathFunc(a+(2*i)*h);    //偶数位置の項の合計
    evenSum *= 2;          //偶数項の合計に2を掛ける
    res += oddSum+evenSum;
    res *= (h/3);
    return res;            //積分の結果を返す
}

main() {
    float result, lowLim, upLim;
    int interval;
    cout << "Enter Lower Limit, Upper Limit and interval: ";
    cin >>lowLim >>upLim >>interval;
    result = integrate(lowLim, upLim, interval);
    cout << "The answer is: " << result;
}

実行結果

Enter Lower Limit, Upper Limit and interval: 1 2 20
The answer is: 2.19315

このプログラムでは、下限1・上限2・分割数20を入力すると、関数 f(x) = x + 1/x の定積分値として 2.19315 が出力されます。分割数 n を大きくするほど、近似精度は向上します。

  1. 1/1! + 2/2! + 3/3! + …… + n/n! の級数の合計を求めるPythonプログラム

    この記事では、与えられた問題を解くための解法とアプローチについて詳しく解説します。 問題文 整数 n が入力として与えられたとき、次の級数の合計を求めます。 1/1! + 2/2! + 3/3! + 4/4! + …… + n/n! ここでは for ループを使用して実装するため、時間計算量は O(n) となります。また、処理効率を高めるポイントとして、階乗の計算を同じループ内で同時に行っている点が挙げられます。 アルゴリズム 以下の手順で級数の合計を求めます。 合計値 res を 0、階乗値 fact を 1 で初期化します。 i を 1 から n まで順に処理し、fact *= i に

  2. Windows 8.1/8でUSBデバイスが認識されないときの対処法【自分でできる解決策】

    USBデバイスは手軽に使える便利な機器ですが、Windows 8.1/8にアップデートした後、パソコンのUSBポートに接続しても認識されなかったり、正常に動作しなかったりするトラブルに遭遇することがあります。 この記事では、Windows 8/8.1がUSBデバイスを認識しない場合に試せる対処法を、初心者の方にもわかるように順番にご紹介します。 対処法1:ディスクの管理でドライブが表示されるか確認する まず、USBデバイスを接続した際にWindowsがドライブを検出しているかどうかを確認しましょう。Windowsキー + Rキーを押して「ファイル名を指定して実行」ダイアログを開き、「disk