2015-07-17 9 views
0

Я пытаюсь вычислить области с помощью scipy.integrate.dblquad, но я просто не понимаю, этот результат (интеграл окружности с радиусом 1):оценка Площадь с scipy.integrate.dblquad

import scipy.integrate as integ 

def cercle(x,y): 
    if x**2+y**2<=1 : return 1 
    else : return 0 


In [12]: integ.dblquad(cercle, -1,1, lambda y: -1,lambda y:1) 
Out[12]: (1.5248947619635096, 4.083599258741799e-08) 

Почему я не получить нужную область?

ответ

2

Работы «OKish» здесь, но, вероятно, могли бы использовать лучшую рутину.

питон 2.7.9

SciPy 0.14.1

>>> def c(x,y): 
...  if x**2+y**2<=1: 
...   return 1 
...  else: 
...   return 0 
... 
>>> c(2,2) 
0 
>>> c(.5,.5) 
1 
>>> from scipy.integrate import dblquad 
>>> dblquad(c, -1, 1, lambda y: -1, lambda y:1) 
/usr/lib/python2.7/dist-packages/scipy/integrate/quadpack.py:321: 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) 
(3.1421278363209537, 0.0002045333175209052) 
>>> 
0

я получить ожидаемый ответ, когда я запускаю свой код.

>>> def cercle(x,y): 
...  if x**2+y**2<=1 : return 1 
...  else : return 0 
... 
>>> integ.dblquad(cercle, -1,1, lambda y: -1,lambda y:1) 
(3.1421278363209537, 0.0002045333175209052) 

Проверьте код, который вы запускали изначально; если у вас есть опечатка в одном из аргументов, это может объяснить вашу ошибку. Например, изменение первого предела интеграции на .1 вместо -1 приводит к:

>>> integ.dblquad(cercle, .1,1, lambda y: -1,lambda y:1) 
(1.3711257717509415, 5.8123454403774075e-05)