ValueError: wiskundige domeinfout

Ik was net een voorbeeld aan het testen van Numerical Methods in Engineering with 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)

Als ik het uitvoer, wordt de volgende fout weergegeven:

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

Ik heb het teruggebracht tot het logboek, want als ik het logboek verwijder en een andere functie toevoeg, werkt het. Ik neem aan dat het komt door een soort van interferentie met de basis, ik weet niet hoe. Kan iemand een oplossing voorstellen?


Antwoord 1, autoriteit 100%

Je code maakt een logvan een getal dat kleiner is dan of gelijk is aan nul. Dat is wiskundig niet gedefinieerd, dus de functie logvan Python genereert een uitzondering. Hier is een voorbeeld:

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

Zonder te weten wat uw newtonRaphson2-functie doet, weet ik niet zeker waar de ongeldige x[2]-waarde vandaan komt, maar hopelijk leidt dit ertoe je op de goede weg.


Antwoord 2

U kunt ook math.log1pgebruiken.

Volgens de officiële documentatie:

math.log1p(x)

Retourneer de natuurlijke logaritme van 1+x (grondtal e). Het resultaat
wordt berekend op een manier die nauwkeurig is voor x bijna nul.

Je kunt terug naar de oorspronkelijke waarde converteren met behulp van math.expm1wat eteruggeeft tot de macht x, min 1.


Antwoord 3

u krijgt een wiskundige domeinfout om een van de volgende redenen:
of je probeert een negatief getal in de logfunctie te gebruiken of een nulwaarde.


Antwoord 4

Je probeert een logaritme te maken van iets dat niet positief is.

Logaritmen bepalen de basis nadat ze een getal hebben gekregen en de macht waartoe deze is verheven. log(0)betekent dat iets met de macht 20is. Een exponent kan nooit resulteren in 0*, wat betekent dat log(0)geen antwoord heeft, waardoor de math domain error

*Opmerking: 0^0kan resulteren in 0, maar kan tegelijkertijd ook resulteren in 1. Dit probleem is zwaar bediscussieerd.

Other episodes