数値積分を行いたい


Tips

内容

\int_a^b~f(x)~dxを求めます。

積分区間が有限の場合

まず被積分関数fとして double f(double t) を定義します。 DefQuadクラスのコンストラクタの第1引数に非積分関数f、続いて第2、第3引数に 積分区間の下限と上限を渡します。 do_integrate(int& ier, int& neval, double& abserr)メソッド によって積分を実行します。 このメソッドの引数は参照渡しで、積分の実行後、ierにはエラーコード(ier=0はエラーなし)、nevalには積分計算中でのf(t)の評価回数、abserrには計算誤差の評価が返ってきます。

サンプルプログラム

filedefquad.cpp

#include <iostream>
#include <octave/config.h>
#include <octave/Quad.h> 

using namespace std; 

double f(double x)
{
  return x*x;
}

int main()
{
  DefQuad defQuad(f, 1.0, 2.0);
  int ier, neval;
  double abserr;
  cout << "f(x) = x^2" << endl;
  cout << "int_1^2 f(x) dx = " 
       << defQuad.do_integrate(ier, neval, abserr) << endl;
  cout << "ier = " << ier << endl;
  cout << "neval = " << neval << endl;
  cout << "abserr = " << abserr << endl;
}

出力

f(x) = x^2
int_1^2 f(x) dx = 2.33333
ier = 0
neval = 21
abserr = 2.59052e-14

積分区間が無限の場合

IndefQuadクラスのコンストラクタの引数は計算したい積分区間に応じて次の様になります。

  • (b,∞) : IndefQuad(f, b, IndefQuad::bound_to_inf)
  • (-∞,b) : IndefQuad(f, b, IndefQuad::neg_inf_to_bound)
  • (-∞,∞) : IndefQuad(f, b, IndefQuad::doubly_infinite)

サンプルプログラム

fileindefquad.cpp

#include <iostream>
#include <octave/config.h>
#include <octave/Quad.h>
#include <cmath>

using namespace std; 

double f(double x)
{
  return exp(-x*x);
} 

int main()
{
  IndefQuad indefQuad(f, 0.0, IndefQuad::bound_to_inf);
  // IndefQuad::neg_inf_to_bound, IndefQuad::doubly_infinite 
  int ier, neval;
  double abserr;
  cout << "f(x) = exp(-x^2)" << endl;
  cout << "int_0^{infty} f(x) dx = "
       << indefQuad.do_integrate(ier, neval, abserr) << endl;
  cout << "ier = " << ier << endl;
  cout << "neval = " << neval << endl;
  cout << "abserr = " << abserr << endl;
}

出力

f(x) = exp(-x^2)
int_0^{infty} f(x) dx = 0.886227
ier = 0
neval = 135
abserr = 7.10132e-09

コメント

被積分関数が複素数やベクトル、行列の場合

管理人? (2005-01-05 (水) 17:37:08)

どうすればよいのか?