ValueError: matematik alan hatası


102

Python ile Mühendislikte Numerical Methods'dan bir örneği test ediyordum .

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)

Çalıştırdığımda aşağıdaki hatayı gösteriyor:

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

Günlüğü kaldırıp farklı bir işlev eklediğimde olduğu gibi günlüğe daralttım, işe yarıyor. Sanırım üsse bir tür müdahale yüzünden, nasıl olduğunu anlayamıyorum. Birisi çözüm önerisi sunabilir mi?

Yanıtlar:


131

Kodunuz bir yapıyor log sıfırdan küçük veya sıfıra eşit bir sayı . Bu matematiksel olarak tanımlanmamış, bu yüzden Python'un logişlevi bir istisna yaratıyor. İşte bir örnek:

>>> 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İşlevinizin ne yaptığını bilmeden , geçersiz x[2]değerin nereden geldiğini tahmin edemiyorum , ancak umarım bu sizi doğru yola yönlendirir.


Tanım denklem setini tanımladığı için negatif logu nasıl yaptığını anlamıyorum, yani x [0], x [1] ve x [2] Newton Raphson'ın kullandığı x, y ve z değişkenleridir . Çözmek için bu denklem setine ihtiyacı var.
ramanunni.pm

1
Ayrıca, yukarıdaki kodda x'i tanımladığımda x [2] = 1.0 dediğim gibi, log (1) = 0, en azından öyle düşünüyorum, belki yanılıyorum .. Yine de yardım için teşekkürler ..
ramanunni .pm

1
print xişlevinizin başına a ekleyin f . Denklem çözücünün nasıl art arda farklı x değerleri denediğini ve hatanıza yol açtığını göreceksiniz.
mtadd

3
Benim durumumda sorun, argüman negatif değil, tam olarak 0'a eşitti, bu da aynı istisnaya yol
açıyordu

1

Olumlu olmayan bir şeyin logaritmasını yapmaya çalışıyorsunuz.

Logaritmalar, bir sayı verildikten sonra tabanı ve yükseltildiği gücü anlar. log(0)şey kuvvetine yükseltilen demekse 2DİR 0. Bir üs hiçbir zaman 0* ile sonuçlanamaz , yani log(0)cevabı yoktur, dolayısıylamath domain error

* Not: 0^0sonuçlanabilir 0, ancak aynı zamanda da sonuçlanabilir 1. Bu sorun ağır bir şekilde tartışılıyor.


1

Ayrıca kullanabilirsiniz math.log1p.

Göre resmi belgeler :

math.log1p (x)

1 + x'in (e tabanının) doğal logaritmasını döndür. Sonuç, sıfıra yakın x için doğru olacak şekilde hesaplanır.

X, eksi 1 kuvvetine yükseltilen math.expm1döndürmeyi kullanarak orijinal değere geri dönüştürebilirsiniz e.


0

Ya günlük fonksiyonunun içinde negatif bir sayı ya da sıfır değeri kullanmaya çalışıyorsunuz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.