Domanda

ho questo problema

>>> import math
>>> math.pow(-1.07,1.3)  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
ValueError: math domain error

qualsiasi suggerimento?

È stato utile?

Soluzione

(- 1,07). 1,3 non sarà un numero reale, così l'errore di dominio Math

Se avete bisogno di un numero complesso, un b deve essere riscritto in e b ln a , per esempio.

>>> import cmath
>>> cmath.exp(1.3 * cmath.log(-1.07))
(-0.6418264288034731-0.8833982926856789j)

Se si desidera solo tornare NaN, cattura questa eccezione.

>>> 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

A proposito, in Python di solito il built-in a ** b viene utilizzato per la raccolta di potere, non 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)

Altri suggerimenti

Non utilizzare pow, e rendere il complesso esponente (add 0j ad esso). Ecco un esempio:

In [15]: (-1.07)**(1.3+0j)
Out[15]: (-0.64182642880347307-0.88339829268567893j)

Non c'è bisogno di funzioni matematiche:)

Sto usando Python 2.5.4 e ottengo questo:

>>> import math
>>> math.pow(-1.07,1.3)  
nan

Quale versione python stai usando?

non interi poteri di numeri complessi (e negativi) comporta una sottigliezza importante. La funzione esponenziale è iniettiva sulla retta reale; cioè exp (a) = exp (b) implica a = b. Questo non è così sul piano complesso. Poiché exp (2 * pi * i) = 1, la funzione esponenziale è 2 * pi * i-periodico.

Questo porta al problema: quale ramo della funzione log usiamo? domanda Said è una delle questioni centrali di analisi complessa.

Python sta rispondendo in modo intelligente a questa situazione. Se non si utilizza esplicitamente il costruttore numero complesso, che si sta per essere il traffico di reali. Dal momento che le potenze frazionarie di negativi sono mai reale, Python è opportunamente un'eccezione.

Dal titolo di questo post indicando che il potenza è negativo, è possibile che in realtà voleva 1,3 -1.07 , piuttosto che - 1.07 1,3

Poteri di basi negative sono numeri complessi. Ecco un esempio che spiega come risolvere il problema:

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top