Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Pourquoi ce code affiche (nan,nan). Calcul approchée d'une intégrale avec scipy

+3 votes
import numpy as np
from scipy import integrate.quad

lnth= lambda x:np.log((np.exp(2*x)-1)/(np.exp(2*x)+1))

I=integrate.quad(lnth,0,np.inf)

Je cherche à calculer l'intégrale sur [0,+infini[ de ln(th(x))

demandé 5-Jun-2015 par anonyme
edité 5-Jun-2015 par max

Quand j'execute ton code dans ipython, j'ai ce warning qui apparait :

In [1]: import numpy as np
In [2]: from scipy.integrate import quad
In [3]: lnth= lambda x:np.log((np.exp(2*x)-1)/(np.exp(2*x)+1))
In [4]: I=quad(lnth,0,np.inf)
/Users/jc/.virtualenvs/sandbox/bin/ipython:1: RuntimeWarning: overflow encountered in exp
  #!/Users/jc/.virtualenvs/sandbox/bin/python
/Users/jc/.virtualenvs/sandbox/bin/ipython:1: RuntimeWarning: invalid value encountered in double_scalars
  #!/Users/jc/.virtualenvs/sandbox/bin/python
/Users/jc/.virtualenvs/sandbox/lib/python2.7/site-packages/scipy/integrate/quadpack.py:352: IntegrationWarning: The maximum number of subdivisions (50) has been achieved.
  If increasing the limit yields no improvement it is advised to analyze
  the integrand in order to determine the difficulties.  If the position of a
  local difficulty can be determined (singularity, discontinuity) one will
  probably gain from splitting up the interval and calling the integrator
  on the subranges.  Perhaps a special-purpose integrator should be used.
  warnings.warn(msg, IntegrationWarning)

Peut être un élément de réponse sur SO

1 Réponse

+7 votes

pas besoin de mettre l'infini pour avoir la réponse, la convergence de l'intégrale est assez rapide

In [17]: integrate.quad(lnth,0,10)
Out[17]: (-1.2337005480750163, 6.393374718527411e-11)

In [18]: integrate.quad(lnth,0,100)
Out[18]: (-1.233700550136171, 1.5423625709942712e-08)

In [20]: integrate.quad(lnth,0,350)
Out[20]: (-1.2337005501361706, 1.6285206516641892e-09)

par contre, quand tu augmentes les bornes, à partir d'un moment tu ne rajoutes que de l'erreur numérique, qui se cumule, et ton résultats n'auras pas de sens (les méthodes numériques sont une discipline à part entière...)

d'autre part, j'ai eu ce message d'erreur en essayant :

 In [19]: integrate.quad(lnth,0,1000)
 Out[19]: /usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py:295: 
 UserWarning: The occurrence of roundoff error is detected, which prevents the 
 requested tolerance from being achieved.  The error may be underestimated.

en allant voir le code, on constate qu'est renvoyé la dernière valeur calculée, qui est donc celle qui fait lever l'erreur...

répondu 5-Jun-2015 par Lhassa (798 points)
...