电力系统的Sympy和单位

2024-06-11 12:01:40 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法强迫Sympy把伏特打印成伏特,而不是返回为国际单位制?在

MWE:

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

编辑

用新的单位定义单位

^{pr2}$

他的建议确实从一个侧面解决了问题。但是如果我使用

>>> 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/A或{}分别被识别为ohm和'V'。在


Tags: import编辑unit单位国际unitssympykg
2条回答

就在这里分享我是如何解决自己的问题的。下面的类包含一个感兴趣的单元列表,然后可以使用该列表解析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

使用示例:

^{pr2}$

所有交响乐团都将组成S.I.基地单位。因此,根据S.I

基本单位由单位类构成:物理物理单元.单位(“安培”,“A”)。

所有派生单元都将通过对基(或派生)单元的数学运算形成。

要按您的方式定义,可以按如下方式进行: 安培已经是一个基本单位,所以可以使用。 将伏特定义为单位(“伏特”,“V”)。把欧姆定义为伏特除以安培。

不幸的是,把伏特、安培和欧姆都作为基本单位,并为它们找到正确的单位是不可能实现的。这是由于所导出的基元的组成。

相关问题 更多 >