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

ライブラリ

計算物理学
台形公式とシンプソンの公式を使っての積分誤差を確かめる(C言語)

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

数値積分で計算誤差を確かめてみるために、台形公式シンプソンの公式を使って、sin の積分の誤差を刻み幅を変えて計算してみた。

計算結果

20090831-1.gif

ソース(台形公式・シンプソンの公式)

/*
積分の計算(台形公式とシンプソン法)
 積分区間[0,PI]
 被積分関数 f(x) =sin(x)
 理論値 2
*/
#include <math.h>
#include <stdio.h>

double PI = acos(-1.0);
double f(double);
double Trapezium(double ,double ,int);
double Simpson(double ,double,int);

int main (void){

	printf("【台形公式】\n");
	for(int n=1; n<=5 ; n++){
		int kizami = int(pow(10.0,n));
		double gosa = abs(Trapezium(0.0,PI,kizami) - 2.0);
		printf("刻み個数 %d の場合 積分値は %.16e\n",kizami, gosa );
	}
	printf("【シンプソン公式】\n");
	for(int n=1; n<=5 ; n++){
		int kizami = int(pow(10.0,n));
		double gosa = abs(Simpson(0.0,PI,kizami) - 2.0);
		printf("刻み個数 %d の場合 積分値は %.16e\n",kizami, gosa );
	}

return 0;
}
double f(double a)
{
	return sin(a);
}
double Trapezium(double a ,double b ,int N)
{
	double c =0.0;
	for(int i=1; i<=N-1; i++){
		double x = a + (b-a)/double(N) *double(i);
		c += f(x);
	}
	return (b-a)/double(N) * ( (f(a)+f(b))/2.0 + c );
}
double Simpson(double a ,double b ,int N)
{
	double ss1 =0.0;
	for(int i=1; i<=N/2-1; i++){
		double x = a + (b-a)/double(N) * double(2*i);
		ss1 += f(x);
	}
	double ss2 =0.0;
	for(int i=1; i<=N/2; i++){
		double x = a + (b-a)/double(N) * double(2*i-1);
		ss2 += f(x);
	}
	return  (b-a)/(3.0*double(N)) * ( f(a)+f(b) + 2.0 * ss1 + 4.0 * ss2 );
}

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

ライブラリ

LabVIEWを使った物理数学集

VisualC++


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

関連記事

日誌


計算物理学


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

n.s.研究所

About n.s.研究所

Activity 活動予定

Thema 研究テーマ

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

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

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

人の認識に関する研究

環境に関する研究

Thema 開発テーマ

ロボットの開発

作ってみた

Lecture 講義

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

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

Library ライブラリ

LabVIEWを使った物理数学集

VisualC++

Report 報告

学会等での発表

論文発表

その他の報告