Я получил уравнение симпи из библиотеки. Он широко использует log2, но вывод был преобразован в log(x)/log(2)
. Это затрудняет чтение результатов.
Я хотел бы, чтобы Sympy снова упростил это уравнение, сосредоточив внимание на непосредственном использовании log2, где это возможно.
Как это можно сделать?
Пример:
(log(A) / log(2)) * (log(B + C) / log(2))
По сути, вы можете просто обратить процесс вспять: заменить log(w)
на log(2) * log2(w)
и позволить Sympy отменить все факторы log(2) / log(2)
.
Единственная проблема в том, что вы не хотите заменять, когда найдете log(2)
, но это достаточно легко. Вы просто используете подстановочный знак и проверяете, является ли совпавшее значение буквально 2
, прежде чем выполнять замену:
import sympy
from sympy import log
from sympy.codegen.cfunctions import log2
A, B, C = sympy.symbols("A, B, C")
w = sympy.Wild("w")
expr = (log(A) / log(2)) * (log(B + C) / log(2))
expr.replace(log(w), lambda w: log(2) if w==2 else log(2)*log2(w))
Результат
log2(A)*log2(B + C)
что правильно.
[H/T @ThomasWeller за нахождение log2
в кодегене.]
Очевидно, он знает о log2 и даже есть причины предпочесть это