SymPy вытаскивает Floats, чтобы сделать такие выражения каноническими. Вы можете вернуть его с помощью
>>> a, b = eq.args
>>> sqrt(a**2*b.args[0], evaluate=0)
sqrt(1.88379173728726*x0**2 + 1.07691441805435*x1)
Вы можете создать функцию, которая канонически ставит любое буквальное число под радикал с помощью
def unfactor_radicals(eq):
"""put leading numbers in Mul under a radical, if possible
Examples
========
>>> from sympy import sqrt, root
>>> from sympy.abc import x
>>> eq = -7.2*root(x, 3)**4 + 3*x*sqrt(1/x)
>>> unfactor_radicals(eq)
-(4.39540980178165*x)**(4/3) + x*sqrt(9/x)
"""
from sympy import Pow, UnevaluatedExpr
def do(m):
args = m.args
c = args[0]
m = args[1:]
if c < 0:
s = -1
c = -c
else:
s = 1
rad = next(ordered([i for i in m if i.is_Pow and i.exp.is_Rational and i.exp.is_Integer is False]))
i = m.index(rad)
p = Pow(c**(1/rad.exp)*rad.base, rad.exp, evaluate=False)
return s*UnevaluatedExpr(m.func(*(m[:i]+(p,)+m[i+1:]), evaluate=False))
return eq.replace(
lambda x: x.is_Mul and x.args[0].is_Number and any(
i.is_Pow and i.exp.is_Rational and i.exp.is_Integer is False
for i in x.args),
lambda x: do(x))
Однако она создает UnevaluatedExpr, а я этого не делаю знаю, сколько неприятностей это создаст ... но может дать некоторые идеи.