Симпи не будет упрощать или расширять экспоненциальную с десятичными - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь упростить огромное выражение степеней n, и один из результатов выброса симпатии a (n + 1) ^ 1.0, я заметил, что

f=n*((n+1)**1.0) sympy.expand(f)

не работает, он остается прежним, вместо того, чтобы давать n ^ 2 + n, поэтому мне было интересно, есть ли способ выполнить что-то подобное

1 Ответ

0 голосов
/ 20 января 2019

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)
...