1

私はそれに完全に行き詰まっています。どこから始めればよいかわかりません。

Cでn間隔でaとbの間の関数を統合する必要があります.

私は関数定義しか持っていません:

float funcintegrate(float (*f)(float x), float a, float b, int n);

台形法を使用する必要があります。

編集 :

ヒントをありがとうございました。私は今答えを持っています!

台形法 (または規則) を使用して区間 [a, b] で関数を数値的に積分します。

float funcintegrate(float (*f)(float x), float a, float b, int n);

int i;
double x;
double k = (b - a) / n;
double s = 0.5 * (f(a) + f(b));

    for (i = 1; i < n; i++) {
         x = a + k * i;
         s = s + f(x);
    }

return s * k;

}
4

1 に答える 1

6

関数funcintegrate()は基本的に[a, b]間隔をnサブ間隔に分割し、f()すべてのサブ間隔のエンドポイントでの値を計算し、それらを使用して各サブ間隔の特定の式の値を計算し、最後にその式のすべての値を合計する必要があります。

各反復で計算する部分式は、選択した特定の数値積分法に依存し、パフォーマンスと精度のトレードオフに影響します。

最も単純なケースでは、式はf()エンドポイントの 1 つの値にサブインターバルの長さを掛けた積です。これは、曲線の下のフィールドに対する「棒グラフ近似」に対応します。これは非常に不正確であり、実装に成功したら、より複雑な方法を試す必要があります。

これらの 2 つのウィキペディアの記事では、それぞれが上記で説明した一般的なアルゴリズムを共有する多くの異なる方法について説明しています:オイラー法ルンゲ クッタ法

また、「Numerical Recipes in C」の関連する章を読むことをお勧めします。

EDIT : 台形法では、各サブインターバルに、サブインターバルに基づく台形の面積を表す式を使用し、f()その垂直辺が曲線と交差するまで上向き (または の符号に応じて下向き) に伸びます。2 つの交点は直線で結ばれます (点間が直線ではない可能性があるため、ここで近似が行われます)。f()

于 2011-12-18T16:07:21.940 に答える