ValueError: ошибка математического домена

102

Я просто тестировал пример из « Численных методов в разработке с 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)

Когда я запускаю его, он показывает следующую ошибку:

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

Я сузил его до журнала, поскольку, когда я удаляю журнал и добавляю другую функцию, он работает. Я предполагаю, что это из-за какого-то вмешательства в базу, я не могу понять как. Кто-нибудь может предложить решение?

ramanunni.pm
источник

Ответы:

131

Ваш код выполняет 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]значение, но, надеюсь, это приведет вас на правильный путь.

Blckknght
источник
Я не понимаю, как это делает отрицательный журнал, поскольку определение определяет набор уравнений, то есть x [0], x [1] и x [2] - это переменные x, y и z, которые использует Ньютон Рафсон. . Эта система уравнений необходима для решения.
ramanunni.pm
1
Кроме того, как я говорю, x [2] = 1.0, когда я определяю x в приведенном выше коде, log (1) = 0, по крайней мере, это то, что я, хотя, возможно, я ошибаюсь .. Спасибо за помощь ..
ramanunni .pm
1
добавьте a print xв начало вашей функции f . Вы увидите, как решатель уравнений последовательно пробует разные значения x, что приводит к вашей ошибке.
mtadd 08
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

вы получаете ошибку математической области по одной из причин: либо вы пытаетесь использовать отрицательное число внутри функции журнала, либо нулевое значение.

Физика3067
источник