C言語,tgamma()関数でガンマ関数を計算する

スポンサーリンク

鍛錬 701

C言語,tgamma()関数でガンマ関数を計算する

ガンマ関数を計算するには、tgamma()関数を使用します。
 
以下は、tgamma()関数についてです。

#include <math.h>

double tgamma(double x);
 

引数

以下は、上記の引数についてです。

引数 意味
double x ガンマ関数を計算する対象の数値

戻り値

以下は、戻り値についてです。

戻り値
doule ガンマ関数の計算結果
 
スポンサーリンク

プログラム

以下は、ガンマ関数を計算するするプログラム、get_tgamma.c です。

今回は、0.1 から 5.0 の範囲で、0.05 ずつ刻んで計算しています。

\(\Gamma (x) = \displaystyle \int_{0}^{\infty} t^{z-1} e^{-t} dt\) \((x \gt 0)\)
// include
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>

// prototype
int StartPlot(FILE **gp);
void PrePlotErf(FILE *gp);
int EndPlot(FILE **gp);

// main
int main(void)
{
	double x, result;
	int ret;
	FILE *gp = NULL;
	
	// 描画開始
	ret = StartPlot(&gp);
	if (ret == -1) {
		printf("ERROR,StartPlot(),ret=%d\n", ret);
		exit(EXIT_FAILURE);
	}
	
	// 描画調整
	PrePlotErf(gp);
	
	// ガンマ関数を計算
	for (x = 0.1; x < 5.0; x += 0.05) {
		result = tgamma(x);
		printf("Γ(%.3lf) = %lf\n", x, result);
		
		// 描画
		fprintf(gp, "%lf %lf\n", x, result);
	}
	
	// 描画終了
	ret = EndPlot(&gp);
	if (ret == -1) {
		printf("ERROR,EndPlot(),ret=%d\n", ret);
		exit(EXIT_FAILURE);
	}
	
	return 0;
}

// ==================================================
// @brief  描画を開始するためのプロセスをオープンする
// @param  gp [out],ストリームのポインタ
// @return 0  成功
// @return -1 エラー
// @note   無し
// ==================================================
int StartPlot(FILE **gp)
{
	*gp = popen("gnuplot", "w");
	if (*gp == NULL) {
		perror("popen");
		return -1;
	}
	
	return 0;
}

// ====================================
// @brief  描画の前準備を行う
// @param  gp [in],ストリームのポインタ
// @return 無し
// @note   無し
// ====================================
void PrePlotErf(FILE *gp)
{
	// レンジ設定
	fprintf(gp, "set xrange [-1:6]\n");
	fprintf(gp, "set yrange [0:26]\n");
	
	// メモリ線設定
	fprintf(gp, "set grid\n");
	
	// 凡例設定(非表示)
	fprintf(gp, "unset key\n");
	
	// データ読み込み開始
	fprintf(gp, "plot '-'\n");
}

// ====================================
// @brief  描画を終了する
// @param  gp [in],ストリームのポインタ
// @return 0  成功
// @return -1 エラー
// @note   無し
// ====================================
int EndPlot(FILE **gp)
{
	int ret;
	
	// データ読み込み終了
	fprintf(*gp, "e\n");
	fflush(*gp);
	pause();
	
	fprintf(*gp, "quit\n");
	
	ret = pclose(*gp);
	if (ret == -1){
		perror("pclose");
		return -1;
	}
	
	return 0;
}

実行結果

以下は、プログラム get_tgamma.c を実行しています。

グラフ描画結果

以下は、グラフの描画結果です。

ガンマ関数のグラフ

端末の実行結果

以下は、端末での実行結果です。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra get_tgamma.c -lm -o get_tgamma
***@ubuntu:~/***/test/c$ ./get_tgamma
Γ(0.100) = 9.513508
Γ(0.150) = 6.220273
Γ(0.200) = 4.590844
Γ(0.250) = 3.625610
Γ(0.300) = 2.991569
Γ(0.350) = 2.546147
Γ(0.400) = 2.218160
Γ(0.450) = 1.968136
Γ(0.500) = 1.772454
Γ(0.550) = 1.616124
Γ(0.600) = 1.489192
Γ(0.650) = 1.384795
Γ(0.700) = 1.298055
Γ(0.750) = 1.225417
Γ(0.800) = 1.164230
Γ(0.850) = 1.112484
Γ(0.900) = 1.068629
Γ(0.950) = 1.031453
Γ(1.000) = 1.000000
Γ(1.050) = 0.973504
Γ(1.100) = 0.951351
Γ(1.150) = 0.933041
Γ(1.200) = 0.918169
Γ(1.250) = 0.906402
Γ(1.300) = 0.897471
Γ(1.350) = 0.891151
Γ(1.400) = 0.887264
Γ(1.450) = 0.885661
Γ(1.500) = 0.886227
Γ(1.550) = 0.888868
Γ(1.600) = 0.893515
Γ(1.650) = 0.900117
Γ(1.700) = 0.908639
Γ(1.750) = 0.919063
Γ(1.800) = 0.931384
Γ(1.850) = 0.945611
Γ(1.900) = 0.961766
Γ(1.950) = 0.979881
Γ(2.000) = 1.000000
Γ(2.050) = 1.022179
Γ(2.100) = 1.046486
Γ(2.150) = 1.072997
Γ(2.200) = 1.101802
Γ(2.250) = 1.133003
Γ(2.300) = 1.166712
Γ(2.350) = 1.203054
Γ(2.400) = 1.242169
Γ(2.450) = 1.284209
Γ(2.500) = 1.329340
Γ(2.550) = 1.377746
Γ(2.600) = 1.429625
Γ(2.650) = 1.485193
Γ(2.700) = 1.544686
Γ(2.750) = 1.608359
Γ(2.800) = 1.676491
Γ(2.850) = 1.749381
Γ(2.900) = 1.827355
Γ(2.950) = 1.910767
Γ(3.000) = 2.000000
Γ(3.050) = 2.095468
Γ(3.100) = 2.197620
Γ(3.150) = 2.306944
Γ(3.200) = 2.423965
Γ(3.250) = 2.549257
Γ(3.300) = 2.683437
Γ(3.350) = 2.827178
Γ(3.400) = 2.981206
Γ(3.450) = 3.146312
Γ(3.500) = 3.323351
Γ(3.550) = 3.513252
Γ(3.600) = 3.717024
Γ(3.650) = 3.935761
Γ(3.700) = 4.170652
Γ(3.750) = 4.422988
Γ(3.800) = 4.694174
Γ(3.850) = 4.985735
Γ(3.900) = 5.299330
Γ(3.950) = 5.636763
Γ(4.000) = 6.000000
Γ(4.050) = 6.391177
Γ(4.100) = 6.812623
Γ(4.150) = 7.266873
Γ(4.200) = 7.756690
Γ(4.250) = 8.285085
Γ(4.300) = 8.855343
Γ(4.350) = 9.471046
Γ(4.400) = 10.136102
Γ(4.450) = 10.854777
Γ(4.500) = 11.631728
Γ(4.550) = 12.472045
Γ(4.600) = 13.381286
Γ(4.650) = 14.365527
Γ(4.700) = 15.431412
Γ(4.750) = 16.586207
Γ(4.800) = 17.837862
Γ(4.850) = 19.195079
Γ(4.900) = 20.667386
Γ(4.950) = 22.265216
Γ(5.000) = 24.000000

 
上記に示した通り、ガンマ関数を計算することができました。

スポンサーリンク

シェアする

フォローする