#include <iostream> #include <cmath> // ======================================================================= // 以下、積分内容の設定 // ======================================================================= // 被積分関数 (積分対象の関数) double f(double x) { return cos(x); } const double A = 0.0; // 積分区間の下端 (x軸上の左端) const double B = 1.0; // 積分区間の上端 (y軸上の左端) const int N = 10000; // 数値積分における区間分割数 (刻み数) // ※ C/C++ の int の最大値は、環境によっては意外と小さいため要注意です。 // 必要に応じて long long や int64_t 等を使ってください (ループ変数等も)。 // ======================================================================= // 以下、積分の値を数値的に求める処理 // ======================================================================= int main() { double delta = (B - A) / N; // 足し上げる微小区間の幅 (刻み幅) double value = 0.0; // この変数に積分値を足し上げていく // 積分区間をN分割した微小区間を、左(下端)から右(上端)へ順に辿るループ for(int i=0; i<N; ++i) { // i 番目の微小区間における、左端の x 座標値を求める double x = A + i * delta; // ------------------------------------------------------------------- // 以下、i 番目の微小区間の面積を求め、積分値に加算 (どれか 1 つ選択) // ------------------------------------------------------------------- // 矩形法 (長方形で近似した微小領域の面積を足す) // value += f(x) * delta; // 台形法 (台形で近似した微小領域の面積を足す) // value += ( f(x) + f(x+delta) ) * delta / 2.0; // シンプソン法 (二次関数で近似した微小領域の面積を足す) value += ( f(x) + f(x+delta) + 4.0 * f(x+delta/2.0) ) * delta / 6.0; } // 結果を表示 std::cout << value << std::endl; return 0; }