Sympy расширит ваше выражение, как и ожидалось, когда число является целым числом. Если сила хранится как рациональная или с плавающей точкой, она не будет работать. Вы можете либо переписать выражение с помощью целых чисел, либо написать некоторый код, который будет автоматически проверять, хранит ли число с плавающей точкой целое число (с точностью до ошибки числовой точности), и действовать соответствующим образом.
Вот отправная точка для этого:
def rewrite_polynomial(p):
args_list = []
if not p.is_Mul:
return None
for m in p.args:
if not m.is_Pow:
args_list.append(m)
else:
pow_val = m.args[1]
if pow_val.is_Float:
pow_val_int = int(pow_val)
if pow_val.epsilon_eq(pow_val_int):
args_list.append(Pow(m.args[0],Integer(pow_val_int)))
else:
args_list.append(m)
else:
args_list.append(m)
return Mul(*args_list)
n = Symbol('n')
f= n*((n+1)**1.0)
g = rewrite_polynomial(f)
print(g)