ValueError: kesalahan domain matematika

102

Saya baru saja menguji contoh dari Metode Numerik dalam Teknik dengan 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)

Ketika saya menjalankannya, itu menunjukkan kesalahan berikut:

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

Saya telah mempersempitnya ke log seperti ketika saya menghapus log dan menambahkan fungsi yang berbeda, itu berhasil. Saya berasumsi itu karena semacam gangguan dengan pangkalan, saya tidak tahu caranya. Adakah yang bisa menyarankan solusi?

ramanunni.pm
sumber

Jawaban:

131

Kode Anda melakukan logangka yang kurang dari atau sama dengan nol. Itu tidak terdefinisi secara matematis, jadi logfungsi Python memunculkan pengecualian. Berikut contohnya:

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

Tanpa mengetahui apa newtonRaphson2fungsi Anda, saya tidak yakin saya bisa menebak dari mana nilai yang tidak valid x[2]itu berasal, tapi mudah-mudahan ini akan membawa Anda ke jalur yang benar.

Blckknght
sumber
Saya tidak melihat bagaimana caranya melakukan log negatif karena definisi mendefinisikan himpunan persamaan, yaitu, x [0], x [1] dan x [2] adalah variabel x, y dan z yang digunakan Newton Raphson . Ini membutuhkan kumpulan persamaan ini untuk diselesaikan.
ramanunni.pm
1
Juga, seperti yang saya katakan x [2] = 1.0 ketika saya mendefinisikan x dalam kode di atas, log (1) = 0, setidaknya itu yang saya pikirkan, mungkin saya salah .. Terima kasih atas bantuannya ..
ramanunni .pm
1
tambahkan a print xke awal fungsi Anda f . Anda akan melihat bagaimana pemecah persamaan secara berturut-turut mencoba nilai x yang berbeda, yang mengarah ke kesalahan Anda.
mtadd
3
Dalam kasus saya, masalahnya adalah argumennya tidak negatif, tetapi persis sama dengan 0, yang mengarah ke pengecualian yang sama (yang mungkin mengejutkan bagi orang-orang dengan latar belakang JS, di mana Math.log (0) hanya -Infinity)
qbolec
1

Anda mencoba melakukan logaritma dari sesuatu yang tidak positif.

Logaritma mencari tahu basis setelah diberi nomor dan kekuatannya dinaikkan. log(0)berarti bahwa sesuatu yang dipangkatkan 2adalah 0. Eksponen tidak pernah bisa menghasilkan 0*, yang berarti log(0)tidak ada jawaban, sehingga membuangmath domain error

* Catatan: 0^0bisa menghasilkan 0, tapi bisa juga menghasilkan 1pada saat bersamaan. Masalah ini sangat diperdebatkan.

Eric Xue
sumber
1

Anda juga dapat menggunakan math.log1p.

Menurut dokumentasi resmi :

math.log1p (x)

Kembalikan logaritma natural dari 1 + x (basis e). Hasilnya dihitung dengan cara yang akurat untuk x mendekati nol.

Anda dapat mengonversi kembali ke nilai asli menggunakan math.expm1yang mengembalikan epangkat x, minus 1.

Catalina Chircu
sumber
0

Anda mendapatkan kesalahan domain matematika karena salah satu alasannya: Anda mencoba menggunakan angka negatif di dalam fungsi log atau nilai nol.

Fisika 3067
sumber