Я использую пакет 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