2013-04-08 42 views
64

Tôi vừa thử nghiệm một ví dụ từ Phương pháp số trong Kỹ thuật với Python.ValueError: lỗi tên miền toán học

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ó cho thấy các 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ó xuống để đăng nhập như khi tôi loại bỏ bản ghi và thêm một chức năng khác nhau, nó hoạt động. Tôi cho rằng đó là do một số loại giao thoa với cơ sở, tôi không thể hiểu được làm thế nào. Bất cứ ai có thể đề xuất một giải pháp?

Trả lời

79

Mã của bạn đang thực hiện một số log của số nhỏ hơn hoặc bằng 0. Đó là toán học không xác định, vì vậy hàm log của Python làm tăng một ngoại lệ. Dưới đâ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 

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

+0

Tôi không thấy cách thực hiện nhật ký tiêu cực vì định nghĩa xác định tập hợp phương trình, nghĩa là x [0], x [1] và x [2] là các biến x, y và z Newton Raphson sử dụng. Nó cần những bộ phương trình này để giải quyết. –

+0

Ngoài ra, như tôi đang nói x [2] = 1.0 khi tôi xác định x trong mã ở trên, đăng nhập (1) = 0, ít nhất đó là những gì tôi mặc dù, có lẽ tôi sai .. Cảm ơn sự giúp đỡ mặc dù .. –

+1

thêm một 'in x' vào đầu hàm của bạn ** f **. Bạn sẽ thấy cách trình giải phương trình tiếp tục thử các giá trị khác nhau của x, dẫn đến lỗi của bạn. – mtadd