2
public double Integral(double[] x, double intPointOne, double intPointTwo)
{
    double integral = 0;
    double i = intPointOne;
    do
    {
        integral += Function(x[i])*.001;
        i = i + .001;
    }
    while (i <= intPointTwo);
    return integral;
}

これは、単純に部分の合計を使用して x1-x2 から関数を統合する必要がある関数です。このループをより効率的に (より少ないループを使用して)、より正確にするにはどうすればよいですか?

反復ごとにどこFunctionが変わりますが、その大きさ(または境界)の順序は比較的同じままであるため、無関係である必要があります...

4

4 に答える 4

6

1)別のアルゴリズムについては、 http://apps.nrbook.com/c/index.htmlのセクション4.3を調べてください。

2)精度/速度係数を制御するには、境界x_lowx_high、積分に必要なスライス数を指定する必要がある場合があります。したがって、関数は次のようになります

// Integrate function f(x) using the trapezoidal rule between x=x_low..x_high
double Integrate(Func<double,double> f, double x_low, double x_high, int N_steps)
{
    double h = (x_high-x_low)/N_steps;
    double res = (f(x_low)+f(x_high))/2;
    for(int i=1; i < N; i++)
    {
        res += f(x_low+i*h);
    }
    return h*res;
}

この基本的な統合を理解したら、数値レシピやその他のソースで言及されているより複雑なスキームに進むことができます。

このコードを使用するには、次のようなコマンドを発行しますA = Integrate( Math.Sin, 0, Math.PI, 1440 );

于 2012-05-24T17:09:28.030 に答える
0

統合には左側の法則を使用しています。これは、関数がドメイン全体で正と負の勾配を持っている限り、半正確です(左端点の使用のエラーがキャンセルされるため)。

少なくとも、台形公式に移行することをお勧めします(集合(x [i]、0)、(x [i + 0.001]、0)、(x [i]、関数によって形成される台形の下の面積を計算します) (x [i])、(x [i + 0.001]、Function(x [x + 0.001])。

さらに良い解決策は、シンプソンの法則を使用することです。これは遅いアルゴリズムですが、精度によって間隔を大幅に増やすことができます。

詳細については、数値積分を参照してください。

于 2012-05-24T17:11:09.567 に答える
0

関数を事前に知っている場合は、関数を分析して、目的に適した積分ステップのサイズを確認できます。つまり、線形関数の場合は 1 ステップだけで済みますが、他の関数の場合は可変ステップが必要になる場合があります。少なくとも、次のような方法で問題を解決できるかどうかを確認してください(pointTwo - pointOne)/1000.0

一般的な機能に必要で、宿題ではない場合は、既存のライブラリを強く検討するか、1 年目から 2 年目の数学コースを更新する必要があります...

あなたのコードには実際には i を使用しないというバグがあることに注意してください (これは x の非常に悪い名前です):

for(x=intPointOne; x<=intPointTwo;x+=0.001) 
{
    integral += Function(x)*.001;
}
于 2012-05-24T16:56:44.677 に答える