ValueError: lỗi miền toán học


102

Tôi chỉ đang thử nghiệm một ví dụ từ Phương pháp số trong Kỹ thuật với 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)

Khi tôi chạy nó, nó hiển thị lỗi sau:

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

Tôi đã thu hẹp nó vào nhật ký vì khi tôi xóa nhật ký và thêm một chức năng khác, nó hoạt động. Tôi cho rằng đó là do một số loại can thiệp với đế, tôi không thể tìm ra cách. Bất cứ ai có thể đề xuất một giải pháp?

Câu trả lời:


131

Mã của bạn đang thực hiện một logsố nhỏ hơn hoặc bằng 0. Điều đó không được xác định về mặt toán học, vì vậy loghàm của Python tạo ra một ngoại lệ. Đây là một ví dụ:

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

Không biết newtonRaphson2chức năng của bạn làm gì, tôi không chắc mình có thể đoán được x[2]giá trị không hợp lệ đến từ đâu, nhưng hy vọng điều này sẽ dẫn bạn đi đúng hướng.


Tôi không hiểu nó hoạt động như thế nào đối với nhật ký âm vì định nghĩa đang xác định tập phương trình, tức là x [0], x [1] và x [2] là các biến x, y và z mà Newton Raphson sử dụng . Nó cần những tập hợp các phương trình để giải quyết.
ramanunni.pm

1
Ngoài ra, như tôi đang nói x [2] = 1.0 khi tôi xác định x trong đoạn mã trên, log (1) = 0, ít nhất đó là những gì tôi mặc dù, có thể tôi đã sai .. Mặc dù vậy, cảm ơn sự giúp đỡ ..
ramanunni .pm

1
thêm a print xvào đầu hàm f của bạn . Bạn sẽ thấy cách người giải phương trình thử liên tiếp các giá trị khác nhau của x, dẫn đến lỗi của bạn.
mtadd

3
Trong trường hợp của tôi, vấn đề là đối số không âm, nhưng chính xác bằng 0, dẫn đến cùng một ngoại lệ (điều này có thể gây ngạc nhiên cho những người có nền tảng JS, trong đó Math.log (0) chỉ đơn giản là-Vô cực)
qbolec

1

Bạn đang cố gắng tính logarit của một điều gì đó không tích cực.

Logarit tìm ra cơ số sau khi được cho một số và lũy thừa mà nó được nâng lên. log(0)có nghĩa là một cái gì đó được nâng lên sức mạnh của 20. Một số mũ không bao giờ có thể cho kết quả là 0*, có nghĩa là log(0)không có câu trả lời, do đómath domain error

* Lưu ý: 0^0có thể dẫn đến 0, nhưng cũng có thể dẫn đến 1đồng thời. Vấn đề này được tranh cãi rất nhiều.


1

Bạn cũng có thể sử dụng math.log1p.

Theo tài liệu chính thức :

math.log1p (x)

Trả về lôgarit tự nhiên của 1 + x (cơ số e). Kết quả được tính theo cách chính xác cho x gần bằng không.

Bạn có thể chuyển đổi trở lại giá trị ban đầu bằng cách sử dụng giá trị math.expm1này eđược nâng lên lũy thừa x, trừ đi 1.


0

bạn đang gặp lỗi miền toán học vì một trong hai lý do: bạn đang cố sử dụng số âm bên trong hàm nhật ký hoặc giá trị bằng không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.