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

Я звузив його до журналу, оскільки коли я виймаю журнал і додаю іншу функцію, він працює. Я припускаю, що це через якесь втручання в базу, я не можу зрозуміти, як це зробити. Чи може хтось запропонувати рішення?

Відповіді:


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]походить недійсне значення, але, сподіваємось, це приведе вас до правильного шляху.


Я не бачу, як це робить негативний журнал, оскільки визначення визначає набір рівнянь, тобто 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
додайте a print xна початок своєї функції f . Ви побачите, як розв'язувач рівнянь послідовно намагається застосовувати різні значення х, що призводить до вашої помилки.
mtadd

3
У моїх випадках проблема полягала в тому, що аргумент не був негативним, але точно рівним 0, що призводить до того ж винятку (що може бути дивно для людей з фоном JS, де Math.log (0) - просто-нескінченність)
qbolec

1

Ви намагаєтеся зробити логарифм чогось, що не є позитивним.

Логарифми з'ясовують основу після того, як їй дали число і потужність, на яку він був підвищений. log(0)означає , що що - то зведений в силу 2IS 0. Експонент ніколи не може призвести до 0*, а це означає, що log(0)немає відповіді, таким чином, кидаючи наmath domain error

* Примітка: 0^0може призвести 0, але може призвести 1і одночасно. Ця проблема дуже важко сперечається.


1

Ви також можете використовувати math.log1p.

Відповідно до офіційної документації :

math.log1p (x)

Поверніть природний логарифм 1 + x (основа е). Результат обчислюється таким чином, що є точним для x біля нуля.

Ви можете перетворити назад у початкове значення, використовуючи math.expm1повернення, eпідвищені до потужності x, мінус 1.


0

ви отримуєте математичну помилку домену з будь-якої причини: або ви намагаєтесь використовувати негативне число у функції журналу, або нульове значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.