120

Numerical Methods in Engineering with 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

ログを削除して別の機能を追加すると機能するため、ログに絞り込みました。ベースとの何らかの干渉によるものだと思いますが、原因がわかりません。誰でも解決策を提案できますか?

4

5 に答える 5

156

あなたのコードは、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]値がどこから来ているのか推測できるかどうかはわかりませんが、うまくいけば、これがあなたを正しい方向に導くでしょう.

于 2013-04-08T23:06:46.630 に答える
3

を使用することもできますmath.log1p

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

数学.log1p(x)

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

math.expm1whichを使用して元の値に戻すことができます。これにはe、x の累乗から 1 を引いたものが返されます。

于 2020-02-10T08:55:56.923 に答える
1

正でないものの対数を計算しようとしています。

対数は、数値と累乗が与えられた後に底を計算します。log(0)は、何かが の累乗であることを意味し2ます0。指数は0* になることlog(0)はありません。つまり、答えがないことを意味し、したがって、math domain error

*注:0^0が発生する可能性がありますが、同時に0発生する可能性もあります。1この問題は激しく議論されています。

于 2019-07-01T21:54:38.300 に答える