web-dev-qa-db-fra.com

ValueError: erreur de domaine mathématique

Je viens de tester un exemple de Méthodes numériques en ingénierie avec 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)

Quand je le lance, il affiche l'erreur suivante:

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

Je l'ai réduit au journal comme lorsque je supprime le journal et ajoute une fonction différente, cela fonctionne. Je suppose que c'est à cause d'une sorte d'interférence avec la base, je ne peux pas comprendre comment. Quelqu'un peut-il proposer une solution?

79
ramanunni.pm

Votre code fait une log d'un nombre inférieur ou égal à zéro. C'est mathématiquement indéfini, donc la fonction log de Python soulève une exception. Voici un exemple:

>>> from math import log
>>> log(-1)
Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    log(-1)
ValueError: math domain error

Sans savoir ce que fait votre fonction newtonRaphson2, je ne suis pas sûr de pouvoir deviner d'où vient la valeur x[2] invalide, mais j'espère que cela vous mènera sur la bonne voie.

96
Blckknght

Vous essayez de faire un logarithme de quelque chose qui n’est pas positif.

Les logarithmes déterminent la base après avoir reçu un numéro et la puissance à laquelle elle a été augmentée. log(0) signifie que quelque chose élevé à la puissance de 2 est 0. Un exposant ne peut jamais aboutir à 0 *, ce qui signifie que log(0) n'a pas de réponse, jetant ainsi le math domain error

* Remarque: 0^0 peut entraîner 0, mais peut également entraîner 1 en même temps. Ce problème est largement débattu.

0
Eric Xue

J'ai continué à avoir une erreur similaire. Cela ressemble à un problème matplotlib. Le redémarrage de ma session ipython a résolu le problème pour moi.

~/uqing/forreal100/analysis.py in corrf(a, nam1, nam2)
     60    plt.axis('equal')
     61    plt.title(r'$\rho^2 = %f$' % a.corr()['second']['des'] ** 2)
---> 62    plt.savefig(nam1 + nam2 + '.pdf')
     63    plt.clf()
     64    plt.close('all')

/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/pyplot.py in savefig(*args, **kwargs)
    695 def savefig(*args, **kwargs):
    696     fig = gcf()
--> 697     res = fig.savefig(*args, **kwargs)
    698     fig.canvas.draw_idle()   # need this if 'transparent=True' to reset colors
    699     return res

/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/figure.py in savefig(self, *args, **kwargs)
   1570             self.set_frameon(frameon)
   1571 
-> 1572         self.canvas.print_figure(*args, **kwargs)
   1573 
   1574         if frameon:

/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/backend_bases.py in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs)
   2242                 orientation=orientation,
   2243                 bbox_inches_restore=_bbox_inches_restore,
-> 2244                 **kwargs)
   2245         finally:
   2246             if bbox_inches and restore_bbox:

/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/backends/backend_pdf.py in print_pdf(self, filename, **kwargs)
   2523                 RendererPdf(file, image_dpi, height, width),
   2524                 bbox_inches_restore=_bbox_inches_restore)
-> 2525             self.figure.draw(renderer)
   2526             renderer.finalize()
   2527         finally:

/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     61     def draw_wrapper(artist, renderer, *args, **kwargs):
     62         before(artist, renderer)
---> 63         draw(artist, renderer, *args, **kwargs)
     64         after(artist, renderer)
     65 

/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/figure.py in draw(self, renderer)
   1141 
   1142             mimage._draw_list_compositing_images(
-> 1143                 renderer, self, dsu, self.suppressComposite)
   1144 
   1145             renderer.close_group('figure')

/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, dsu, suppress_composite)
    137     if not_composite or not has_images:
    138         for zorder, a in dsu:
--> 139             a.draw(renderer)
    140     else:
    141         # Composite any adjacent images together

/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     61     def draw_wrapper(artist, renderer, *args, **kwargs):
     62         before(artist, renderer)
---> 63         draw(artist, renderer, *args, **kwargs)
     64         after(artist, renderer)
     65 

/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/axes/_base.py in draw(self, renderer, inframe)
   2345             self.apply_aspect(pos)
   2346         else:
-> 2347             self.apply_aspect()
   2348 
   2349         artists = self.get_children()

/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/axes/_base.py in apply_aspect(self, position)
   1463         if aspect_scale_mode == "log":
   1464             dL = self.dataLim
-> 1465             dL_width = math.log10(dL.x1) - math.log10(dL.x0)
   1466             dL_height = math.log10(dL.y1) - math.log10(dL.y0)
   1467             xr = 1.05 * dL_width

ValueError: math domain error
0
kilojoules