代码之家  ›  专栏  ›  技术社区  ›  Paul

sympy:如何用其他表达式返回表达式?

  •  4
  • Paul  · 技术社区  · 16 年前

    我对 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)
    >>> 
    

    旁注:我能找到完整的sympy文档的“官方”PDF(或其他可打印)版本吗?(我在工作时受到严格的互联网使用限制,周末在家工作已经厌倦了。)

    更新:

    这就是我按照序曲的建议所结束的,但是它不太可能得到这样的用途,因为它感觉脏。欢迎发表评论。

    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 回复  |  直到 9 年前
        1
  •  2
  •   Aaron N. Brock    9 年前

    正在检查源 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文件夹中有一个自述文件,描述了如何创建HTML文档。

        2
  •  2
  •   Autoplectic    16 年前

    还有 quantities :

    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
    
        3
  •  1
  •   ars    16 年前

    在sympy单位中,通过除以下项从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
    

    唯一的问题是你最终得到的是一个无量纲的量。你也可以考虑 Quantities 此类物品的包装:

    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 .

    我不知道sympy文档的PDF版本,但是您可以从它们的存储库中查看分发并使用 Sphinx to generate a PDF 为你自己。

    推荐文章