ValueError: ข้อผิดพลาดของโดเมนคณิตศาสตร์


106

ฉันเป็นเพียงการทดสอบตัวอย่างจากวิธีเชิงตัวเลขในงานวิศวกรรมกับงูหลาม

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)

เมื่อฉันรันมันแสดงข้อผิดพลาดต่อไปนี้:

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

ฉันได้ จำกัด มันให้แคบลงในบันทึกเมื่อฉันลบบันทึกและเพิ่มฟังก์ชันอื่นมันใช้งานได้ ฉันคิดว่ามันเป็นเพราะการรบกวนบางอย่างกับฐานฉันไม่สามารถเข้าใจได้ว่าเป็นอย่างไร ใครช่วยแนะนำวิธีแก้ไข

คำตอบ:


136

รหัสของคุณกำลังทำlogตัวเลขที่น้อยกว่าหรือเท่ากับศูนย์ นั่นไม่ได้กำหนดไว้ในทางคณิตศาสตร์ดังนั้นlogฟังก์ชันของ Python จึงมีข้อยกเว้น นี่คือตัวอย่าง:

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

โดยไม่ทราบว่าnewtonRaphson2ฟังก์ชันของคุณทำหน้าที่อะไรฉันไม่แน่ใจว่าฉันสามารถเดาได้ว่าx[2]ค่าที่ไม่ถูกต้องมาจากไหน แต่หวังว่าสิ่งนี้จะนำคุณไปสู่การติดตามที่ถูกต้อง


ฉันไม่เห็นว่ามันทำบันทึกเชิงลบอย่างไรเนื่องจากคำจำกัดความกำลังกำหนดชุดของสมการนั่นคือ x [0], x [1] และ x [2] เป็นตัวแปร x, y และ z ที่ Newton Raphson ใช้ . มันต้องการชุดสมการเหล่านี้ในการแก้
ramanunni.pm

1
อย่างที่บอก x [2] = 1.0 เมื่อฉันกำหนด x ในโค้ดด้านบน log (1) = 0 อย่างน้อยที่สุดก็คือสิ่งที่ฉันคิดบางทีฉันอาจจะผิด .. ขอบคุณสำหรับความช่วยเหลือว่า ..
ramanunni .pm

1
เพิ่มprint xไปยังจุดเริ่มต้นของฟังก์ชั่นของคุณฉ คุณจะได้เห็นว่าตัวแก้สมการพยายามหาค่า x ที่แตกต่างกันอย่างไรซึ่งนำไปสู่ข้อผิดพลาดของคุณ
mtadd

3
ในกรณีของฉันปัญหาคืออาร์กิวเมนต์ไม่ใช่ค่าลบ แต่เท่ากับ 0 ซึ่งนำไปสู่ข้อยกเว้นเดียวกัน (ซึ่งอาจน่าแปลกใจสำหรับคนที่มีพื้นหลัง JS โดยที่ Math.log (0) เป็นเพียง -Infinity)
qbolec

1

คุณกำลังพยายามหาลอการิทึมของสิ่งที่ไม่เป็นบวก

ลอการิทึมหาฐานหลังจากได้รับตัวเลขและกำลังเพิ่มขึ้นเป็น log(0)หมายความว่าบางสิ่งบางอย่างยกกำลังของมี2 0เลขชี้กำลังไม่สามารถทำให้เกิด0* ได้ซึ่งหมายความว่าlog(0)ไม่มีคำตอบจึงโยนmath domain error

* หมายเหตุ: 0^0สามารถส่งผลได้0แต่ยังสามารถส่งผลใน1เวลาเดียวกันได้ ปัญหานี้เป็นที่ถกเถียงกันอย่างหนัก


1

math.log1pนอกจากนี้คุณยังอาจจะใช้

ตามเอกสารอย่างเป็นทางการ :

math.log1p (x)

ส่งคืนลอการิทึมธรรมชาติของ 1 + x (ฐาน e) ผลลัพธ์คำนวณด้วยวิธีที่แม่นยำสำหรับ x ใกล้ศูนย์

คุณสามารถแปลงกลับเป็นค่าเดิมโดยใช้math.expm1ซึ่งส่งคืนeยกกำลัง x ลบ 1


0

คุณได้รับข้อผิดพลาดโดเมนคณิตศาสตร์จากสาเหตุใดสาเหตุหนึ่ง: คุณกำลังพยายามใช้ตัวเลขติดลบในฟังก์ชันบันทึกหรือค่าศูนย์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.