1

В this answer объясняется, как избежать args быть отсортированы по классам SymPy как Mul, Add и так далее.SymPy, можно заставить класс остаться на левой или на правой стороне выражения

Для нового созданного класса like this one explained here он может перейти к правой стороне, когда умножается на sympy.core.numbers.Float, sympy.core.numbers.Pi или sympy.core.numbers.Integer, например, давая:

print D(x) * 1. 
1.0*D(x) 

Исходное выражение дает 0. при оценке, в то время как новый дает D(x).

Для того, чтобы этот дифференциальный оператор, чтобы работать должным образом, она должна остаться на левой стороне:

print D(x) * 1. 
D(x)*1.0 

Есть ли скрытый параметр, как _op_priority для изменения __mul__() приоритета, который говорит SymPy типа, который остается больше влево или вправо?

+1

Вопрос в порядке сам по себе, но если вы используете его для создания дифференциального оператора, вы, вероятно, делаете это неправильно. Прежде всего, использование умножения для дифференциальных операторов является непоследовательным злоупотреблением обозначением. Кроме того, такой подход не может четко представлять вложенные дифференциальные операторы или суммы констант и дифференциальных операторов и т. Д. Более того, дифференциальные операторы уже реализованы в модуле 'diffgeom'. – Krastanov

+0

благодарим вас за комментарий! У меня много проблем с использованием этого дифференциального оператора, но он работает до сих пор. Вы знаете, как заставить данный класс оставаться на левой/правой стороне в SymPy? –

+1

Я не знаю достаточно деталей, чтобы написать это как ответ, но вы можете попытаться использовать 'commutative = False'. Мне очень не нравится этот подход и надеюсь, что в какой-то будущей версии sympy это будет удалено (таких планов нет), но если вы знаете, что делаете, продолжайте и попробуйте. – Krastanov

ответ

1

Умножение на Mul не работает так, как вы ожидаете.

Во-первых, заказ на печать не имеет ничего общего. Если это все, о чем вы заботитесь, вы можете изменить его, изменив принтер.

Вместо этого вы должны посмотреть на объект .args. Но даже здесь это не имеет значения. Когда вы умножаете что-то путем умножения, оно не «применяет» каждое умножение в том порядке, в котором оно видно. Скорее, он создает новый объект Mul со всеми объединенными аргументами (конечно, в случае commutative=False аргументы сохраняются в порядке). Mul не вызывает никаких специальных подтекстов на этих объектах. Это функция, которую мы хотим (см. https://code.google.com/p/sympy/issues/detail?q=1941&id=1941 и https://github.com/sympy/sympy/wiki/Canonicalization), но пока это не сделано.

Смежные вопросы