TOP > n.s.研究所 > ライブラリ > VisualC++ > 計算物理学

ライブラリ

計算物理学
積分区間に変数が入る2重積分の数値計算(シンプソン法 C++)

文責:遠藤 理平 (2009年9月24日) カテゴリ:日誌計算物理学

積分区間が矩形であれば、先日の等間隔シンプソン法が非常に精度が高いが、
次のような、積分区間に変数となる2重積分の数値計算はできない。
1次元のシンプソン法を改良するしかないのだろうか。

C++ソース

/*
1次元シンプソン法
例:f(x,y) = xy  x[0:1], y[0:x]
*/
#include <math.h>
#include <stdio.h>

double F(double x, double y);
double Simpson1_2(double x0, double x1, double y0, double y1 ,int N);

int main(void){

  double exa = 1.0/8.0;
  int kizami = 10000;
  double s = Simpson1_2(0, 1.0, 0, 1.0 , kizami) ;

  //結果の書き出し
  printf("  刻み数 : %d\n", kizami);
  printf("  積分値 : %22.15e\n", s);
  printf("  誤 差 : %22.15e\n", s - exa);

  return 0;
}
double F(double x, double y) //被積分関数
{
  return x*y;
}

double Simpson1_2(double x0, double x1, double y0, double y1 ,int N)
{
  int i, j;
  double x,y, c=0.0;
  double ss1 , ss2;
  
  for(i=0; i<=N; i++){
    x = x0 + (x1-x0)/double(N) * double(i);
    y1 = x;
    ss1 =0.0;
    for(j=1; j<=N/2-1; j++){
      y = y0 + (y1-y0)/double(N) * double(2*j);
      ss1 += F(x,y);
    }
    ss2 =0.0;
    for(j=1; j<=N/2; j++){
      y = y0 + (y1-y0)/double(N) * double(2*j-1);
      ss2 += F(x,y);
    }
    c += (y1-y0)/(3.0*double(N)) * ( F(x,y0)+F(x,y1) + 2.0 * ss1 + 4.0 * ss2 );
  }
  return  c * (x1-x0)/double(N);
}

実行結果

(タグ: , ,

■現在のカテゴリ: ライブラリ > VisualC++ > 計算物理学

ライブラリ

LabVIEWを使った物理数学集

VisualC++


▲このページのトップn.s.研究所 トップ

関連記事

日誌


計算物理学


▲このページのトップn.s.研究所 トップ

n.s.研究所

About n.s.研究所

Activity 活動予定

Thema 研究テーマ

単細胞生物の行動に関する研究

多細胞生物の行動に関する研究

社会性昆虫の行動に関する研究

人の認識に関する研究

環境に関する研究

Thema 開発テーマ

ロボットの開発

作ってみた

Lecture 講義

コンピュータ・サイエンス講座

マイコン・サイエンス講座

Library ライブラリ

LabVIEWを使った物理数学集

VisualC++

Report 報告

学会等での発表

論文発表

その他の報告




Warning: mysqli_connect(): (28000/1045): Access denied for user 'xsvx1015071_ri'@'sv102.xserver.jp' (using password: YES) in /home/xsvx1015071/include/natural-science/include_counter-d.php on line 8
MySQL DBとの接続に失敗しました