C言語,lgamma()関数でガンマ関数の自然対数を計算する

スポンサーリンク

鍛錬 722

C言語,lgamma()関数でガンマ関数の自然対数を計算する

ガンマ関数の絶対値の自然対数を計算するには、lgamma()関数を使用します。
 
以下は、lgamma()関数についてです。

#include <math.h>

double lgamma(double x);
 

引数

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

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

戻り値

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

戻り値
doule ガンマ関数の絶対値の自然対数
スポンサーリンク

プログラム

以下は、ガンマ関数の自然対数を計算するするプログラム、get_lgamma.c です。

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

\(\ln | \Gamma (x) |\)
// 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 < 10.0; x += 0.1) {
		result = lgamma(x);
		printf("lnΓ(%.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:12]\n");
	fprintf(gp, "set yrange [-1:14]\n");
	
	// メモリ線設定
	fprintf(gp, "set grid\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_lgamma.c を実行しています。

グラフ描画結果

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

対数ガンマ関数のグラフ

端末の実行結果

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

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra get_lgamma.c -lm -o get_lgamma
***@ubuntu:~/***/test/c$ ./get_lgamma
lnΓ(0.100) = 2.252713
lnΓ(0.200) = 1.524064
lnΓ(0.300) = 1.095798
lnΓ(0.400) = 0.796678
lnΓ(0.500) = 0.572365
lnΓ(0.600) = 0.398234
lnΓ(0.700) = 0.260867
lnΓ(0.800) = 0.152060
lnΓ(0.900) = 0.066376
lnΓ(1.000) = 0.000000
lnΓ(1.100) = -0.049872
lnΓ(1.200) = -0.085374
lnΓ(1.300) = -0.108175
lnΓ(1.400) = -0.119613
lnΓ(1.500) = -0.120782
lnΓ(1.600) = -0.112592
lnΓ(1.700) = -0.095808
lnΓ(1.800) = -0.071084
lnΓ(1.900) = -0.038984
lnΓ(2.000) = 0.000000
lnΓ(2.100) = 0.045438
lnΓ(2.200) = 0.096947
lnΓ(2.300) = 0.154189
lnΓ(2.400) = 0.216859
lnΓ(2.500) = 0.284683
lnΓ(2.600) = 0.357412
lnΓ(2.700) = 0.434821
lnΓ(2.800) = 0.516703
lnΓ(2.900) = 0.602870
lnΓ(3.000) = 0.693147
lnΓ(3.100) = 0.787375
lnΓ(3.200) = 0.885405
lnΓ(3.300) = 0.987099
lnΓ(3.400) = 1.092328
lnΓ(3.500) = 1.200974
lnΓ(3.600) = 1.312923
lnΓ(3.700) = 1.428072
lnΓ(3.800) = 1.546322
lnΓ(3.900) = 1.667580
lnΓ(4.000) = 1.791759
lnΓ(4.100) = 1.918777
lnΓ(4.200) = 2.048556
lnΓ(4.300) = 2.181021
lnΓ(4.400) = 2.316103
lnΓ(4.500) = 2.453737
lnΓ(4.600) = 2.593857
lnΓ(4.700) = 2.736405
lnΓ(4.800) = 2.881323
lnΓ(4.900) = 3.028557
lnΓ(5.000) = 3.178054
lnΓ(5.100) = 3.329764
lnΓ(5.200) = 3.483640
lnΓ(5.300) = 3.639636
lnΓ(5.400) = 3.797708
lnΓ(5.500) = 3.957814
lnΓ(5.600) = 4.119913
lnΓ(5.700) = 4.283968
lnΓ(5.800) = 4.449939
lnΓ(5.900) = 4.617792
lnΓ(6.000) = 4.787492
lnΓ(6.100) = 4.959005
lnΓ(6.200) = 5.132299
lnΓ(6.300) = 5.307343
lnΓ(6.400) = 5.484107
lnΓ(6.500) = 5.662562
lnΓ(6.600) = 5.842680
lnΓ(6.700) = 6.024434
lnΓ(6.800) = 6.207797
lnΓ(6.900) = 6.392744
lnΓ(7.000) = 6.579251
lnΓ(7.100) = 6.767293
lnΓ(7.200) = 6.956848
lnΓ(7.300) = 7.147893
lnΓ(7.400) = 7.340405
lnΓ(7.500) = 7.534364
lnΓ(7.600) = 7.729750
lnΓ(7.700) = 7.926541
lnΓ(7.800) = 8.124720
lnΓ(7.900) = 8.324266
lnΓ(8.000) = 8.525161
lnΓ(8.100) = 8.727388
lnΓ(8.200) = 8.930929
lnΓ(8.300) = 9.135767
lnΓ(8.400) = 9.341885
lnΓ(8.500) = 9.549267
lnΓ(8.600) = 9.757898
lnΓ(8.700) = 9.967762
lnΓ(8.800) = 10.178843
lnΓ(8.900) = 10.391129
lnΓ(9.000) = 10.604603
lnΓ(9.100) = 10.819252
lnΓ(9.200) = 11.035063
lnΓ(9.300) = 11.252022
lnΓ(9.400) = 11.470117
lnΓ(9.500) = 11.689333
lnΓ(9.600) = 11.909660
lnΓ(9.700) = 12.131085
lnΓ(9.800) = 12.353595
lnΓ(9.900) = 12.577180
lnΓ(10.000) = 12.801827

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

タイトルとURLをコピーしました