ValueError:数学ドメインエラー


102

私は、Pythonを使った工学における数値解析手法の例をテストしたところです

from numpy import zeros, array
from math import sin, log
from newtonRaphson2 import *

def f(x):
    f = zeros(len(x))
    f[0] = sin(x[0]) + x[1]**2 + log(x[2]) - 7.0
    f[1] = 3.0*x[0] + 2.0**x[1] - x[2]**3 + 1.0
    f[2] = x[0] + x[1] + x[2] -5.0
    return f

x = array([1.0, 1.0, 1.0])
print newtonRaphson2(f,x)

実行すると、次のエラーが表示されます。

File "example NR2method.py", line 8, in f
    f[0] = sin(x[0]) + x[1]**2 + log(x[2]) - 7.0
ValueError: math domain error

ログを削除して別の機能を追加すると機能するため、ログに絞り込みました。なんらかの基地との干渉が原因だと思いますが、どうしてか分かりません。誰かが解決策を提案できますか?

回答:


131

コードがlogゼロ以下の数値を実行しています。これは数学的に未定義なので、Pythonのlog関数は例外を発生させます。次に例を示します。

>>> from math import log
>>> log(-1)
Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    log(-1)
ValueError: math domain error

あなたのnewtonRaphson2関数が何をしているのか知らなければ、無効なx[2]値がどこから来ているのか推測できませんが、うまくいけば、これで正しい軌道に乗ることができます。


定義が方程式のセットを定義しているため、負の対数をどのように実行しているのかわかりません。つまり、x [0]、x [1]、x [2]は、ニュートンラフソンが使用する変数x、y、zです。 。解決するには、これらの方程式のセットが必要です。
ramanunni.pm 2013

1
また、上記のコードでxを定義するときにx [2] = 1.0と言っているので、少なくともlog(1)= 0ですが、それは私が思っていることです。おそらく私は間違っているかもしれません。ヘルプをありがとう..
ramanunni .pm

1
print x関数fの先頭にa を追加します。方程式ソルバーがさまざまなxの値を連続して試し、エラーが発生する様子を確認できます。
mtadd 2013

3
私の場合、問題は引数が負ではなく、正確に0に等しいということでした。これは同じ例外を引き起こします(これは、JSバックグラウンドを持つ人にとって、Math.log(0)が単に-Infinityである場合、驚くかもしれません)
qbolec

1

あなたはポジティブではない何かの対数をしようとしています。

対数は、数値とそれが上げられた力を与えられた後、底を計算します。log(0)何かが乗という意味2IS 0。指数が0*になることは決してありません。これは、log(0)答えがないため、math domain error

*注:0^0が発生する0場合がありますが1、同時に発生する場合もあります。この問題は非常に議論されています。


1

も使用できますmath.log1p

公式ドキュメントによると:

math.log1p(x)

1 + x(底e)の自然対数を返します。結果は、xがゼロに近い場合に正確な方法で計算されます。

元の値に変換して、xの1から1を引いた値をmath.expm1返すことができますe


0

いずれかの理由で数学ドメインエラーが発生しています。ログ関数内で負の数を使用しようとしているか、ゼロ値を使用しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.