ValueError: गणित डोमेन त्रुटि


102

मैं सिर्फ पायथन के साथ इंजीनियरिंग में न्यूमेरिकल मेथड्स से एक उदाहरण का परीक्षण कर रहा था ।

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

मैंने इसे लॉग तक सीमित कर दिया है क्योंकि जब मैं लॉग हटाता हूं और एक अलग फ़ंक्शन जोड़ता है, तो यह काम करता है। मुझे लगता है कि यह आधार के साथ किसी प्रकार के हस्तक्षेप के कारण है, मैं यह पता नहीं लगा सकता कि कैसे। क्या कोई समाधान सुझा सकता है?

जवाबों:


131

आपका कोड एक logऐसी संख्या कर रहा है जो शून्य से कम या उसके बराबर है। यह गणितीय रूप से अपरिभाषित है, इसलिए पायथन का logकार्य एक अपवाद को जन्म देता है। यहाँ एक उदाहरण है:

>>> 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 हैं जो न्यूटन रैपसन उपयोग करता है । इसे हल करने के लिए समीकरणों के इन सेट की जरूरत है।
रामानुन्नी .pm

1
इसके अलावा, जैसा कि मैं x [2] = 1.0 कह रहा हूं जब मैं x को ऊपर दिए गए कोड में परिभाषित करता हूं, तो लॉग (1) = 0, कम से कम यह है कि मैं हालांकि, शायद मैं गलत हूं .. हालांकि मदद के लिए धन्यवाद ..
ramanunni .pm

1
print xअपने फ़ंक्शन की शुरुआत में जोड़ें f । Youll देखने के लिए कैसे समीकरण solver क्रमिक रूप से एक्स के विभिन्न मूल्यों की कोशिश करता है, अपनी त्रुटि के लिए अग्रणी।
mtadd

3
मेरे मामलों में समस्या यह थी कि तर्क नकारात्मक नहीं था, लेकिन ठीक 0 के बराबर था, जो एक ही अपवाद की ओर जाता है (जो JS पृष्ठभूमि वाले लोगों के लिए आश्चर्यचकित हो सकता है, जहां Math.log (0) सरलता से है)
qbolec

1

आप ऐसी चीज़ का लघुगणक करने की कोशिश कर रहे हैं जो सकारात्मक नहीं है।

लॉगरिम्स ने एक संख्या और उस शक्ति को प्राप्त करने के बाद आधार का पता लगाया। log(0)इसका मतलब है कि कुछ करने की शक्ति 2है 0। एक घातांक कभी भी परिणाम नहीं दे सकता है 0, जिसका अर्थ है कि log(0)इसका कोई जवाब नहीं है, इस प्रकार फेंकनाmath domain error

* नोट: में 0^0परिणाम कर सकते हैं 0, लेकिन 1एक ही समय में भी परिणाम कर सकते हैं । इस समस्या पर भारी तर्क दिया जाता है।


1

आप भी उपयोग कर सकते हैं math.log1p

आधिकारिक दस्तावेज के अनुसार :

math.log1p (एक्स)

1 + x (बेस ई) के प्राकृतिक लघुगणक लौटें। परिणाम की गणना एक तरह से की जाती है जो कि शून्य के निकट x के लिए सटीक है।

आप मूल मान में परिवर्तित कर सकते हैं, math.expm1जिसका उपयोग करके eपावर x, माइनस 1 में दिए गए रिटर्न को बढ़ा सकते हैं।


0

आपको या तो एक कारण के लिए गणित डोमेन त्रुटि मिल रही है: या तो आप लॉग फ़ंक्शन के अंदर एक नकारात्मक संख्या या शून्य मान का उपयोग करने का प्रयास कर रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.