C言語,erfc()関数で相補誤差関数を計算する

スポンサーリンク

鍛錬 715

C言語,erfc()関数で相補誤差関数を計算する

指定した数値の相補誤差関数「1 – erf(x)」を計算するには、erfc()関数を使用します。
 
以下は、erfc()関数についてです。

#include <math.h>

double erfc(double x);
 

引数

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

引数 意味
double x 相補誤差関数を計算する対象の数値

戻り値

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

戻り値
double 相補誤差関数
スポンサーリンク

プログラム

以下は、指定した数値の相補誤差関数を計算するプログラム、get_erfc.c です。

今回は、erfc()関数の引数 x について、-2 から 2 の範囲で 0.1 ずつ刻んで計算しています。

\(erfc(x) = 1 – erf(x) = \displaystyle \frac{ 2 }{ \sqrt{\pi} } \displaystyle \int_{x}^{\infty} e^{-t^2} dt\)
// 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 = -2.0; x < 2.1; x += 0.1) {
		result = erfc(x);
		printf("erfc(%.1lf) = %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 [-5:5]\n");
	fprintf(gp, "set yrange [-1:3]\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_erfc.c を実行しています。

グラフ描画結果

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

相補誤差関数のグラフ

端末の実行結果

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

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra get_erfc.c -lm -o get_erfc
***@ubuntu:~/***/test/c$ ./get_erfc
erfc(-2.0) = 1.995322
erfc(-1.9) = 1.992790
erfc(-1.8) = 1.989091
erfc(-1.7) = 1.983790
erfc(-1.6) = 1.976348
erfc(-1.5) = 1.966105
erfc(-1.4) = 1.952285
erfc(-1.3) = 1.934008
erfc(-1.2) = 1.910314
erfc(-1.1) = 1.880205
erfc(-1.0) = 1.842701
erfc(-0.9) = 1.796908
erfc(-0.8) = 1.742101
erfc(-0.7) = 1.677801
erfc(-0.6) = 1.603856
erfc(-0.5) = 1.520500
erfc(-0.4) = 1.428392
erfc(-0.3) = 1.328627
erfc(-0.2) = 1.222703
erfc(-0.1) = 1.112463
erfc(0.0) = 1.000000
erfc(0.1) = 0.887537
erfc(0.2) = 0.777297
erfc(0.3) = 0.671373
erfc(0.4) = 0.571608
erfc(0.5) = 0.479500
erfc(0.6) = 0.396144
erfc(0.7) = 0.322199
erfc(0.8) = 0.257899
erfc(0.9) = 0.203092
erfc(1.0) = 0.157299
erfc(1.1) = 0.119795
erfc(1.2) = 0.089686
erfc(1.3) = 0.065992
erfc(1.4) = 0.047715
erfc(1.5) = 0.033895
erfc(1.6) = 0.023652
erfc(1.7) = 0.016210
erfc(1.8) = 0.010909
erfc(1.9) = 0.007210
erfc(2.0) = 0.004678

 
上記に示した通り、-2 から 2 の範囲で 0.1 ずつ刻んで相補誤差関数を計算することができました。

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