私はこの問題を抱えています
>>> import math
>>> math.pow(-1.07,1.3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error
なにか提案を ?
(-1.07)1.3は実数ではないため、Mathドメインエラーになります。
複素数が必要な場合は、abをeblnaに書き換える必要があります。
>>> import cmath
>>> cmath.exp(1.3 * cmath.log(-1.07))
(-0.6418264288034731-0.8833982926856789j)
NaNを返したいだけの場合は、その例外をキャッチします。
>>> import math
>>> def pow_with_nan(x, y):
... try:
... return math.pow(x, y)
... except ValueError:
... return float('nan')
...
>>> pow_with_nan(1.3, -1.07) # 1.3 ** -1.07
0.755232399659047
>>> pow_with_nan(-1.07, 1.3) # (-1.07) ** 1.3
nan
ところで、Pythonでは通常、ビルトインa ** b
はパワーを上げるために使用されますが、ではありませんmath.pow(a, b)
。
>>> 1.3 ** -1.07
0.755232399659047
>>> (-1.07) ** 1.3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: negative number cannot be raised to a fractional power
>>> (-1.07+0j) ** 1.3
(-0.6418264288034731-0.8833982926856789j)
powを使用せず、指数を複雑にします(それに追加0j
します)。次に例を示します。
In [15]: (-1.07)**(1.3+0j)
Out[15]: (-0.64182642880347307-0.88339829268567893j)
数学関数は必要ありません:)
私はPython2.5.4を使用していますが、次のようになります。
>>> import math
>>> math.pow(-1.07,1.3)
nan
使用しているPythonのバージョンは何ですか?
複素数(および負の数)の非整数の力には、重要な微妙な点が含まれます。指数関数は実数直線に単射です。つまり、exp(a)= exp(b)はa=bを意味します。これは、複素平面ではそうではありません。exp(2 * pi * i)= 1であるため、指数関数は2 * pi*i-周期的です。
これは問題につながります:ログ関数のどのブランチを使用しますか?この質問は、複雑な分析の中心的な質問の1つです。
Pythonはこの状況にインテリジェントに対応しています。複素数コンストラクターを明示的に使用しない限り、実数でトラフィッキングすることになります。負の分数の累乗は決して現実的ではないため、Pythonは適切に例外をスローしています。
パワーが負であることを示すこの投稿のタイトルから、あなたが実際に-1.071.3ではなく1.3-1.07を望んでいた可能性はありますか?
負数進の累乗は複素数です。これを修正する方法を説明する例を次に示します。
from numpy import *
t = arange(-3, 3, 0.1)
for n in range(0,len(t)):
T = t[n]
x = (complex(-0.5,0))**T
print(T, x)