如何在SymPy中简化不同比例的单位

时间:2018-02-07 10:28:13

标签: sympy

sympy.physics.units个相同的单位中,当它们在方程中使用时会自动简化。但是,当单位是相同维度的不同比例时,它们不会自动简化。例如:

from sympy.physics.units import *

(5000 * gram) / (2 * gram)
# 2500

(5 * kilogram) / (2 * gram)
# (5 * kilogram) / (2 * gram)

5 * gram + 1 * kilogram
# 5*gram + kilogram

5 * gram + 1000 * gram
# 1005*gram

1000*liter/(5000*liter)
# 1/5

1000*liter/(5*meter**3)
# 200*liter/meter**3

是否有一种简单的方法可以强制进行单位简化,至少在单位是同一维度的不同比例的情况下?

我正在寻找与在所有单位上使用.subs()相同的效果,只是自动使用表达式中已包含的信息,相当于

((5 * kilogram) / (2 * gram)).subs({gram: gram, kilogram: 1000 * gram, ...})

1 个答案:

答案 0 :(得分:1)

规模问题可以通过单位制的print_unit_base方法来解决。例如,

from sympy.physics.units.systems import MKS
expr = (5 * kilogram) / (2 * gram)
new_expr = expr.xreplace({q: MKS.print_unit_base(q) for q in expr.atoms(Quantity)})

现在new_expr是2500.

使用的更简单的函数是convert_to(expr, kilogram)(也返回2500),但这取决于知道质量单位是一个问题。 print_unit_base统一了给定单位系统的所有单位。

使用liter,因为它不是真正的前缀米立方体,我们需要convert_to

expr2 = 1000*liter/(5*meter**3)
convert_to(expr2, meter)     #  1/5