SymPy: Как вернуть выражение в терминах других выражений? - PullRequest
4 голосов
/ 10 января 2010

Я довольно новичок в SymPy и у меня есть вопрос, который может быть основным. Или я могу просто неверно истолковать, как предполагается использовать SymPy.

Есть ли способ создать выражение, которое представлено не атомами, а комбинацией других выражений?

Пример:

>>> from sympy.physics.units import *
>>> expr1 = m/s
>>> expr2 = mile/hour
>>> expr1
m/s
>>> expr2
1397*m/(3125*s)
>>> expr1.in_terms_of([mile,hour]) #in my dreams?
3125*mile/(1397*hour)
>>> 

Примечание: могу ли я найти «официальную» PDF-версию (или другую версию для печати) полной документации по SymPy? (У меня драконовские ограничения на использование Интернета на работе, и я устал работать дома в выходные дни.)

Обновление:

Это то, что я закончил, следуя совету Прелюдии, но вряд ли он получит много пользы, как этот, потому что он кажется грязным. Комментарии и приветствие WTF.

def in_terms_of(self, terms):
    expr2 = eval(str(self), physics.units.__dict__)
    converter = {}
    for term in terms:
        term_expr = physics.units.__dict__[term]
        coeff = term_expr.as_coeff_terms()[0]
        unit = physics.units.Unit('my_'+term, term)
        converter[term_expr/coeff] = unit/coeff
    return str(expr2.subs(converter))

Использование:

>>> x = in_terms_of('J',['gram','mile','hour'])
>>> x
'9765625000*mile**2*gram/(1951609*hour**2)'
>>> in_terms_of(x,['J'])
'J'

Ответы [ 3 ]

2 голосов
/ 11 января 2010

Проверяя источник для sympy.physics.units , вы можете увидеть, что все единицы измерения выражены в метрах, килограммах, секундах, амперах, кельвинах, молях и канделах. Это базовые единицы.

Тогда миля определяется как 5280 футов, а нога - 0,3048 метра.

Таким образом, все выражения, использующие неосновные единицы, заменят неосновные единицы базовыми единицами.

Вы можете определить свои собственные единицы, которые вы можете заменить в выражении, когда вам нужно выражение для использования определенных единиц:

import sympy.physics.units as units
from sympy import Rational

my_mile = units.Unit('my_mile', 'mile')
my_hour = units.Unit('my_hour', 'hour')

Затем определите словарь, который заменит базовые единицы для ваших новых единиц.

converter = {units.m: my_mile/Rational('1609.344'),
             units.s: my_hour/Rational('3600')}

Выполните все ваши расчеты, используя базовые единицы. Затем, если вы хотите получить значение, используя мили и часы, вы можете подставить новые выражения в выражение.

v = 10*units.miles/units.hour
print v # = 2794*m/(625*s)

print v.subs(converter) # = 10*mile/hour

Используйте ответ ars для получения документов. Репозиторий Sympy находится здесь: https://github.com/sympy/sympy

В папке docs есть файл README, в котором описано, как создавать HTML-документы.

2 голосов
/ 11 января 2010

есть также количество :

In [1]: from quantities import *
In [2]: v = 1397*m / (3125*s)
In [3]: v
Out[3]: array(0.44704) * m/s
In [8]: v.units = mile/hour
In [9]: v
Out[9]: array(1.0) * mi/h
1 голос
/ 11 января 2010

В единицах симпй вы переводите из expr1 в expr2 путем деления:

In [120]: import sympy.physics.units as units

In [121]: expr1 = units.m / units.s

In [122]: expr2 = units.miles / units.hour

In [123]: a = (1397/3125) * expr1 / expr2

In [124]: a
Out[124]: 1

Единственная проблема заключается в том, что вы получите безразмерное количество. Вы могли бы также рассмотреть пакет Количества для этого типа вещи:

In [125]: import quantities as pq

In [126]: a = pq.Quantity(1397/3125, 'm/s')

In [127]: a
Out[127]: array(0.44703999999999999) * m/s

In [128]: a.units = pq.mile / pq.hour

In [129]: a
Out[129]: array(1.0) * mi/h

Там также Unum .

Я не знаю PDF-версию симпози документации, но вы можете проверить дистрибутив из их репозитория и использовать Sphinx, чтобы сгенерировать PDF для себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...