Sympy和电气系统的单位

时间:2015-08-09 16:32:38

标签: python sympy units-of-measurement

有没有办法强制Sympy将伏特打印为伏特而不是将其作为SI单位的组合返回?

MWE:

>>> import sympy.physics.units as u
>>> V = 5 * u.V
>>> print(V)
5*kg*m**2/(A*s**3)

修改

正如@rfkortekaas指出的那样,我可以使用

定义新单位
V = u.Unit('V','V')

他的建议真正解决了一方面的问题。但是,如果我使用

>>> I = 0.5 * u.A
>>> R = 100 * u.ohm
>>> V_R = I * R
>>> V_R
50.0*kg*m**2/(A*s**3)

我仍然需要将V_R识别为“V”(电压)

编辑2

感谢@rfkortekaas仍然帮助我解决这个问题,现在我有:

>>> V = u.Unit('V', 'V')
>>> ohm = u.Unit('ohm = V/u.A', '\Omega')
>>> R = (10 * V) / (0.5 * u.A)
>>> R
20.0*V/A
>>> V_R = (0.5 * u.A) * (10 * ohm)
>>> V_R
5.0*A*\Omega

即。 V/AA*\Omega分别被识别为ohm和'V'。

2 个答案:

答案 0 :(得分:2)

所有的交流单位都将成为S.I.基本单位。因此,根据S.I。

,所有派生单位将表示为基本单位的压缩

基本单位由单位类别形成:sympy.physics.units.Unit('ampere','A')。

所有衍生单位将通过基础(或衍生)单位的数学运算形成。

要按照您的方式定义,您可以按以下方式执行此操作: Ampère已经是一个基本单位,因此可以使用。 将伏特定义为单位('伏特','V')。并将欧姆定义为安培伏特的偏差。

不幸的是,将伏特,安培和欧姆都作为基本单位放在一起并获得每个单元的正确单位是不可能实现的。这是由于派生为基本单位的组成。

答案 1 :(得分:0)

就在这里分享我如何解决自己的问题。下面的类包含一系列有趣的单元,然后可以使用该列表从Sympy中解析单元。

from sympy.physics import units as u

class Electric:
    units = {}
    units[u.V] = 'V'
    units[u.W] = 'W'
    units[u.A] = 'A' 
    units[u.Hz] = 'Hz'
    units[u.percent] = '\%'
    units[u.F] = 'F'
    units[u.s] = 's'
    units[u.ohm] = '\Omega'

    @classmethod
    def identify_unit(cls, value):
        for unit in cls.units.keys():
            aux = value.as_coefficient(unit)
            if aux:
                if aux.is_number:
                    return aux, cls.units[unit]
        return value

    @classmethod
    def change_factor(cls, value):
        aux = abs(value[0])
        if aux >= u.mega:
            return value[0] / (10 ** 6), "M" + value[1]
        elif aux >= u.kilo:
            return value[0] / (10 ** 3), "k" + value[1]
        elif aux >= 1:
            return value[0], value[1]
        elif aux >= u.milli:
            return value[0] * (10 ** 3), "m" + value[1]
        elif aux >= u.micro:
            return value[0] * (10 ** 6), "\mu{}" + value[1]
        else:
            return value

使用示例:

>>> V_R = 2 * u.V
>>> print(V_R)
2*kg*m**2/(A*s**3)
>>> print(Electric.identify_unit(V_R))
(2, 'V')
>>> I_R = 1 * u.milli * u.A
>>> print(I_R)
A/1000
>>> print(Electric.identify_unit(I_R))
(1/1000, 'A')
>>> R = V_R / I_R
>>> print(R)
2000*kg*m**2/(A**2*s**3)
>>> a = Electric.identify_unit(R)
>>> print(a)
(2000, '\\Omega')
>>> b = Electric.change_factor(a)
>>> print(b)
(2.00000, 'k\\Omega')