シンプソンの公式をC言語で実装しようとしたところ、うまくいかない場合があります。特に関数の引数や式に誤りがあったり、アルゴリズムに関して理解不足があると、正しい結果が得られません。この問題について、コードを修正するためのポイントを解説します。
シンプソンの公式の基本
シンプソンの公式は数値積分の手法であり、区間を分割して、区間内で関数の値を2次関数で近似します。この公式では、区間の両端と中間の点で関数の値を取り、それを使って積分値を計算します。
例えば、区間[a, b]における積分を計算する場合、以下のように分割して積分値を近似します。
∫[a,b] f(x) dx ≈ (b - a) / 6 * (f(a) + 4f((a + b) / 2) + f(b))
コードの問題点と修正方法
質問者のコードにはいくつかの問題点があります。まず、シプソンの公式を正しく適用するためには、`getTrapezoidSquare`関数が誤って使用されています。この関数はシンプソンの公式ではなく台形法を実行しています。
また、`x`の値を変更する際に、`x += 2 * 3.0 / pow(2, i)`としていますが、シンプソンの公式では各区間の幅を適切に設定する必要があります。
修正後のコード
シンプソンの公式を正しく実装するためには、まず関数`getTrapezoidSquare`を修正し、シンプソンの公式を適用する関数に変更します。さらに、`x`の更新方法も調整が必要です。以下に修正例を示します。
#include
#include
double func_y(double x) {
return x * x * x * x * x + 3.0 * x;
}
double getSimpsonsSquare(double h, double d_up, double d_mid, double d_down) {
return h / 3.0 * (d_up + 4.0 * d_mid + d_down);
}
int main(void) {
double x, h, d_up, d_mid, d_down, S;
int i;
printf("分割数 シンプソンの公式 (誤差)\n");
for (i = 1; i < 21; i++) {
S = 0;
h = 3.0 / pow(2, i);
for (x = 0.0; x < 3.0; x += h) {
d_up = func_y(x + h);
d_mid = func_y(x + h / 2.0);
d_down = func_y(x);
S += getSimpsonsSquare(h, d_up, d_mid, d_down);
}
printf("2^%d %.10lf %.12lf\n", i, S, S - 135);
}
return 0;
}
コードの説明
修正したコードでは、`getSimpsonsSquare`関数がシンプソンの公式を使用して積分値を計算します。`x`の値は、`h`を使って適切に分割されます。`d_up`、`d_mid`、`d_down`はそれぞれ、区間の端点と中点での関数値を表します。
このコードは、分割数を変えることでシンプソンの公式の精度を調整できます。`S`には積分値が累積され、最終的に誤差が表示されます。
まとめ
シンプソンの公式をC言語で実装する際には、関数の適切な更新とアルゴリズムの理解が重要です。特に、`getTrapezoidSquare`関数のように誤った手法を使用しないようにしましょう。また、分割数を調整することで、より精度の高い計算結果を得ることができます。
この修正方法を参考に、シンプソンの公式を正しく実装して、数値積分を効率的に行いましょう。


コメント