- 締切済み
誤差関数のexcel計算
エクセルにて C=C0/2*(1-erf(A)) A=x/(2(Dt)^{1/2}) C0=0.0018 D=1E-21 t=0.0001 x=0,100 (0から100) で計算をさせようとしたところ、x=1,100ではエラーとなりました。 エラー詳細で調べたところ、 erf(1581138830084.19)=#NUM!となりました。 どうしたらいいのかわかりません。 時間もなく焦っています。 お願いします!!
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- rabbit_cat
- ベストアンサー率40% (829/2062)
とりあえず、ものすごく大きなxのerf(x)を計算したいなら、 1-erfc(x) で計算してください。また、以下のリンクによると、 erfc(x)は、excelの関数そのままではなくて、2*NORMSDIST(x*SQRT(2))と書くと、ちょっとはまともになるみたいですね。 http://support.microsoft.com/kb/893352 エクセルは指数や階乗を伴う関数の計算の仕方が、ものすごくアホです。統計処理(関数の内部で頻繁に階乗・べき乗を伴う関数を使う)では、事実上、エクセルはダメすぎて使用できません。というか、使用してはいけません。(もしかしたら最近のバージョンはちょっとは改善されているのかもしれませんが。) エクセルは、計算式の途中で、オーバーフロー、とか桁落ちとかが発生すると、最終的な答え自体は倍精度の範囲に収まる場合でも、エラーになったり、有効桁が減った答えとかを出してきます。 ひどい場合には、なんのエラーメッセージもなしに、有効桁0桁(最初の桁すらあってない)みたいな答えを平気で返してきます。 まともな、統計処理・数値計算用のソフトであれば、普通は、計算の仕方を工夫することで(引数をまず最初にlogをとってから計算するなど)、最終的な答え自体が倍精度に収まる場合は、それなりの有効桁が残るようにするものなのですが。
- info22
- ベストアンサー率55% (2225/4034)
#2です。 お使いのEXCELのバージョンが多分古いようですね。 EXCELの扱うデータは 倍精度計算で 仮数部15桁まで、指数部-324~308)の範囲でしか計算しませんので 有効桁数(15桁)ですので Aの値が 5.8以上では elf(A)=1.000000000000000 となります。 また-5.8以下では elf(A)=-1.000000000000000 となります。 今の場合A≧0なので A1セルにあるAのデータのerf(A)の計算値をB1セルにおく場合 B1には =IF(A1>=5.8,1.0,ERF(A1)) のように書けばいいでしょう。 >C=C0/2*(1-erf(A)) この式は C=(C0/2)*(1-erf(A)) ですか? そうなら、C1セルに =(1-B1)*(C0/2) とすればいいでしょう。C0はC0をおいたセル要素で置き換えて下さい。 ただこの場合も B1が1に近づけば計算精度が落ちます。 Cの式は上の式でなく C=C0/(2*(1-erf(A))) であれば、Aが5.8以上でエクセルの計算では分母がゼロにな理ますので 注意して下さい。 A≧5.8の時、エクセルの計算ではC=∞になってエラーとなります。 Cの式が、どちらか、分かりませんので、 質問する場合は、分子・分母の境が明確に伝わるように、多重に括弧を使って式を書くようにして下さい。
- Tacosan
- ベストアンサー率23% (3656/15482)
Excel のバージョンは? 手元の Excel2007 では erf(1581138830084.19) がエラーにならずにちゃんとした値 (といっても 1 だけど) を返してるんだが.
- info22
- ベストアンサー率55% (2225/4034)
>erf(1581138830084.19)=#NUM! 関数erf(A) の引数Aが不適切(EXCELで扱える範囲を超えている)ということです。 A=x/(2(Dt)^{1/2})=1581138830084.19 が大き過ぎて不適切という事です。 Aの式をチェックして下さい。 Aの式で D=1E-21 t=0.0001 x=1 とおくと A=1581138830084.19 となります。 のでx=1の時にエラーが発生しているという事になります。 Aがある程度の大きさになったら Cの計算式が 別の計算処理をするようにして下さい。
補足
その処理の仕方が知りたいです。 お願いします。
補足
2003です。