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

スポンサーリンク

鍛錬 704

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

指定した数値の誤差関数を計算するには、erf()関数を使用します。
 
以下は、erf()関数についてです。

#include <math.h>

double erf(double x);
 

引数

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

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

戻り値

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

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

プログラム

以下は、誤差関数を計算するプログラム、get_erf.c です。

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

\(erf(x) = \displaystyle \frac{ 2 }{ \sqrt{\pi} } \displaystyle \int_0^x 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 = erf(x);
		printf("erf(%.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 [-3:3]\n");
	fprintf(gp, "set yrange [-2:2]\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_erf.c を実行しています。

グラフ描画結果

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

誤差関数のグラフ

端末の実行結果

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

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra get_erf.c -lm -o get_erf
***@ubuntu:~/***/test/c$ ./get_erf
erf(-2.0) = -0.995322
erf(-1.9) = -0.992790
erf(-1.8) = -0.989091
erf(-1.7) = -0.983790
erf(-1.6) = -0.976348
erf(-1.5) = -0.966105
erf(-1.4) = -0.952285
erf(-1.3) = -0.934008
erf(-1.2) = -0.910314
erf(-1.1) = -0.880205
erf(-1.0) = -0.842701
erf(-0.9) = -0.796908
erf(-0.8) = -0.742101
erf(-0.7) = -0.677801
erf(-0.6) = -0.603856
erf(-0.5) = -0.520500
erf(-0.4) = -0.428392
erf(-0.3) = -0.328627
erf(-0.2) = -0.222703
erf(-0.1) = -0.112463
erf(0.0) = 0.000000
erf(0.1) = 0.112463
erf(0.2) = 0.222703
erf(0.3) = 0.328627
erf(0.4) = 0.428392
erf(0.5) = 0.520500
erf(0.6) = 0.603856
erf(0.7) = 0.677801
erf(0.8) = 0.742101
erf(0.9) = 0.796908
erf(1.0) = 0.842701
erf(1.1) = 0.880205
erf(1.2) = 0.910314
erf(1.3) = 0.934008
erf(1.4) = 0.952285
erf(1.5) = 0.966105
erf(1.6) = 0.976348
erf(1.7) = 0.983790
erf(1.8) = 0.989091
erf(1.9) = 0.992790
erf(2.0) = 0.995322

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

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