2013-04-08 24 views
64

Stavo testando un esempio da Metodi numerici in ingegneria con Python.ValueError: errore del dominio matematico

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

ho ristretto la scelta per il registro come quando rimuovo registro e aggiungi una funzione diversa, funziona. Presumo che sia a causa di una sorta di interferenza con la base, non riesco a capire come. Qualcuno può suggerire una soluzione?

risposta

79

Il codice sta eseguendo un log di un numero inferiore o uguale a zero. Questo è matematicamente indefinito, quindi la funzione log 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 che cosa la vostra funzione newtonRaphson2 lo fa, io non sono sicuro di poter indovinare dove il valore non valido x[2] sta venendo, ma spero che questo vi condurrò sulla strada giusta.

+0

Non vedo come sta facendo un log negativo poiché la definizione sta definendo l'insieme di equazioni, cioè x [0], x [1] e x [2] sono variabili x, yez che Newton Raphson utilizza. Ha bisogno di queste serie di equazioni da risolvere. –

+0

Inoltre, come sto dicendo x [2] = 1.0 quando definisco x nel codice sopra, log (1) = 0, atleast è quello che penso, forse ho torto .. Grazie per l'aiuto però .. –

+1

aggiungi un 'print x' all'inizio della tua funzione ** f **. Vedrai come il risolutore dell'equazione prova successivamente diversi valori di x, portando al tuo errore. – mtadd