Właśnie testowałem przykład z Numerical Methods in Engineering w Pythonie .
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)
Po uruchomieniu pokazuje następujący błąd:
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
Zawęziłem to do dziennika, ponieważ kiedy usuwam dziennik i dodam inną funkcję, działa. Zakładam, że jest to spowodowane jakąś ingerencją w podstawę, nie wiem, jak to zrobić. Czy ktoś może zaproponować rozwiązanie?
python
runtime-error
logarithm
ramanunni.pm
źródło
źródło
print x
na początku swojej funkcji f . Zobaczysz, jak narzędzie do rozwiązywania równań kolejno próbuje różnych wartości x, co prowadzi do błędu.Próbujesz obliczyć logarytm czegoś, co nie jest dodatnie.
Logarytmy obliczają podstawę po otrzymaniu liczby i potęgi, do której została podniesiona.
log(0)
oznacza, że coś podniesionego do potęgi2
jest0
. Wykładnik nigdy nie może dać znaku0
*, co oznacza, żelog(0)
nie ma odpowiedzi, dlatego rzucamath domain error
* Uwaga:
0^0
może skutkować0
, ale może również skutkować w1
tym samym czasie. Ten problem jest mocno dyskutowany.źródło
Możesz także użyć
math.log1p
.Według oficjalnej dokumentacji :
Możesz przekonwertować z powrotem na pierwotną wartość, używając
math.expm1
której zwracae
podniesioną do potęgi x minus 1.źródło
otrzymujesz błąd domeny matematycznej z jednego z powodów: albo próbujesz użyć liczby ujemnej wewnątrz funkcji dziennika, albo wartości zerowej.
źródło