メインコンテンツへスキップ

求積法を理解する:定積分を近似する数値的方法

求積法とは何か、数値積分がどのように定積分を近似するか、台形則・シンプソン則・ガウス求積の仕組みを学びます。
更新日 2026年10月16日  · 10 分 読む

AIで探求

ChatGPTClaudePerplexity

鉛筆と紙の微積分ではどうしても解けない定積分のカテゴリがあります。誤りではありません。e^(−x²) や sin(x)/x のように、初等関数としての不定積分(閉形式)が存在しない関数があるのです。そんなときに必要なのが別のアプローチです。区間内のよく選ばれた少数の点で関数を評価し、それらの値を組み合わせて下にある面積を推定します。これが求積法です。

本記事では、求積法とは何か、その一般的な枠組みがどう機能するか、そして直感的な中点則から驚くほど鋭いガウス型まで主要な手法を順に解説します。さらに、区分求積、誤差の源、適応的手法、そして目の前の問題に最適な方法の選び方も取り上げます。

求積法とは?

"Quadrature(求積)" という語は古く、与えられた図形と同じ面積の正方形を作図するという古典的な幾何学の問題に由来します。要するに「面積を求める」ことです。今日では、定積分を数値的に近似することを意味します。

核心は置き換えです。厳密な不定積分を求める代わりに、関数 f(x) を節点(ノード)と呼ばれる点集合で標本化し、それぞれに対応する重みを掛けて合計します。

Formula for quadrature approximation

「求積法」と「数値積分」は本質的に同義です。数学寄りの文脈では求積法、科学技術計算の現場では数値積分という日常語がよく使われます。

数値求積の仕組み

すべての求積則は区間 [a, b] 上で動作します。その区間内で節点 xᵢ を選び、各点に重み wᵢ を割り当てます。近似値は前述の重み付き和です。方法間の違いは、節点の配置と重みの付け方だけです。これで終わりです。台形則、シンプソン則、ガウス求積は、いずれもこの同じ雛形のバリエーションに過ぎません。

近似誤差とは、重み付き和と真の積分値の差です。どの方法も誤差を生みますが、節点を増やす(または区間を細かくする)につれてその誤差がどれだけ速く縮むかが、良い方法と優れた方法を分けます。念頭に置くべき見方は、「求積法を選ぶ」とは、関数評価の予算をどう使うかを選ぶことだという点です。

代表的な求積法

以下の手法は、直感的なものから高度なものへと並んでいます。

Diagram comparing error and approximation areas for Midpoint, Trapezoidal, and Simpson's numerical integration rules.中点則・台形則・シンプソン則の視覚的比較。画像:著者作成。

中点則

[a, b] の中点を取り、そこで f を評価し、幅 (b − a) を掛けます。区間全体の平均値を中央での関数値が代表すると仮定する手法です。

一見すると単純すぎますし、単一区間では実際にそうです。しかし最初の驚きはここから。中点則は定数関数と一次関数に対しては厳密で、区間ごとの誤差は h = b − a に対して O(h³) でスケールします。これは滑らかな関数に対しては台形則より実は良く、その点で多くの人の予想を裏切ります。

台形則

中央だけでなく両端点を使います。両端を直線で結び、できた台形の面積を計算します:(b − a) · [f(a) + f(b)] / 2。一次関数に対しては厳密で、区間ごとの誤差は O(h³)。中点則と同じ次数ですが、定数は大きくなります。

台形則はおそらく最も広く教えられる求積法で、そのため過大評価されがちです。素直な関数にはまずまず有効ですが、同じ評価回数なら区分シンプソン則の方がたいてい優れています。

シンプソン則

両端点と中点の3点を通る二次多項式を当てはめ、その多項式を厳密に積分します。

Simpson's full formula.

中央での追加評価は関数呼び出しを1回増やしますが、見返りは大きいです。シンプソン則は3次までの多項式に対して厳密で、区間ごとの誤差は O(h⁵) と台形則より2桁優れます。滑らかな関数に対しては、まず最初に試す価値のある方法です。

ガウス求積

ここからが本当に面白いところです。中点則・台形則・シンプソン則はいずれも等間隔の節点を使います。ガウス求積は違う問いを立てます。節点の位置と重みの両方を、精度が最大になるよう選べないだろうか?

n 個の節点を用いると、ガウス求積(特にガウス・ルジャンドル型)は次数 2n − 1 までの任意の多項式を厳密に積分できます。2点なら3次、5点なら9次の多項式まで厳密です。節点はルジャンドル多項式の根で、区間の端点側に集まる傾向があり、等間隔には並びません。 追加の精度は、節点を動かせること自体から生まれます。たまたまどこにあるかではありません。端点付近に集まるのは数学的帰結であり、その理由は後で見ていきます。

以上の4手法を比較すると次のとおりです。

手法

アプローチ

区間ごとの誤差

計算コスト

適した対象

中点則

中心で評価

O(h³)

1 評価/区間

単純で滑らかな関数

台形則

一次近似

O(h³)

2 評価/区間

周期関数

シンプソン則

二次近似

O(h⁵)

3 評価/区間

滑らかな関数

ガウス求積

最適節点 + 重み

O(h^(2n+1))

n 評価/区間

高精度・滑らかな関数

区分求積法

1回だけで [a, b] 全体に適用しても、たいていは十分ではありません。標準的な対処は区間を n 個の等間隔部分に分割し、幅 h = (b − a)/n として各部分に基本則を適用することです。

区分中点則と区分台形則

区分台形則では、等間隔の n+1 点で f を評価し、n 個の台形を合計します。全体の誤差は O(h²) に低下します。h を半分にすると誤差は4分の1になります。区分中点則も同様の考え方で、全体誤差の次数も同じです。

区分シンプソン則

区分版では部分区間の数は偶数である必要があります。n+1 点で f を評価すると、全体誤差は O(h⁴) になります。h を半分にすると誤差は16分の1。滑らかな関数で適度な精度が必要なとき、区分シンプソン則がしばしば既定の選択となる理由です。

以下の Python コードは、∫[0 から π] sin(x) dx(厳密値: 2.0)について、部分区間を増やすと近似がどのように締まっていくかを示します。

import numpy as np

def composite_simpson(func, lower, upper, num_intervals):
    """Approximate integral using composite Simpson's rule."""
    if num_intervals % 2 != 0:
        raise ValueError("num_intervals must be even")
    nodes = np.linspace(lower, upper, num_intervals + 1)
    values = func(nodes)
    h = (upper - lower) / num_intervals
    weights = np.ones(num_intervals + 1)
    weights[1:-1:2] = 4   # odd-indexed interior points
    weights[2:-2:2] = 2   # even-indexed interior points
    return (h / 3) * np.dot(weights, values)

exact = 2.0
for n in [4, 8, 16, 32]:
    approx = composite_simpson(np.sin, 0, np.pi, n)
    print(f"n={n:3d}: approx={approx:.10f}, error={abs(approx - exact):.2e}")

わずか 32 区間で、誤差は 10⁻⁶ 未満に落ちます。これが O(h⁴) の収束です。

ガウス求積

ガウス求積の考え方は、表の一行では語り尽くせません。

等間隔の節点が最適とは限らない理由

節点が等間隔に並ぶと、評価コストの配分が被積分関数の難しさに合わないことがあります。ある領域はより高い分解能を要する一方、平坦な部分では評価を浪費します。ガウス求積は、厳密に積分できる多項式の次数に対して最適であることが証明された節点を選ぶことで、この問題を回避します。

n 個の節点に対し、ガウス・ルジャンドル則は n 次のルジャンドル多項式 Pₙ(x) の n 個の根を節点として選び、次数 ≤ 2n − 1 の任意の多項式を誤差なく積分できるよう重みを計算します。実務では、numpy.polynomial.legendre.leggauss(n) が両方を返してくれます。節点は標準区間 [−1, 1] の端点側に集まります。多項式補間の誤差が大きくなりがちで、サンプリング密度を上げる効果が大きい場所だからです。

使いどころ

ガウス求積が真価を発揮するのは、滑らかで解析的な関数に対し、少ない評価回数で高精度が必要なときです。ガウス・ルジャンドルの5点は、振る舞いの良い被積分関数に対して、数十区間の区分シンプソン則を上回ることがあります。一方で、折れ曲がり、不連続、あるいは等間隔点でしかデータが得られない場合には不向きです。そうした場合には、慎重に選ばれた節点配置が裏目に出ます。

求積誤差と精度

数値計算法が誤差から逃れられることはありません。すべての求積結果には2種類の誤差源が関わり、両方を理解することが、得られた答えをどこまで信頼できるかの鍵になります。

誤差の要因は次のとおりです。

  • 離散化誤差(打ち切り誤差とも)とは、無誤差の算術であなたの求積則が返す値と厳密な積分値との差です。これを表すのが O(hᵏ) の式です。点を増やすか区間幅を減らすと小さくなります。
  • 浮動小数点誤差は別問題です。有限精度で多数の小さな量を加算すると丸め誤差が生じ、h を小さくしても縮まず、むしろ増えることがあります。数千の部分区間を使う区分則では、浮動小数点ノイズが支配的になり、区間を増やしても改善しない限界に当たる場合があります。多くの科学技術計算では、その限界に達する前に所望の許容誤差に届きますが、限界は存在します。

関数の滑らかさ、区間幅、手法の選択はいずれも離散化誤差に影響します。鋭い特徴をもつ荒い関数には、より多くの区間や適応的アプローチが必要です。

適応的求積

被積分関数がほとんどの場所で滑らかだが、ところどころ複雑な場合、一様格子は評価を無駄にします。

仕組み

まずある区間に求積則を適用し、次により高次の則(またはその区間を二分して同じ則)を適用して比較します。その差が局所誤差の推定になります。許容値未満ならその区間を採用し、そうでなければ二分して各半区間で再帰します。すべての部分区間が許容値を満たすまで繰り返します。

被積分関数に孤立した特徴(狭いスパイク、折れ、周囲は滑らかな急激な振動など)があるとき、一様細分に比べて効率向上は大きくなります。適応的手法は、関数が本当に必要とする場所にだけ評価を集中させます。

scipy.integrate.quad()

Python では、scipy.integrate.quad() が適応的ガウス求積(具体的には QUADPACK の DQAGSE アルゴリズム)を実装しています。関数と積分区間を渡せば、推定値と誤差上界が返ってきます。1次元の積分なら、たいていはこれが最適解で、手動での調整は不要です。

from scipy import integrate
import numpy as np

# Integrate a function with a peak near x=0.5
def peaked_func(x):
    return np.exp(-100 * (x - 0.5)**2)

result, error_bound = integrate.quad(peaked_func, 0, 1)
print(f"Estimate: {result:.10f}")
print(f"Error bound: {error_bound:.2e}")

quad() はこの狭いピークを難なく処理します。一様なシンプソン則で同等の精度を得るには、数百の部分区間が必要になるでしょう。

求積法の選び方

Python の1次元積分では、特別な理由がない限り scipy.integrate.quad() から始めてください。適応的で高精度、よく検証されています。以下は、自分で実装する場合、適応的ライブラリがない言語で作業する場合、あるいは特定のケースに最適化する場合に関係します。

  • 既知の式をもつ滑らかで解析的な関数: ガウス求積は評価1回あたりの精度が最も高いです。中程度の精度で簡潔さを優先するなら、区分シンプソン則が堅実な既定値です。
  • 折れや不連続のある関数: 等間隔の手法(台形則・シンプソン則)はこの場合にガウス求積より良い傾向があります。節点の固定配置が不規則性の影響を受けにくいからです。既知の不連続で積分区間を分割し、それぞれを個別に扱ってください。
  • 等間隔点での固定データ: ガウス求積は選択肢から外れます。任意の節点で関数を評価できないため、区分台形則か区分シンプソン則を使ってください。
  • 高次元の積分: 求積は次元の呪いにすぐ直面します。各次元に n 点、次元数 d のとき、総評価回数は nᵈ です。10 次元で各10点なら 10¹⁰ 評価となり、現実的ではありません。モンテカルロはおおよそ5次元を超えるとずっと良くスケールするため、そこで切り替えるのが実務的です。

求積法と関連する数値手法の比較

求積法は孤立した存在ではありません。他のツールとの位置づけを知ると理解が進みます。

求積法 vs. 解析積分

解析積分は厳密な不定積分を求め、求積法は数値(定積分の値)を近似します。厳密な不定積分が存在し、見つけられるならそれを使うべきです。厳密積分が不可能または非現実的なときに、求積法の出番があります。

求積法 vs. モンテカルロ積分

いずれも定積分を近似しますが、やり方が異なります。求積法は決定的で、あらかじめ決めた節点で f を評価し、収束は関数の滑らかさと節点数に結びつきます。モンテカルロは乱択で、無作為標本を取り平均します。誤差は次元に依らず O(1/√N) で縮みます。低次元では収束が遅い一方、次元非依存であるため、およそ5次元を超えると実務的な選択肢になります。

求積法 vs. 補間

シンプソン則を含む一部の求積則は、評価点を通る多項式を当てはめ、それを厳密に積分することで働きます。しかし目的は補間とは異なります。補間は関数を再構成するのに対し、求積法が欲しいのは数値ひとつです。多項式は手段であって、成果物ではありません。

まとめ

求積法の満足感は、単一の統一的な発想からこれほど多くを引き出せる点にあります。中点則、台形則、シンプソン則、ガウス求積のどれもが結局は同じ問い—限られた関数評価の予算をどこに置き、どう重み付けするか—に対する別々の答えなのです。

評価点を通るより良い多項式を当てはめることで、誤差は急速に下がります。節点を最適に選ぶと、同じ予算からさらに精度を絞り出せます。最後に適応的手法がそれらを束ね、関数が本当に必要とする場所に評価を振り向けます。

Python では、1次元の問題に対して scipy.integrate.quad() が既定の選択として適切です。本記事のその他の内容は、内部で何が起きているかを理解したいとき、あるいは自分で実装する必要があるときのためのものです。SciPy で数値計算のスキルをさらに伸ばしたい方は、Introduction to Optimization in Python コースをご受講ください。

FAQs

数学における求積法とは何ですか?

求積法は、定積分を数値的に近似することです。解析的に不定積分を求める代わりに、選んだ点(節点)で関数を評価し、その値に重みを掛け合わせて積分値を推定します。用語は、曲線の下面積を求めるという古典的な問題に由来します。

台形則とシンプソン則の違いは何ですか?

台形則は端点間を直線で近似し、一次関数に対して厳密です。シンプソン則は(両端点と中点の)3点を通る二次式を当てはめ、3次までの多項式に対して厳密です。滑らかな関数ではシンプソン則の収束がはるかに速く、区間ごとの誤差は台形則の O(h³) に対し O(h⁵) で縮みます。

ガウス求積と区分シンプソン則はいつ使い分けるべきですか?

ガウス求積は、任意の点で f を評価でき、少ない評価回数で高精度が必要なとき—特に滑らかで解析的な関数に—用います。データが等間隔点に固定されている場合や、折れ・不連続があってガウスの節点配置が崩れる場合は、区分シンプソン則の方が有利なことが多いです。実務では scipy.integrate.quad() のような適応的手法がこの選択を自動で行ってくれます。

「適応的求積」とは何ですか?

等間隔に評価点を並べるのではなく、近似誤差が大きい場所に点を集中させるのが適応的求積です。各部分区間で局所誤差を見積もり、許容値を超える区間を細分し、全区間で許容誤差を満たすまで繰り返します。ほとんど滑らかだが一部に難所がある関数に効率的です。

Python で数値積分を行うにはどうすればよいですか?

標準的なツールは scipy.integrate.quad() です。関数と積分区間を渡すと、近似値と誤差推定が返ります。無限区間には np.inf や -np.inf を渡します。多重積分には dblquad() や tplquad() を使います。

高次元の積分で求積法がうまくいかないのはなぜですか?

求積則はグリッド上に節点を配置するため、総関数評価回数は nᵈ にスケールします(n は各次元の点数、d は次元数)。10 次元で各10点なら 10¹⁰ 評価です。この指数的爆発が「次元の呪い」です。モンテカルロ積分は、総標本数 N に対し O(1/√N) の誤差率で次元に依らないため、この問題を回避します。

求積法とモンテカルロ積分の違いは何ですか?

求積法は決定的で、固定の節点で関数を評価し、収束率は手法と関数の滑らかさに依存します(区分則で典型的に O(h²) から O(h⁵))。モンテカルロは乱択で、一様に標本を取り平均し、誤差は O(1/√N) で縮みます。1~2 次元では求積法が有利で、5~10 次元あたりからモンテカルロが実務的になります。

ガウスの節点と重みとは何ですか?

ガウスの節点は特定の直交多項式の零点です。ガウス・ルジャンドル求積では n 次のルジャンドル多項式の根が節点になります。重みは、次数 2n − 1 までの多項式を厳密に積分できるように選ばれます。等間隔グリッドと異なり、ガウスの節点は区間の中央付近に集まり、端点を避ける傾向があります。手計算は不要で、numpy.polynomial.legendre.leggauss() が直接返してくれます。

トピック
データサイエンス

DataCamp で学ぶ

コース

Pythonで学ぶ線形モデリング入門

4時間
27K
Pythonで線形モデルの概念と応用を学び、データのパターンを記述・予測・分析するモデルを構築します。
詳しく見るRight Arrow
コースを始める
もっと見るRight Arrow