ValueError: errore del dominio matematico


102

Stavo solo testando un esempio da Numerical Methods in Engineering con 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)

Quando lo eseguo, mostra il seguente errore:

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

L'ho ristretto al registro poiché quando rimuovo il registro e aggiungo una funzione diversa, funziona. Presumo sia a causa di una sorta di interferenza con la base, non riesco a capire come. Qualcuno può suggerire una soluzione?

Risposte:


131

Il tuo codice sta facendo un lognumero che è minore o uguale a zero. È matematicamente indefinito, quindi la logfunzione di Python solleva un'eccezione. Ecco un esempio:

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

Senza sapere cosa fa la tua newtonRaphson2funzione, non sono sicuro di poter indovinare da dove x[2]proviene il valore non valido , ma spero che questo ti porti sulla strada giusta.


Non vedo come stia facendo un log negativo poiché la definizione definisce l'insieme di equazioni, cioè x [0], x [1] e x [2] sono variabili x, yez che Newton Raphson usa . Ha bisogno di questo insieme di equazioni per essere risolto.
ramanunni.pm

1
Inoltre, come sto dicendo x [2] = 1.0 quando definisco x nel codice sopra, log (1) = 0, almeno questo è quello che ho
pensato

1
aggiungi una print xall'inizio della tua funzione f . Vedrai come il risolutore di equazioni prova successivamente diversi valori di x, portando al tuo errore.
mtadd

3
Nei miei casi il problema era che l'argomento non era negativo, ma esattamente uguale a 0, il che porta alla stessa eccezione (che potrebbe essere sorprendente per le persone con background JS, dove Math.log (0) è semplicemente -Infinity)
qbolec

1

Stai cercando di fare un logaritmo di qualcosa che non è positivo.

I logaritmi determinano la base dopo aver ricevuto un numero e la potenza a cui è stata elevata. log(0)significa che qualcosa elevato al potere di 2è 0. Un esponente non può mai risultare in 0*, il che significa che log(0)non ha risposta, quindi lancia ilmath domain error

* Nota: 0^0può risultare in 0, ma può anche risultare nello 1stesso momento. Questo problema è molto dibattuto.


1

Puoi anche usare math.log1p.

Secondo la documentazione ufficiale :

math.log1p (x)

Restituisce il logaritmo naturale di 1 + x (base e). Il risultato è calcolato in modo accurato per x vicino allo zero.

Puoi riconvertire al valore originale usando math.expm1che ritorna eelevato alla potenza x, meno 1.


0

stai ricevendo un errore di dominio matematico per uno dei motivi: o stai tentando di utilizzare un numero negativo all'interno della funzione di registro o un valore zero.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.