ネットが遅くてイライラしてない!?

誤差関数erfと相補誤差関数erfc がライブラリになく
プログラムが組めなくて困っています。
どこかにソースがうpされているとか関数のソースを持っている方とかヘッダファイルを提供してくださる方、お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

「C言語による最新アルゴリズム事典」


(ISBN4-87408-414-1)
のpp227-230にigamma.cとしてソースがあります。
サポートページからソースはダウンロードできますが、
この手のアルゴリズム本はプログラマには必須です。

TO 運営スタッフの方
この本に「プログラムは自由にお使いいただいてかまわない」
とあるので、ここに紹介しました。
問題があれば削除してください。

参考URL:http://oku.edu.mie-u.ac.jp/~okumura/algo/
    • good
    • 0

erfもerfcもC99から標準規格に導入された関数です。

したがって、C++やC95以前の処理系ではサポートしていなくても仕方ありません。

これらのソースはいくつか公開されていますが、Newlib(http://sources.redhat.com/newlib/)またはMinGW Runtime(http://sourceforge.net/projects/mingw/)のものが手っ取り早いかと思います。

なお、C99ではerfやerfcの複素数版(cerfおよびcerfc)は任意実装ですので、必ずしもサポートされるわけではありません。(つまり、complex.hやtgmath.hを探してもない可能性があります)
    • good
    • 0

math.h (C++ なら cmath) で定義されているような気がします.

この回答への補足

math.hでコンパイルするとエラーがでたので、math.hにはありません。
cmathを使う場合
#include<cmath>
でよろしいのでしょうか?

補足日時:2005/07/14 20:44
    • good
    • 0

ANSI C に対応している (hosted な) 処理系なら erf とか erfc は持っていないといけないんですけど, どん

な処理系 (コンパイラなど) を使われているんでしょうか?

この回答への補足

VC6++です。
今日いろいろ調べてみたら
complex.hという新標準ヘッダファイルにあるようなのですが、
#include<complex>//.hがいらない
のように使うということを知りました、いままで、complex.hでつかっていてエラーが出ていたので、
これで上手くいくことを願います。

補足日時:2005/07/14 16:36
    • good
    • 0

MATLABを持ってない場合は、Scilabで代用できると思います。


フランス産ですが、自由に配布、使用できるライセンスで、
日本語の資料もあります。

Scilabには erf(),erfc(),erfcx()も含まれています。
UNIX,Windows,MACで動作します。

参考URL:http://www.geocities.jp/rui_hirokawa/scilab/
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q標準正規分布

gnuplotで標準正規分布を表示したい(へんな釣鐘形みたいな形)んですけど、plotコマンドでファイル読みだすんですけど、そのファイルに何をかきこめばいいか分かりません。いま、範囲「0、1」の正規乱数に標準平均、分散、すべてもとめたのですが、ファイルに何をかきこめば、釣鐘形のグラフがでてくるか分かりません。教えて下さい。ちなみに、OS環境としてRed hut Linux 8.0で、C言語でプログラムを作ってます。

Aベストアンサー

標準正規分布の確率密度関数は
f(x) = 1/sqrt(2π) exp(-x^2/2)
だから, 例えば

#include <math.h>
double f(double x)
{
return exp(-x*x/2) / sqrt(8*atan(1.0));
}

int main()
{
for (int i = -30000; i <= 30000; i++) {
printf("%f %f\n", i/10000.0, f(i/10000.0));
}
return 0;
}

でいいんじゃないかな?

この程度の長さでテストする気にはならないのですが ISO C に対応していれ
ばコンパイルできるはず.

Q有限までのガウス積分

積分範囲が(0~p)のガウス積分
∫exp(-a x^2)dx
を行いたいのですが、どうしてよいかわかりません。
教えてください。

Aベストアンサー

有限範囲では初等関数の範囲でできません。
積分結果は誤差関数という特殊関数で表されますが、誤差関数も積分で定義されますので積分したことになりませんね。
積分は数値積分では有限範囲で積分可能ですのて、正規分布や誤差関数の数値計算結果の数表の形で積分値が提供されています。

Maple10という数学ソフトで計算するとa>0として
[√{π/(2a)}]erf(p√a)
と出てきます。
誤差関数erf(x)については参考URLをご覧下さい。

http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/matlab/ref/?/matlab/support/manual/r13/toolbox/matlab/ref/erf.shtml

Qガウス形とローレンツ形

波形でよく出てくるガウス形とローレンツ形ですが、これら半値幅とピークの高さがわかれば形が決まりますよね。
そこで、半値幅とピーク高さの値が求まったとして、面積を求めたいと思っています。半値幅とピーク高さでガウス形とローレンツ形の面積を表わすことができるのでしょうか?面積の公式ってあるのでしょうか?

数学に詳しい方、よろしくお願いいたします。

Aベストアンサー

ガウス(Gauss)型曲線は
(1)  G(x) = A exp(-a^2 x^2)
です.中心は x=0 としています.
曲線と x 軸との間の面積 S はよく知られた公式で
(2)  S = ∫{-∞~∞} G(x) = (A/a)√π
です.
一方,ピーク値はもちろん A,
半値幅 w は,高さがピーク値の半分になる幅ですから,
x=±w/2 で G の値が A/2.
すなわち
(3)  exp(-a^2 w^2 / 4) = 1/2
で,これから
(4)  w = 2√(ln 2)/a  ⇔  a = w/2√(ln 2)
です.
(4)を(2)に代入して,ピーク値 A を考慮すればできあがり.

ローレンツ(Lorentz)型は
(5)  L(x) = B/(x^2 + Γ^2)
の形.前と同じく中心は x=0 としています.
ピーク値は x=0 とおいて B/Γ^2 ですね.
こちらも面積の積分は簡単で
(6)  S = ∫{-∞~∞} L(x) = Bπ/Γ
半値幅は
(7)  B/{(w/2)^2 + Γ^2} = (1/2) B/Γ^2
から
(8)  w = 2Γ  ⇔  Γ = w/2
(6)に(8)を代入して,ピーク値 B/Γ^2 を考慮すればできあがり.

ガウス(Gauss)型曲線は
(1)  G(x) = A exp(-a^2 x^2)
です.中心は x=0 としています.
曲線と x 軸との間の面積 S はよく知られた公式で
(2)  S = ∫{-∞~∞} G(x) = (A/a)√π
です.
一方,ピーク値はもちろん A,
半値幅 w は,高さがピーク値の半分になる幅ですから,
x=±w/2 で G の値が A/2.
すなわち
(3)  exp(-a^2 w^2 / 4) = 1/2
で,これから
(4)  w = 2√(ln 2)/a  ⇔  a = w/2√(ln 2)
です.
(4)を(2)に代入して,ピーク値 A を考慮すればできあがり.

ローレンツ(Lorentz)...続きを読む

Qがあるのにsqrtが・・・

最初にあるプログラムを作っていたのですが、その祭sqrtでエラーが出てしまったので、別にsqrtを使う短いプログラムを作りました。それが以下のものになります。(test3.c)

#include<stdio.h>
#include<math.h>

int main(void){
int atai;
double x=2.0;
atai=(int)sqrt(x);
printf("atai is %c",atai);
}


sqrtが動作するか確かめる為のものです。このプログラム(test3.c)で以下のエラーが出てしまいました。

/tmp/ccqEejZ1.o(.text+0x4d): In function `main':
test3.c: undefined reference to `sqrt'
collect2: ld はステータス 1 で終了しました

ちなみにLinux(Fedora core 4)を使用しています。
初心者ということもありなぜエラーが出るのか分かりません。
ちなみに<math.h>を使用しないプログラムは普通に動作します。
解決方法をご存知の方がいらっしゃいましたらご教授下さいませ。
よろしくお願いします。

最初にあるプログラムを作っていたのですが、その祭sqrtでエラーが出てしまったので、別にsqrtを使う短いプログラムを作りました。それが以下のものになります。(test3.c)

#include<stdio.h>
#include<math.h>

int main(void){
int atai;
double x=2.0;
atai=(int)sqrt(x);
printf("atai is %c",atai);
}


sqrtが動作するか確かめる為のものです。このプログラム(test3.c)で以下のエラーが出てしまいました。

/tmp/ccqEejZ1.o(.text+0x4d): In function `main':
test3.c: undefined r...続きを読む

Aベストアンサー

コンパイルのオプションつけてないとかないですよね?
たとえばTerminalとかだとコンパイル時に 『-lm』とかつけますが

Qエクセルにおける逆関数について

エクセルで相補誤差関数ERFCの逆関数を使いたいのですが,見つかりません.
どこか外部から引っぱってこなければならないのでしょうか?
宜しくお願いいたします.

Aベストアンサー

数学を理解してる訳ではありませんが・・・

参考URLは、誤差関数ERFの逆関数です。「NORMINV」は「NORMSINV」の間違いだと思われます。

ERFINV(x)---ERFの逆関数
=SQRT(0.5)*NORMSINV((1+x)/2) または
=NORMINV(x/2+0.5,0,SQRT(0.5))

ERFCINV(x)---ERFCの逆関数
=SQRT(0.5)*NORMSINV((2-x)/2) または
=NORMINV(1-x/2,0,SQRT(0.5))

=ERFC(1)で求めた値(0.157299264825445)を上記の式に入れると
1.0000000974346になります(誤差が出ます)。

参考URL:http://www.kinchan.de/storage/erf/erf.html

Qガウス分布、誤差関数の関係について。

この二つの関係がよく分かりません。

参考書籍の紹介などでも結構です。

よろしくお願いします。

Aベストアンサー

#1です。
A#1でミスプリの訂正です。
>別の「erf(x)」という関数を誤差関数と呼んでいる

>誤差関数elf(x)の数式的な関係は
> F(x)=(1/2)+(1/2)elf(x/√2)
誤差関数erf(x)の数式的な関係は
F(x)=(1/2)+(1/2)erf(x/√2)=[1/√(2π)}∫[-∞,x]e^(-x^2/2)dx
erf(x)=(2/√π)∫[0,x]e^(-t^2)dt=2F((√2)x)-1

誤差関数(error function)は 「erf(x)」と書くので差し替えておいて下さい。

補足ですが、似たような言葉を集めて見ましたので参考にして下さい。

正規分布はガウス分布とも呼ばれる。
http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83

ガウス積分
http://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%E7%A9%8D%E5%88%86

ガウス関数
http://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%E9%96%A2%E6%95%B0
正規分布関数はガウス関数の一種。

誤差関数
http://www-lab.ee.uec.ac.jp/subject/quality/error.html
正規分布、ガウス分布をさす意見もある(小数派)。
しかし、普通はerf(x)関数をさす(多数派)
http://keisan.casio.jp/has10/SpecExec.cgi?path=08000000.%93%C1%8E%EA%8A%D6%90%94%2F06000100.%8C%EB%8D%B7%8A%D6%90%94%2F10000100.%8C%EB%8D%B7%8A%D6%90%94%2Fdefault.xml
http://dl.cybernet.co.jp/matlab/support/manual/r2007/toolbox/matlab/ref/?/matlab/support/manual/r2007/toolbox/matlab/ref/erf.shtml

#1です。
A#1でミスプリの訂正です。
>別の「erf(x)」という関数を誤差関数と呼んでいる

>誤差関数elf(x)の数式的な関係は
> F(x)=(1/2)+(1/2)elf(x/√2)
誤差関数erf(x)の数式的な関係は
F(x)=(1/2)+(1/2)erf(x/√2)=[1/√(2π)}∫[-∞,x]e^(-x^2/2)dx
erf(x)=(2/√π)∫[0,x]e^(-t^2)dt=2F((√2)x)-1

誤差関数(error function)は 「erf(x)」と書くので差し替えておいて下さい。

補足ですが、似たような言葉を集めて見ましたので参考にして下さい。

正規分布はガウス分布とも呼ばれる。
http://ja...続きを読む

QC言語 配列の長さの上限

C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

Aベストアンサー

そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。
たとえ64bit版OSだとしても添え字が2147483647って、単純なintの配列だとしても4x2147483647=8GB必要ですね。実メモリ16GBとかのPCを用意しますか?
そもそも配列で2147483647個必要なアルゴリズムに問題ありだと思います。

Q文頭の「また」や「あと」などの表現はどういう?

たとえば、英語で
「この語はどのように発音しますか?また、どのようなときに使うのですか?」
というような質問をしたい時、2つめの文頭の「また」(もしくは「あと」「それと」など)は英語でどのように表現するのでしょうか?
私の感覚だと、文頭にAndとかAlsoをおいて「And (Also), when is it used?」みたいな感じになるのですが、これはなにかおかしい気がします。

Aベストアンサー

No.2です。ごめんなさい、「文頭の」というご質問だったんですね。

ご参考までに、会話だとかカジュアルな文の文頭ならAndが来て構わないのですが、きちんと書く場合には文頭にAndとかButとか来ないほうが良いとされています。

http://homepage3.nifty.com/MIL/butand.html

http://www.eigo-nikki.com/article/13292266.html

Qコンピュータシミュレーションでの確率密度関数の利用

C言語のシミュレーションモデルで、正規分布に従うようなアクションを起こして
やりたいです。

累積分布関数が解析的に導出できないので、区分級積分で面積を計算した
上で、乱数を利用して決定する方法を考えています。

あまりスマートなやり方ではないような気がしたので、
よいやり方や参考サイトなどがあれば教えていただきたく質問させていただきました。
よろしくお願いいたします。

Aベストアンサー

box-muller法では駄目なのでしょうか?

参考URL:http://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%EF%BC%9D%E3%83%9F%E3%83%A5%E3%83%A9%E3%83%BC%E6%B3%95


人気Q&Aランキング