Я просто тестировал пример из « Численных методов в разработке с 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
Я сузил его до журнала, поскольку, когда я удаляю журнал и добавляю другую функцию, он работает. Я предполагаю, что это из-за какого-то вмешательства в базу, я не могу понять как. Кто-нибудь может предложить решение?
python
runtime-error
logarithm
ramanunni.pm
источник
источник
print x
в начало вашей функции f . Вы увидите, как решатель уравнений последовательно пробует разные значения x, что приводит к вашей ошибке.Вы пытаетесь логарифмировать что-то отрицательное.
Логарифмы определяют основание после того, как им дано число и степень, до которой оно было возведено.
log(0)
означает, что нечто возведено в степень2
есть0
. Показатель никогда не может привести к0
*, что означает, что уlog(0)
него нет ответа, поэтомуmath domain error
* Примечание:
0^0
может привести к0
, но также может привести1
к. По поводу этой проблемы много споров.источник
Вы также можете использовать
math.log1p
.Согласно официальной документации :
Вы можете преобразовать обратно к исходному значению, используя
math.expm1
которое возвращаетсяe
в степени x минус 1.источник
вы получаете ошибку математической области по одной из причин: либо вы пытаетесь использовать отрицательное число внутри функции журнала, либо нулевое значение.
источник