Sympy TypeError - не может интерпретировать объект с плавающей запятой как целое число - PullRequest
1 голос
/ 17 июня 2020

Я использую пакет Sympy и пытаюсь выполнить интеграцию, для этого я написал небольшую функцию:

from sympy import *
from __future__ import division
init_printing()
x, Rn = symbols('x Rn')
def minimum(k):
    expr = (x**(k/2-1)*exp(-x/2))/(2**(k/2)*gamma(k/2))
    linkes_int = integrate(x*expr,(x,0,Rn))
    rechtes_int = integrate(Rn*expr,(x,Rn,oo))
    minimum1 = linkes_int + rechtes_int
    return(minimum1,linkes_int,rechtes_int)
ergebnis = minimum(6)

Теперь при вызове метода с четным параметром 6 или выше я получаю сообщение TypeError что объект с плавающей запятой не может быть интерпретирован как целое число. Я не уверен, почему это так, тем более, что это только для k> = 6. Еще один вопрос, который у меня есть: есть ли возможность задавать границы символам в Sympy? Что-то вроде этого должно быть больше нуля или целое число или что-то в этом роде?

Моя ошибка:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-1a7d2848e620> in <module>()
      7     return(minimum1,linkes_int,rechtes_int)
      8 k = Symbol("k", properties = [lambda s: (s/2).is_Integer])
----> 9 ergebnis = minimum(6)
     10 #ergebnis[0]
     11 asd = simplify(ergebnis[0])

<ipython-input-4-1a7d2848e620> in minimum(k)
      2 def minimum(k):
      3     expr = (x**(k/2-1)*exp(-x/2))/(2**(k/2)*gamma(k/2))
----> 4     linkes_int = integrate(x*expr,(x,1,Rn))
      5     rechtes_int = integrate(Rn*expr,(x,Rn,oo))
      6     minimum1 = linkes_int + rechtes_int

C:\ProgramData\Anaconda3\lib\site-packages\sympy\integrals\integrals.py in integrate(*args, **kwargs)
   1293     if isinstance(integral, Integral):
   1294         return integral.doit(deep=False, meijerg=meijerg, conds=conds,
-> 1295                              risch=risch, manual=manual)
   1296     else:
   1297         return integral

C:\ProgramData\Anaconda3\lib\site-packages\sympy\integrals\integrals.py in doit(self, **hints)
    484                     function, xab[0],
    485                     meijerg=meijerg1, risch=risch, manual=manual,
--> 486                     conds=conds)
    487                 if antideriv is None and meijerg1 is True:
    488                     ret = try_meijerg(function, xab)

C:\ProgramData\Anaconda3\lib\site-packages\sympy\integrals\integrals.py in _eval_integral(self, f, x, meijerg, risch, manual, conds)
    906                 # rewrite using G functions
    907                 try:
--> 908                     h = meijerint_indefinite(g, x)
    909                 except NotImplementedError:
    910                     from sympy.integrals.meijerint import _debug

C:\ProgramData\Anaconda3\lib\site-packages\sympy\integrals\meijerint.py in meijerint_indefinite(f, x)
   1610     results = []
   1611     for a in sorted(_find_splitting_points(f, x) | {S(0)}, key=default_sort_key):
-> 1612         res = _meijerint_indefinite_1(f.subs(x, x + a), x)
   1613         if not res:
   1614             continue

C:\ProgramData\Anaconda3\lib\site-packages\sympy\integrals\meijerint.py in _meijerint_indefinite_1(f, x)
   1675         if b < 0 or f.subs(x, 0).has(nan, zoo):
   1676             place = None
-> 1677         r = hyperexpand(r.subs(t, a*x**b), place=place)
   1678 
   1679         # now substitute back

C:\ProgramData\Anaconda3\lib\site-packages\sympy\simplify\hyperexpand.py in hyperexpand(f, allow_hyper, rewrite, place)
   2471         if not r.has(nan, zoo, oo, -oo):
   2472             return r
-> 2473     return f.replace(hyper, do_replace).replace(meijerg, do_meijer)

C:\ProgramData\Anaconda3\lib\site-packages\sympy\core\basic.py in replace(self, query, value, map, simultaneous, exact)
   1406             return expr
   1407 
-> 1408         rv = bottom_up(self, rec_replace, atoms=True)
   1409 
   1410         # restore original expressions for Dummy symbols

C:\ProgramData\Anaconda3\lib\site-packages\sympy\simplify\simplify.py in bottom_up(rv, F, atoms, nonbasic)
    997             if args != rv.args:
    998                 rv = rv.func(*args)
--> 999             rv = F(rv)
   1000         elif atoms:
   1001             rv = F(rv)

C:\ProgramData\Anaconda3\lib\site-packages\sympy\core\basic.py in rec_replace(expr)
   1391             result = _query(expr)
   1392             if result or result == {}:
-> 1393                 new = _value(expr, result)
   1394                 if new is not None and new != expr:
   1395                     mapping[expr] = new

C:\ProgramData\Anaconda3\lib\site-packages\sympy\core\basic.py in <lambda>(expr, result)
   1334                 _value = lambda expr, result: value(*expr.args)
   1335             elif callable(value):
-> 1336                 _value = lambda expr, result: value(*expr.args)
   1337             else:
   1338                 raise TypeError(

C:\ProgramData\Anaconda3\lib\site-packages\sympy\simplify\hyperexpand.py in do_meijer(ap, bq, z)
   2468     def do_meijer(ap, bq, z):
   2469         r = _meijergexpand(G_Function(ap[0], ap[1], bq[0], bq[1]), z,
-> 2470                    allow_hyper, rewrite=rewrite, place=place)
   2471         if not r.has(nan, zoo, oo, -oo):
   2472             return r

C:\ProgramData\Anaconda3\lib\site-packages\sympy\simplify\hyperexpand.py in _meijergexpand(func, z0, allow_hyper, rewrite, place)
   2345 
   2346     t = Dummy('t')
-> 2347     slater1, cond1 = do_slater(func.an, func.bm, func.ap, func.bq, z, z0)
   2348 
   2349     def tr(l):

C:\ProgramData\Anaconda3\lib\site-packages\sympy\simplify\hyperexpand.py in do_slater(an, bm, ap, bq, z, zfinal)
   2279                 premult = (t/k)**bh
   2280                 hyp = _hyperexpand(Hyper_Function(nap, nbq), harg, ops,
-> 2281                                    t, premult, bh, rewrite=None)
   2282                 res += fac * hyp
   2283             else:

C:\ProgramData\Anaconda3\lib\site-packages\sympy\simplify\hyperexpand.py in _hyperexpand(func, z, ops0, z0, premult, prem, rewrite)
   2002     # Try to recognise a shifted sum.
   2003     p = S(0)
-> 2004     res = try_shifted_sum(func, z0)
   2005     if res is not None:
   2006         func, nops, p = res

C:\ProgramData\Anaconda3\lib\site-packages\sympy\simplify\hyperexpand.py in try_shifted_sum(func, z)
   1656 
   1657     ops = []
-> 1658     for n in range(r - 1):
   1659         ops.append(ShiftA(n + 1))
   1660     ops.reverse()

TypeError: 'Float' object cannot be interpreted as an integer

1 Ответ

2 голосов
/ 17 июня 2020

Проблема в следующем интеграле:

In [59]: Integral(0.0625*x**3.0*exp(-x/2), (x, 0, Rn))                                                                                                        
Out[59]: 
Rn                    
⌠                     
⎮               -x    
⎮               ───   
⎮          3.0   2    
⎮  0.0625⋅x   ⋅ℯ    dx
⌡                     
0                     

Это должно быть хорошо, но sympy выдает ошибку TypeError. Это просто ошибка в sympy:

In [60]: Integral(0.0625*x**3.0*exp(-x/2), (x, 0, Rn)).doit()                                                                                                 
---------------------------------------------------------------------------
TypeError 

Однако ошибка видна только тогда, когда на входе есть числа с плавающей запятой, и эти числа с плавающей запятой не нужны:

In [61]: nsimplify(Integral(0.0625*x**3.0*exp(-x/2), (x, 0, Rn)))                                                                                             
Out[61]: 
Rn           
⌠            
⎮      -x    
⎮      ───   
⎮   3   2    
⎮  x ⋅ℯ      
⎮  ─────── dx
⎮     16     
⌡            
0            

In [62]: nsimplify(Integral(0.0625*x**3.0*exp(-x/2), (x, 0, Rn))).doit()                                                                                      
Out[62]: 
                              -Rn     
                              ────    
⎛    3       2             ⎞   2      
⎝- Rn  - 6⋅Rn  - 24⋅Rn - 48⎠⋅ℯ        
────────────────────────────────── + 6
                8 

Самое простое решение - для обозначения целого числа 6: ergebnis = minimum(S(6))

...